2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論