版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 計(jì)算機(jī)工程學(xué)院</b></p><p> 《嵌入式系統(tǒng)原理》課程設(shè)計(jì)報(bào)告 </p><p><b> 觸摸屏控制實(shí)驗(yàn)設(shè)計(jì)</b></p><p> 學(xué)生姓名: </p><p> 學(xué) 號(hào):
2、 </p><p> 指導(dǎo)教師: </p><p> 班 級(jí): </p><p> 完成時(shí)間: 2012年5月10日 </p><p><b> 目 錄</b></p><p><b> 1. 要求
3、0</b></p><p><b> 1.1設(shè)計(jì)目的1</b></p><p> 1.2 設(shè)計(jì)意義1</p><p> 1.3 設(shè)計(jì)內(nèi)容1</p><p> 1.4 主要任務(wù)1</p><p><b> 2. 正文2</b></p>
4、;<p> 2.1觸摸屏工作原理(觸摸屏接口工作模式)2</p><p> 2.2、設(shè)計(jì)總體方案3</p><p> 2.3、設(shè)計(jì)所需工具6</p><p> 2.4、平臺(tái)構(gòu)建過(guò)程6</p><p> 2.4.1、硬件平臺(tái)搭建6</p><p> 2.4.2根文件系統(tǒng)的制作8<
5、;/p><p> ?。?)根文件系統(tǒng)8</p><p><b> 3. 程序13</b></p><p> 3.1.程序流程圖:13</p><p> 3.2.分析驅(qū)動(dòng)13</p><p> 3.2.1、觸摸屏設(shè)備驅(qū)動(dòng)中數(shù)據(jù)結(jié)構(gòu)13</p><p> 3.2
6、.2、觸摸屏驅(qū)動(dòng)模塊加載和卸載函數(shù)15</p><p> 3.2.3、觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)17</p><p> 3.2.4、觸摸屏設(shè)備驅(qū)動(dòng)的輪詢與異步通知17</p><p> 3.2.5源程序觸摸屏驅(qū)動(dòng)代碼:18</p><p> 3.2.6、實(shí)驗(yàn)結(jié)果顯示:29</p><p><b>
7、; 4. 心得30</b></p><p> 4.1 課程設(shè)計(jì)心得體會(huì):30</p><p> 5. 參考文獻(xiàn)32</p><p> 5.1【參考文獻(xiàn)】32</p><p> 6. 附錄………………………………………………………………………………33</p><p><b>
8、第一章 要求</b></p><p><b> 1.1 設(shè)計(jì)目的</b></p><p> ?。?)基于WINDOWS操作系統(tǒng),以及實(shí)驗(yàn)箱,利用觸摸屏返回觸點(diǎn)坐標(biāo)值及動(dòng)作信息。</p><p> ?。?)坐標(biāo)及動(dòng)作的具體顯示:觸摸筆動(dòng)作,觸點(diǎn)X坐標(biāo)值,觸點(diǎn)Y坐標(biāo)值。</p><p><b> 1
9、.2 設(shè)計(jì)意義</b></p><p> (1)熟悉嵌入式系統(tǒng)開發(fā)平臺(tái)</p><p> (2)掌握ARM嵌入式操作系統(tǒng)下的各個(gè)指令的使用方法</p><p> (3)了解觸摸屏的原理</p><p><b> 1.3 設(shè)計(jì)內(nèi)容</b></p><p> (1)系統(tǒng)的正確移植
10、和使用</p><p> (2)根文件系統(tǒng)的正確移植和使用</p><p> (3)驅(qū)動(dòng)程序的編譯與裝載</p><p> (4)嵌入式系統(tǒng)下應(yīng)用程序的交叉編譯及下載與調(diào)試</p><p><b> 1.4 主要任務(wù)</b></p><p> (1)熟悉實(shí)驗(yàn)的流程</p>
11、<p> (2)理解驅(qū)動(dòng)程序源代碼</p><p> (3)調(diào)用驅(qū)動(dòng)程序的某些函數(shù),編譯與調(diào)試應(yīng)用程序</p><p><b> 第二章 正文</b></p><p> 2.1觸摸屏工作原理(觸摸屏接口工作模式)</p><p> ?。?)普通轉(zhuǎn)換模式 </p><p> 普通
12、轉(zhuǎn)換模式(AUTO_PST = 0,XY_PST = 0)是用作一般目的下的ADC轉(zhuǎn)換。這個(gè)模式可以通過(guò)設(shè)置ADCCON和ADCTSC來(lái)進(jìn)行對(duì)AD轉(zhuǎn)換的初始化;而后讀取ADCDAT0(ADC數(shù)據(jù)寄存器0)的XPDATA域(普通ADC轉(zhuǎn)換)的值來(lái)完成轉(zhuǎn)換。 </p><p> ?。?)分離的X/Y軸坐標(biāo)轉(zhuǎn)換模式:X軸坐標(biāo)轉(zhuǎn)換和Y軸坐標(biāo)轉(zhuǎn)換。 </p><p> X軸坐標(biāo)轉(zhuǎn)換(AUTO_PS
13、T=0且XY_PST=1)將X軸坐標(biāo)轉(zhuǎn)換數(shù)值寫入到ADCDAT0寄存器的XPDATA域。轉(zhuǎn)換后,觸摸屏接口將產(chǎn)生中斷源(INT_ADC)到中斷控制器。 </p><p> Y軸坐標(biāo)轉(zhuǎn)換(AUTO_PST=0且XY_PST=2)將X軸坐標(biāo)轉(zhuǎn)換數(shù)值寫入到ADCDAT1寄存器的YPDATA域。轉(zhuǎn)換后,觸摸屏接口將產(chǎn)生中斷源(INT_ADC)到中斷控制器。 </p><p> ?。?)自動(dòng)(連續(xù)
14、)X/Y軸坐標(biāo)轉(zhuǎn)換模式。 </p><p> 自動(dòng)(連續(xù))X/Y軸坐標(biāo)轉(zhuǎn)換模式(AUTO_PST=1且XY_PST= 0)以下面的步驟工作: </p><p> 觸摸屏控制器將自動(dòng)地切換X軸坐標(biāo)和Y軸坐標(biāo)并讀取兩個(gè)坐標(biāo)軸方向上的坐標(biāo)。觸摸屏控制器自動(dòng)將測(cè)量得到的X軸數(shù)據(jù)寫入到ADCDAT0寄存器的XPDATA域,然后將測(cè)量到的Y軸數(shù)據(jù)到ADCDAT1的YPDATA域。自動(dòng)(連續(xù))轉(zhuǎn)換之
15、后,觸摸屏控制器產(chǎn)生中斷源(INT_ADC)到中斷控制器。 </p><p> (4)等待中斷模式 </p><p> 當(dāng)觸摸屏控制器處于等待中斷模式下時(shí),它實(shí)際上是在等待觸摸筆的點(diǎn)擊。在觸摸筆點(diǎn)擊到觸摸屏上時(shí),控制器產(chǎn)生中斷信號(hào)(INC_TC)。中斷產(chǎn)生后,就可以通過(guò)設(shè)置適當(dāng)?shù)霓D(zhuǎn)換模式(分離的X/Y軸坐標(biāo)轉(zhuǎn)換模式或自動(dòng)X/Y軸坐標(biāo)轉(zhuǎn)換模式)來(lái)讀取X和Y的位置。 </p>
16、<p> ?。?)靜態(tài)(Standby)模式 </p><p> 當(dāng)ADCCON寄存器的STDBM位被設(shè)為1時(shí),Standby模式被激活。在該模式下,A/D轉(zhuǎn)換操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持著先前轉(zhuǎn)換所得的值。 </p><p> 2.2、設(shè)計(jì)總體方案</p><p><b
17、> 2.2.1 軟件</b></p><p> ?。?)Embest Online Flash Programmer For ARM: Embest Flash在線編程器</p><p> ?。?)HYPER TERMINAL(超級(jí)終端):傳送vivi.nand; </p><p> 傳送vivi.nand</p><p&
18、gt; vivi> load flash kernel x <回車> 燒寫更新內(nèi)核,傳送zImage文件; </p><p><b> 等待傳送內(nèi)核文件</b></p><p><b> 傳送內(nèi)核:</b></p><p> vivi>load flash root j <回車>
19、; 燒寫更新文件系統(tǒng);</p><p> 燒寫新的文件系統(tǒng) load flash root j </p><p> (3) EmbestIDE Pro for ARM: </p><p> 應(yīng)用于嵌入式軟件開發(fā)的新一代集成開發(fā)環(huán)境,是一個(gè)高度集成的圖形界面操作環(huán)境,包含編輯器、編譯匯編鏈接器、調(diào)試器、工程管理、Flash 編程等工具;支持的開發(fā)語(yǔ)言包括
20、標(biāo)準(zhǔn)C和匯編語(yǔ)言。</p><p> ?。?)cygwin:</p><p> 一個(gè)在windows平臺(tái)上運(yùn)行的unix模擬環(huán)境,它對(duì)于學(xué)習(xí)unix/linux操作環(huán)境,或者從unix到windows的應(yīng)用程序移植,或者進(jìn)行某些特殊的開發(fā)工作,尤其是使用gnu工具集在windows上進(jìn)行嵌入式系統(tǒng)開發(fā),把gcc,gdb,gas等開發(fā)工具進(jìn)行了改進(jìn),能夠生成并解釋win32的目標(biāo)文件。&l
21、t;/p><p><b> 硬件</b></p><p> S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,32位微控制器。該處理器擁有:獨(dú)立的16KB指令Cache和16KB數(shù)據(jù)Cache,MMU,支持TFT的LCD控制器,NAND閃存控制器,3路UART,4路DMA,4路帶PWM的Timer ,I/O口,RTC,8路10位ADC,T
22、ouch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2個(gè)USB主機(jī),1個(gè)USB設(shè)備,SD主機(jī)和MMC接口,2路SPI。S3C2410處理器最高可運(yùn)行在203MHz。</p><p> 2.3、設(shè)計(jì)所需工具</p><p> 2.3.1 軟件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超級(jí)終端),Em
23、bestIDE Pro for ARM,cygwin</p><p> 硬件:s3c2410開發(fā)板,Embest實(shí)驗(yàn)箱</p><p> 2.4、平臺(tái)構(gòu)建過(guò)程</p><p> 2.4.1、硬件平臺(tái)搭建</p><p><b> 硬件流程圖:</b></p><p> (1) Vivi燒
24、寫過(guò)程</p><p> 1)首先把SW104斷開,F(xiàn)lash Programmer的Program,在File選擇Open打開要燒寫的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program頁(yè)中選擇要燒寫的文件vivi.bon&load.bin。點(diǎn)擊按鈕 Progarm 開始燒寫,直到燒寫成功</p><p>
25、2) 連接串口線到 PC 機(jī) COM1,運(yùn)行光盤中提供的 Windows 超級(jí)終端Hyper Terminal.ht 把開發(fā)板重新加電,程序運(yùn)行后,在超級(jí)終端上可以看到串口輸出Wating,表示正在等待用戶從超級(jí)終端下載文件。這時(shí),請(qǐng)點(diǎn)擊超級(jí)終端菜單"傳送"選擇 Xmodem 方式下載 vivi.nand 文件,點(diǎn)擊 OK 后等待下載燒寫結(jié)束即可。</p><p> (2) 內(nèi)核zImage
26、燒寫</p><p> 1) 首先SW104設(shè)為短接(從Nand Flash啟動(dòng)),并確定已經(jīng)燒寫vivi.nand,加電。</p><p> 2 ) 在vivi啟動(dòng)等待中,敲入空格鍵進(jìn)入vivi界面環(huán)境,并輸入以下命令:vivi> load flash kernel x <回車> 燒寫更新內(nèi)核約1分鐘即可燒寫完畢</p><p> 3 )
27、 點(diǎn)擊超級(jí)終端菜單中的“傳送”,選“發(fā)送文件”zImage” 并選擇xModem方式傳送)燒寫結(jié)束,重起實(shí)驗(yàn)板,觀測(cè)超級(jí)終端窗口提示信息就可以啟動(dòng)linux內(nèi)核,</p><p> (3) 新文件系統(tǒng)的燒寫</p><p> 1)首先SW104設(shè)為短接(從Nand Flash啟動(dòng)),確定已經(jīng)成功燒寫vivi.nand,加電運(yùn)行可以看到vivi啟動(dòng)信息,輸入空格進(jìn)入命令狀態(tài);</p
28、><p> 2)雙擊運(yùn)行Download.pjf(該文件在/tmp/edukit-2410/image/中)工程(將啟動(dòng)Embest IDE環(huán)境),點(diǎn)擊連接Remote connect,程序應(yīng)該正在運(yùn)行(命令按鈕STOP為紅色);在串口輸入help,看看有沒(méi)有反應(yīng),如果沒(méi)反應(yīng),點(diǎn)擊IDE 按鈕:Reset ->Start(F5);再輸入help測(cè)試,直到有反應(yīng)為止;</p><p>
29、 3)如果可以輸出一些信息,再點(diǎn)擊IDE中的Stop,配置Debug的Download地址為0x30000000,并點(diǎn)擊IDE菜單Project選擇Settings項(xiàng),在Download頁(yè)下拉Category到Download項(xiàng),在Download File選擇root.cramfs文件,點(diǎn)擊確定后:</p><p> 點(diǎn)擊IDE菜單DEBUG選擇Download下載文件系統(tǒng)映象?</p><
30、;p> 下載完畢后,點(diǎn)擊Start(F5)</p><p> 然后在超級(jí)終端里輸入: load flash root j (燒寫更新文件系統(tǒng))?</p><p> 注意:只能在“vivi的燒寫”操作完成后,才可以按以上方法正確燒寫root映象到Nand Flash。</p><p> 重起實(shí)驗(yàn)板,觀測(cè)超級(jí)終端窗口提示信息,引導(dǎo)整個(gè)系統(tǒng)啟動(dòng)到linux行
31、命令輸入狀態(tài)。</p><p> 2.4.2根文件系統(tǒng)的制作</p><p><b> ?。?)根文件系統(tǒng)</b></p><p> 根文件系統(tǒng)是Linux系統(tǒng)的核心部分,包含系統(tǒng)使用的軟件和庫(kù),以及所有用來(lái)為用戶提供支持架構(gòu)和用戶使用的應(yīng)用軟件,并作為儲(chǔ)存數(shù)據(jù)讀寫結(jié)果的區(qū)域。在Linux系統(tǒng)啟動(dòng)時(shí),首先完成內(nèi)核安裝及環(huán)境初始化,最后會(huì)尋找
32、一個(gè)文件系統(tǒng)作為根文件系統(tǒng)被加載。Linux系統(tǒng)中使用“/”來(lái)唯一表示根文件系統(tǒng)的安裝路徑。嵌入式系統(tǒng)中通??梢詰抑母募到y(tǒng)有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至還可以使用NFS作為根文件系統(tǒng)。</p><p> (2)cramfs文件系統(tǒng)</p><p> Cramfs是Linux創(chuàng)始人Linux torvalds開發(fā)的一個(gè)適用于嵌入式系統(tǒng)的小文件
33、系統(tǒng)。Cramfs是一個(gè)只讀文件系統(tǒng),采用zlib壓縮,壓縮比一般可以達(dá)到1:2,但仍可以做到高效的隨機(jī)讀取。Linux系統(tǒng)中,通常把需要修改的目錄壓縮存放,并在系統(tǒng)引導(dǎo)的時(shí)候再將壓縮文件解開。因?yàn)閏ramfs不會(huì)影響系統(tǒng)讀取文件的速度,而且是一個(gè)高度壓縮的文件系統(tǒng),因此非常廣泛應(yīng)用于嵌入式系統(tǒng)中。</p><p> ?。?)cygwin簡(jiǎn)介</p><p> Cygwin是一個(gè)在win
34、dows平臺(tái)上運(yùn)行的unix/Linux模擬環(huán)境,是cygnus solutions公司開發(fā)的自由軟件。Cygwin中,“/”表示根目錄,即cygwin的安裝目錄。我們常用的set_env_linux.sh中定義的目錄有:</p><p> SOURCEDIR:/tmp/edukit-2410存儲(chǔ)了vivi、linux、fs等源代碼和例程</p><p> WORKDIR:/usr/l
35、ocal/src/edukit-2410工作區(qū)。</p><p> 一般情況下都要把已經(jīng)規(guī)劃好的目錄結(jié)構(gòu)轉(zhuǎn)換成一個(gè)映象文件,即使用命令工具 mkcramfs(cygwin下為 mkcramfs.exe),把相應(yīng)的 cramfs 目錄樹壓縮為單一的映象文件。其命令格式為:</p><p> mkcramfs [-h] [-e edition] [-i file] [-n name] di
36、rname outfile </p><p> 可以使用我們提供的 mkcramfs.exe 在 cygwin 下編譯生成文件系統(tǒng)映象文件 root.cramfs,再固化到開發(fā)系統(tǒng) FLASH 上運(yùn)行。 </p><p> ?。?)常用的Linux行命令</p><p> 1)、cd 改變當(dāng)前目錄(文件夾)。例如下,</p><p>
37、 cd/ 返回到根目錄</p><p> cd.. 退回到上級(jí)目錄</p><p> cd/tmp/edukit-2410/進(jìn)入/tmp/edukit-2410/文件夾</p><p> 2)、ls 列出當(dāng)前目錄中的內(nèi)容。</p><p> Ls 簡(jiǎn)單格式列表</p><p> ls–l 使用詳細(xì)
38、格式列表。</p><p> 3)、pwd 顯示當(dāng)前所在的目錄。</p><p> ?。?)tar工具命令</p><p> tar 程序用于儲(chǔ)存或展開 tar 存檔文件。</p><p><b> 命令格式:</b></p><p> tar [-參數(shù)] [文件名][路徑]</
39、p><p> -x :extract | --get 從存檔展開文件</p><p> -v :--verbose 詳細(xì)顯示處理的文件</p><p> -j :--有 bz2 屬性的必須包含</p><p> -f :--file [HOSTNAME:]F 指定存檔或設(shè)備(缺省為 /dev/rmt0)</p><p&
40、gt; ?。?)解壓原文件系統(tǒng)(命令+解壓目錄的存放)</p><p> 1)先將 root.cramfs.tar.bz2文件放在C:\cygwin目錄中</p><p><b> 2)解壓文件系統(tǒng)</b></p><p> 運(yùn)行cygwin,執(zhí)行以下命令解壓安裝:</p><p> $> source /
41、tmp/edukit-2410/set_env_linux.sh? Linux編譯環(huán)境變量設(shè)置</p><p><b> $> cd / </b></p><p> $> tar -xvjf root.cramfs.tar.bz2</p><p><b> $> ls</b></p>
42、<p><b> … root …</b></p><p> root文件夾中就是我們想要的cramfs文件系統(tǒng)</p><p> 如果在根目錄中產(chǎn)生root文件夾,解壓成功</p><p> 4)在root目錄中新建xx文件夾,用于存放應(yīng)用程序</p><p> 進(jìn)入該目錄后執(zhí)行以下命令編譯鏈接測(cè)
43、試程序:</p><p> $> cd root</p><p> $>mkdir xx</p><p> ?。?)編譯應(yīng)用程序 ts.c (命令+生成文件格式+存放位置):</p><p> 將編寫好的ts.c程序放在C:\cygwin目錄中</p><p> 進(jìn)入該目錄后執(zhí)行以下命令編譯鏈接
44、測(cè)試程序:</p><p><b> $> cd /</b></p><p> $> arm-linux-gcc -o ts ts.c (也可以編寫Makefile來(lái)編譯)</p><p> 生成文件: ts 如下圖所示</p><p> 將ts文件放入root 下的xx文件夾中</p>
45、;<p> ?。?) 新文件系統(tǒng)的制作:</p><p> 把剛才編譯輸出的ts文件拷貝到文件系統(tǒng)所在的工作目錄root目錄下,執(zhí)行以下命令生成新的文件系統(tǒng)映象:</p><p><b> $> cd / </b></p><p> $> mkcramfs root root.new</p><
46、;p> 剛剛編譯生成的文件系統(tǒng)映象 root.new 中已經(jīng)包含測(cè)試程序即生成文件。</p><p><b> 解壓文件系統(tǒng)</b></p><p><b> 解壓成功如下</b></p><p> 在root目錄中新建xx文件夾,用于存放應(yīng)用程序</p><p> 將編寫好的ts.
47、c程序放在C:\cygwin目錄中</p><p> 生成文件: ts 如下圖所示</p><p><b> 新文件系統(tǒng)的制作</b></p><p><b> 生成文件:</b></p><p><b> 第三章 程序</b></p><p>
48、 3.1.程序流程圖:</p><p><b> 3.2.分析驅(qū)動(dòng)</b></p><p> 觸摸屏驅(qū)動(dòng)在/kernel/drivers/char/s3c2410-ts.c 文件中。</p><p> 3.2.1、觸摸屏設(shè)備驅(qū)動(dòng)中數(shù)據(jù)結(jié)構(gòu)</p><p> ?。?)觸摸屏的file_operations</
49、p><p> static struct file_operations s3c2410_fops={</p><p> owner: THIS_MODULE,</p><p> open: s3c2410_ts_open,</p><p> read: s3c2410_ts_read, </p><p> re
50、lease: s3c2410_ts_release,</p><p> #ifdef USE_ASYNC</p><p> fasync: s3c2410_ts_fasync,//異步通知</p><p><b> #endif</b></p><p> poll: s3c2410_ts_poll,//輪詢<
51、;/p><p><b> };</b></p><p> (2)觸摸屏設(shè)備結(jié)構(gòu)體的成員與按鍵設(shè)備結(jié)構(gòu)體的成員類似,也包含一個(gè)緩沖區(qū),同時(shí)包括自旋鎖、等待隊(duì)列和fasync_struct指針</p><p> typedef struct {</p><p> unsigned int penStatus; /* PE
52、N_UP, PEN_DOWN, PEN_SAMPLE */</p><p> TS_RET buf[MAX_TS_BUF]; /* protect against overrun(環(huán)形緩沖區(qū)) */</p><p> unsigned int head, tail;/* head and tail for queued events (環(huán)形緩沖區(qū)的頭尾)*/</p>&l
53、t;p> wait_queue_head_t wq; //* 等待隊(duì)列數(shù)據(jù)結(jié)構(gòu)</p><p> spinlock_t lock; //* 自旋鎖</p><p> #ifdef USE_ASYNC</p><p> struct fasync_struct *aq;</p><p><b> #endif</
54、b></p><p> #ifdef CONFIG_PM</p><p> struct pm_dev *pm_dev; //友善之臂專有的,我后面的代碼刪除了這段</p><p><b> #endif</b></p><p><b> } TS_DEV;</b></p>
55、<p> ?。?)觸摸屏結(jié)構(gòu)體中包含的TS_RET值的類型定義,包含X、Y坐標(biāo)和狀態(tài)(PEN_DOWN、PEN_UP)等信息,這個(gè)信息會(huì)在用戶讀取觸摸信息時(shí)復(fù)制到用戶空 間 </p><p> typedef struct {</p><p> unsigned short pressure; //* 壓力,這里可定義為筆按下,筆抬起,筆拖曳</p>
56、;<p> unsigned short x; //* 橫坐標(biāo)的采樣值</p><p> unsigned short y; //* 縱坐標(biāo)的采樣值</p><p> unsigned short pad; //* 填充位</p><p><b> } TS_RET;</b></p><p&
57、gt; (4)在觸摸屏設(shè)備驅(qū)動(dòng)中,將實(shí)現(xiàn)open()、release()、read()、fasync()和poll()函數(shù),因此,其文件操作結(jié)構(gòu)體定義</p><p> 觸摸屏驅(qū)動(dòng)文件操作結(jié)構(gòu)體:static struct file_operations s3c2410_fops={}</p><p> 3.2.2、觸摸屏驅(qū)動(dòng)模塊加載和卸載函數(shù)</p><p>
58、; (1)在觸摸屏設(shè)備驅(qū)動(dòng)的模塊加載函數(shù)中,要完成申請(qǐng)?jiān)O(shè)備號(hào)、添加cdev、申請(qǐng)中斷、設(shè)置觸摸屏控制引腳(YPON、YMON、XPON、XMON)等多項(xiàng)工作</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)的模塊加載函數(shù)</p><p> static int __init s3c2410_ts_init(void)</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)模塊卸載函數(shù)</p
59、><p> static void __exit s3c2410_ts_exit(void)</p><p> ?。?)可知觸摸屏驅(qū)動(dòng)中會(huì)產(chǎn)生兩類中斷,一類是觸點(diǎn)中斷(INT-TC),一類是X/Y位置轉(zhuǎn)換中斷(INT-ADC)。在前一類中斷發(fā)生后,若之前處于PEN_UP狀態(tài),則應(yīng)該啟動(dòng)X/Y位置轉(zhuǎn)換。另外,將抬起中斷也放在INT-TC處理程序中,它會(huì)調(diào)用tsEvent()完成等待隊(duì)列和信號(hào)的
60、釋放</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)的觸點(diǎn)/抬起中斷處理程序</p><p> static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)</p><p> 當(dāng)X/Y位置轉(zhuǎn)換中斷發(fā)生后,應(yīng)讀取X、Y的坐標(biāo)值,填入緩沖區(qū)</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)
61、X/Y位置轉(zhuǎn)換中斷處理程序</p><p> static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)中獲得X、Y坐標(biāo)</p><p> static inline void s3c2410_get_XY(void)</p>&
62、lt;p> ?。?)tsEvent最終為tsEvent_raw(),這個(gè)函數(shù)很關(guān)鍵,當(dāng)處于PEN_DOWN狀態(tài)時(shí)調(diào)用該函數(shù),它會(huì)完成緩沖區(qū)的填充、等待隊(duì)列的喚醒以及異步通知信號(hào)的釋放;否則(處于PEN_UP狀態(tài)),將緩沖區(qū)頭清0,也喚醒等待隊(duì)列并釋放信號(hào)</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)的tsEvent_raw()函數(shù)</p><p> static void tsEvent_r
63、aw(void)</p><p> ?。?)在包含了對(duì)拖動(dòng)軌跡支持的情況下,定時(shí)器會(huì)被啟用,周期為10ms,在每次定時(shí)器處理函數(shù)被引發(fā)時(shí),調(diào)用start_ts_adc()開始X/Y位置轉(zhuǎn)換過(guò)程</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)的定時(shí)器處理函數(shù)</p><p> static void ts_timer_handler(unsigned long data)<
64、;/p><p> (5)在觸摸屏設(shè)備驅(qū)動(dòng)的打開函數(shù)中,應(yīng)初始化緩沖區(qū)、penStatus和定期器、等待隊(duì)列及tsEvent時(shí)間處理函數(shù)指針</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)的打開函數(shù)</p><p> static int s3c2410_ts_open(struct inode *inode, struct file *filp)</p><
65、p> ?。?)觸摸屏設(shè)備驅(qū)動(dòng)的釋放函數(shù)非常簡(jiǎn)單,刪除為用于拖動(dòng)軌跡所使用的定時(shí)器即可</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)的釋放函數(shù)</p><p> static int s3c2410_ts_release(struct inode *inode, struct file *filp)</p><p> 3.2.3、觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)</p&g
66、t;<p> 觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)實(shí)現(xiàn)緩沖區(qū)中信息向用戶空間的復(fù)制,當(dāng)緩沖區(qū)有內(nèi)容時(shí),直接復(fù)制;否則,如果用戶阻塞訪問(wèn)觸摸屏,則進(jìn)程在等待隊(duì)列上睡眠,否則,立即返回-EAGAIN</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)</p><p> static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, s
67、ize_t count, loff_t *ppos)</p><p> 3.2.4、觸摸屏設(shè)備驅(qū)動(dòng)的輪詢與異步通知</p><p> 在觸摸屏設(shè)備驅(qū)動(dòng)中,通過(guò)s3c2410_ts_poll()函數(shù)實(shí)現(xiàn)了輪詢接口,這個(gè)函數(shù)的實(shí)現(xiàn)非常簡(jiǎn)單。它將等待隊(duì)列添加到poll_table,當(dāng)緩沖區(qū)有數(shù)據(jù)時(shí),返回資源可讀取標(biāo)志,否則返回0</p><p> 觸摸屏設(shè)備驅(qū)動(dòng)的p
68、oll()函數(shù)</p><p> static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait)</p><p> 而為了實(shí)現(xiàn)觸摸屏設(shè)備驅(qū)動(dòng)對(duì)應(yīng)用程序的異步通知,設(shè)備驅(qū)動(dòng)中要實(shí)現(xiàn)s3c2410_ts_fasync()函數(shù)</p><p> 觸摸屏設(shè)備驅(qū)
69、動(dòng)的fasync()函數(shù)</p><p> static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)</p><p> 3.2.5源程序觸摸屏代碼:</p><p><b> /*</b></p><p> * s3c2410-ts.c&l
70、t;/p><p><b> *</b></p><p> * touchScreen driver for SAMSUNG S3C2410</p><p><b> *</b></p><p> * Author: Janghoon Lyu <nandy@mizi.com></
71、p><p> * Date : $Date: 2002/06/04 07:11:00 $ </p><p><b> *</b></p><p> * $Revision: 1.1.2.6 $</p><p><b> *</b></p><p> * Based o
72、n pt036001b-ts.c</p><p><b> *</b></p><p> * This file is subject to the terms and conditions of the GNU General Public</p><p> * License. See the file COPYING in the
73、 main directory of this archive</p><p> * for more details.</p><p><b> *</b></p><p> * History:</p><p><b> *</b></p><p> * 200
74、2-05-27: Janghoon Lyu <nandy@mizi.com></p><p> * - Add HOOK_FOR_DRAG</p><p> * - PM.</p><p><b> * </b></p><p><b> */</b></p&g
75、t;<p> #include <linux/config.h></p><p> #include <linux/module.h></p><p> #include <linux/kernel.h></p><p> #include <linux/init.h></p>&l
76、t;p> #include <linux/miscdevice.h></p><p> #include <linux/sched.h></p><p> #include <linux/delay.h></p><p> #include <linux/poll.h></p><p&
77、gt; #include <linux/spinlock.h></p><p> #include <linux/irq.h></p><p> #include <linux/delay.h></p><p> #include <asm/hardware.h></p><p> #
78、ifdef CONFIG_PM</p><p> #include <linux/pm.h></p><p><b> #endif</b></p><p> /* debug macros */</p><p> #undef DEBUG</p><p> #ifdef D
79、EBUG</p><p> #define DPRINTK( x... )printk("s3c2410-ts: " ##x)</p><p><b> #else</b></p><p> #define DPRINTK( x... )</p><p><b> #endif&l
80、t;/b></p><p> #define PEN_UP 0</p><p> #define PEN_DOWN1</p><p> #define PEN_FLEETING2</p><p> #define MAX_TS_BUF16/* how many do we want to buffer
81、 */</p><p> #undef USE_ASYNC1</p><p> #define DEVICE_NAME"s3c2410-ts"</p><p> #define TSRAW_MINOR1</p><p> typedef struct {</p><p> unsig
82、ned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */</p><p> TS_RET buf[MAX_TS_BUF];/* protect against overrun */</p><p> unsigned int head, tail;/* head and tail for queued events */<
83、/p><p> wait_queue_head_t wq;</p><p> spinlock_t lock;</p><p> #ifdef USE_ASYNC</p><p> struct fasync_struct *aq;</p><p><b> #endif</b></p
84、><p> #ifdef CONFIG_PM</p><p> struct pm_dev *pm_dev;</p><p><b> #endif</b></p><p><b> } TS_DEV;</b></p><p> static TS_DEV tsdev;
85、</p><p> #define BUF_HEAD(tsdev.buf[tsdev.head])</p><p> #define BUF_TAIL(tsdev.buf[tsdev.tail])</p><p> #define INCBUF(x,mod) ((++(x)) & ((mod) - 1))</p><p>
86、 static int tsMajor = 0;</p><p> static void (*tsEvent)(void);</p><p> #define HOOK_FOR_DRAG</p><p> #ifdef HOOK_FOR_DRAG</p><p> #define TS_TIMER_DELAY (HZ/100)
87、/* 10 ms */</p><p> static struct timer_list ts_timer;</p><p><b> #endif</b></p><p> #define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN | \</p><p&
88、gt; XP_AIN | XM_HIZ | YP_AIN | YM_GND | \</p><p> XP_PST(WAIT_INT_MODE); }</p><p> #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ | \</p><p> YP_AIN |
89、 YM_GND | XP_PST(WAIT_INT_MODE); }</p><p> #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | \</p><p> XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE); }</p><p> #defi
90、ne mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | \</p><p> XP_PULL_UP_DIS | XP_PST(NOP_MODE); }</p><p> #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GN
91、D | \</p><p> XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE); }</p><p> #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49) | \</p><p> ADC_INPUT(ADC_IN5) | ADC_START_BY_RD_EN | \<
92、;/p><p> ADC_NORMAL_MODE; \</p><p> ADCDAT0; }</p><p> #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49) | \</p><p> ADC_INPUT(ADC_IN7) | ADC_START_BY_RD_EN |
93、\</p><p> ADC_NORMAL_MODE; \</p><p> ADCDAT1; }</p><p> #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START); }</p><p> static int adc_state = 0;</p>
94、<p> static int x, y;/* touch screen coorinates */</p><p> static void tsEvent_raw(void)</p><p><b> {</b></p><p> if (tsdev.penStatus == PEN_DOWN) {</p>
95、;<p> BUF_HEAD.x = x;</p><p> BUF_HEAD.y = y;</p><p> BUF_HEAD.pressure = PEN_DOWN;</p><p> #ifdef HOOK_FOR_DRAG </p><p> ts_timer.expires = jiffies + TS_TI
96、MER_DELAY;</p><p> add_timer(&ts_timer);</p><p><b> #endif</b></p><p><b> } else {</b></p><p> #ifdef HOOK_FOR_DRAG </p><p>
97、; del_timer(&ts_timer);</p><p><b> #endif</b></p><p> BUF_HEAD.x = 0;</p><p> BUF_HEAD.y = 0;</p><p> BUF_HEAD.pressure = PEN_UP;</p><p&
98、gt;<b> }</b></p><p> tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);</p><p> wake_up_interruptible(&(tsdev.wq));</p><p> #ifdef USE_ASYNC</p><p> if (
99、tsdev.aq)</p><p> kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);</p><p><b> #endif</b></p><p> #ifdef CONFIG_PM</p><p> pm_access(tsdev.pm_dev);</p>
100、;<p><b> #endif</b></p><p><b> }</b></p><p> static int tsRead(TS_RET * ts_ret)</p><p><b> {</b></p><p> spin_lock_irq(&
101、amp;(tsdev.lock));</p><p> ts_ret->x = BUF_TAIL.x;</p><p> ts_ret->y = BUF_TAIL.y;</p><p> ts_ret->pressure = BUF_TAIL.pressure;</p><p> tsdev.tail = INCBU
102、F(tsdev.tail, MAX_TS_BUF);</p><p> spin_unlock_irq(&(tsdev.lock));</p><p> return sizeof(TS_RET);</p><p><b> }</b></p><p> static ssize_t s3c2410_ts
103、_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)</p><p><b> {</b></p><p> TS_RET ts_ret;</p><p><b> retry: </b></p><p> if
104、 (tsdev.head != tsdev.tail) {</p><p> int count;</p><p> count = tsRead(&ts_ret);</p><p> if (count) copy_to_user(buffer, (char *)&ts_ret, count);</p><p> r
105、eturn count;</p><p><b> } else {</b></p><p> if (filp->f_flags & O_NONBLOCK)</p><p> return -EAGAIN;</p><p> interruptible_sleep_on(&(tsdev.w
106、q));</p><p> if (signal_pending(current))</p><p> return -ERESTARTSYS;</p><p> goto retry;</p><p><b> }</b></p><p> return sizeof(TS_RET);
107、</p><p><b> }</b></p><p> #ifdef USE_ASYNC</p><p> static int s3c2410_ts_fasync(int fd, struct file *filp, int mode) </p><p><b> {</b></p
108、><p> return fasync_helper(fd, filp, mode, &(tsdev.aq));</p><p><b> }</b></p><p><b> #endif</b></p><p> static unsigned int s3c2410_ts_poll
109、(struct file *filp, struct poll_table_struct *wait)</p><p><b> {</b></p><p> poll_wait(filp, &(tsdev.wq), wait);</p><p> return (tsdev.head == tsdev.tail) ? 0 : (
110、POLLIN | POLLRDNORM); </p><p><b> }</b></p><p> static inline void start_ts_adc(void)</p><p><b> {</b></p><p> adc_state = 0;</p><
111、;p> mode_x_axis();</p><p> start_adc_x();</p><p><b> }</b></p><p> static inline void s3c2410_get_XY(void)</p><p><b> {</b></p>&
112、lt;p> if (adc_state == 0) { </p><p> adc_state = 1;</p><p> disable_ts_adc();</p><p> y = (ADCDAT0 & 0x3ff); </p><p> mode_y_axis();</p><p> s
113、tart_adc_y();</p><p> } else if (adc_state == 1) { </p><p> adc_state = 0;</p><p> disable_ts_adc();</p><p> x = (ADCDAT1 & 0x3ff); </p><p> tsdev
114、.penStatus = PEN_DOWN;</p><p> DPRINTK("PEN DOWN: x: %08d, y: %08d\n", x, y);</p><p> wait_up_int();</p><p> tsEvent();</p><p><b> }</b></p
115、><p><b> }</b></p><p> static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)</p><p><b> {</b></p><p><b> #if 0</b>
116、;</p><p> DPRINTK("Occured Touch Screen Interrupt\n");</p><p> DPRINTK("SUBSRCPND = 0x%08lx\n", SUBSRCPND);</p><p><b> #endif</b></p><p
117、> spin_lock_irq(&(tsdev.lock));</p><p> if (tsdev.penStatus == PEN_UP)</p><p> s3c2410_get_XY();</p><p> #ifdef HOOK_FOR_DRAG</p><p><b> else</b>
118、;</p><p> s3c2410_get_XY();</p><p><b> #endif</b></p><p> spin_unlock_irq(&(tsdev.lock));</p><p><b> }</b></p><p> static
119、void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)</p><p><b> {</b></p><p><b> #if 0</b></p><p> DPRINTK("Occured Touch Screen Interrupt
120、\n");</p><p> DPRINTK("SUBSRCPND = 0x%08lx\n", SUBSRCPND);</p><p><b> #endif</b></p><p> spin_lock_irq(&(tsdev.lock));</p><p> if (ts
121、dev.penStatus == PEN_UP) {</p><p> start_ts_adc();</p><p><b> } else {</b></p><p> tsdev.penStatus = PEN_UP;</p><p> DPRINTK("PEN UP: x: %08d, y: %
122、08d\n", x, y);</p><p> wait_down_int();</p><p> tsEvent();</p><p><b> }</b></p><p> spin_unlock_irq(&(tsdev.lock));</p><p><b&g
123、t; }</b></p><p> #ifdef HOOK_FOR_DRAG</p><p> static void ts_timer_handler(unsigned long data)</p><p><b> {</b></p><p> spin_lock_irq(&(tsdev
124、.lock));</p><p> if (tsdev.penStatus == PEN_DOWN) {</p><p> start_ts_adc();</p><p><b> }</b></p><p> spin_unlock_irq(&(tsdev.lock));</p><
125、p><b> }</b></p><p><b> #endif</b></p><p> static int s3c2410_ts_open(struct inode *inode, struct file *filp)</p><p><b> {</b></p>&
126、lt;p> tsdev.head = tsdev.tail = 0;</p><p> tsdev.penStatus = PEN_UP;</p><p> #ifdef HOOK_FOR_DRAG </p><p> init_timer(&ts_timer);</p><p> ts_timer.function
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 嵌入式觸摸屏課程設(shè)計(jì)---arm嵌入式系統(tǒng)
- 嵌入式lcd觸摸屏設(shè)計(jì)
- 嵌入式系統(tǒng)中的觸摸屏及其控制
- 觸摸屏控制實(shí)驗(yàn)
- 基于c8051的嵌入式系統(tǒng)觸摸屏設(shè)計(jì)
- 嵌入式工控觸摸屏人機(jī)界面設(shè)計(jì).pdf
- 嵌入式Linux中觸摸屏驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 觸摸屏式
- 基于嵌入式Linux的光學(xué)觸摸屏的設(shè)計(jì)與實(shí)現(xiàn).pdf
- plc課程設(shè)計(jì)自動(dòng)洗衣機(jī)觸摸屏
- 電阻式觸摸屏
- 基于QT的嵌入式綜合媒體無(wú)線觸摸屏系統(tǒng).pdf
- 基于嵌入式及觸摸屏技術(shù)的汽車車身參數(shù)測(cè)量系統(tǒng)設(shè)計(jì).pdf
- 雙點(diǎn)式電阻觸摸屏設(shè)計(jì).pdf
- 基于嵌入式Linux的觸摸屏圖形組態(tài)軟件的研究.pdf
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論