資源描述:
《最新微機(jī)原理實(shí)驗(yàn)1.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、成績:課程設(shè)計(jì)大作業(yè)課程名稱:嵌入式Linux程序設(shè)計(jì)案例與實(shí)驗(yàn)教程設(shè)計(jì)題目:觸摸屏驅(qū)動(dòng)程序姓名:劉騏郡、閆佳瑞專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級(jí):計(jì)算機(jī)13-9學(xué)號(hào):1304010910、1304010922計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)驗(yàn)教學(xué)中心2016年11月24日設(shè)計(jì)項(xiàng)目:觸摸屏驅(qū)動(dòng)程序一、功能描述以一個(gè)簡(jiǎn)單字符設(shè)備驅(qū)動(dòng)程序?yàn)樵?,剖析其基本結(jié)構(gòu)。進(jìn)行部分改寫之后并編譯實(shí)現(xiàn)其相應(yīng)功能。了解在UP-NETARM2410-S平臺(tái)上實(shí)現(xiàn)觸摸屏Linux驅(qū)動(dòng)程序的基本原理。了解Linux驅(qū)動(dòng)開發(fā)的基本過程。二、觸摸屏的工作原理1.硬件設(shè)計(jì)???SPI接口是Motorola推出的一種同步串行接口,采用全雙工
2、、四線通信系統(tǒng),S3C2410X是三星推出的自帶觸摸屏">觸摸屏接口的ARM920T內(nèi)核芯片,ADS7843為Burr-Brown生產(chǎn)的一款性能優(yōu)異的觸摸屏">觸摸屏控制器。ADS7843與S3C2410的硬件連接如圖1所示,鑒于ADS7843差分工作模式的優(yōu)點(diǎn),在硬件電路中將其配置為差分模式。圖1觸摸屏輸入系統(tǒng)示意圖2.嵌入式Linux系統(tǒng)下的驅(qū)動(dòng)程序???設(shè)備驅(qū)動(dòng)程序是Linux內(nèi)核的重要組成部分,控制了操作系統(tǒng)和硬件設(shè)備之間的交互。Linux的設(shè)備管理是和文件系統(tǒng)緊密結(jié)合的,各種設(shè)備都以文件的形式存放在/dev目錄下,成為設(shè)備文件。應(yīng)用程序可以打開、關(guān)閉、讀寫這些設(shè)備文件,對(duì)設(shè)備的操
3、作就像操作普通的數(shù)據(jù)文件一樣簡(jiǎn)便。為開發(fā)便利、提高效率,本設(shè)計(jì)采用可安裝模塊方式開發(fā)調(diào)試觸摸屏驅(qū)動(dòng)程序。設(shè)備驅(qū)動(dòng)在加載時(shí)首先需要調(diào)用入口函數(shù)init_module(),該函數(shù)完成設(shè)備驅(qū)動(dòng)的初始化工作。其中最重要的工作就是向內(nèi)核注冊(cè)該設(shè)備,對(duì)于字符設(shè)備調(diào)用register_chrdev()完成注冊(cè),對(duì)于塊設(shè)備需要調(diào)用register_blkdev()完成注冊(cè)。但是,應(yīng)用程序卻還不能“看見”它,因而還不能通過系統(tǒng)調(diào)用它。要使應(yīng)用程序能“看見”這個(gè)模塊或者它所驅(qū)動(dòng)的設(shè)備,就要在文件系統(tǒng)中為其創(chuàng)建一個(gè)代表它的節(jié)點(diǎn)。通過系統(tǒng)調(diào)用mknod()創(chuàng)建代表此項(xiàng)設(shè)備的文件節(jié)點(diǎn)——設(shè)備入口點(diǎn),就可使一項(xiàng)設(shè)備在
4、系統(tǒng)中可見,成為應(yīng)用程序可以訪問的設(shè)備。另外,設(shè)備驅(qū)動(dòng)在卸載時(shí)需要回收相應(yīng)的資源,令設(shè)備的相應(yīng)寄存器值復(fù)位并從系統(tǒng)中注銷該設(shè)備。三、內(nèi)容和步驟1.程序分析剖析UP-NETARM2410-S平臺(tái)上運(yùn)行的觸摸屏驅(qū)動(dòng)程序(s3c2410-ts.c),該程序在/arm2410s/kernel-2410s/drivers/char/s3c2410-ts.c,具體代碼如下:#include#ifdefCONFIG_PM#include#endif/*debugmacros*/#undefDEBUG#ifdefDEBUG#defineDPRINTK
5、(x...)printk("s3c2410-ts:"##x) /*由于驅(qū)動(dòng)主要是內(nèi)核空間運(yùn)行的,所以無法使用用戶空間的相關(guān)庫函數(shù),這里不能用標(biāo)準(zhǔn)C庫中的ptintf來打印調(diào)試信息,只能用內(nèi)核支持的printk函數(shù)。*/#else#defineDPRINTK(x...)#endif#definePEN_UP0//定義抬筆,即觸摸屏不被壓下。#definePEN_DOWN1//定義下筆,即觸摸屏被壓下。#definePEN_FLEETING2//定義拖動(dòng)。#defineMAX_TS_BUF16//定義緩沖區(qū)大小位16字節(jié)。#defineDEVICE_NAME"s3c2410-ts"http://定義了
6、設(shè)備名以后我們就根據(jù)它來尋找該設(shè)備。#defineTSRAW_MINOR1//次設(shè)備號(hào)為1。typedefstruct{ unsignedintpenStatus;/*觸摸屏狀態(tài):PEN_UP,PEN_DOWN,PEN_SAMPLE*/ TS_RETbuf[MAX_TS_BUF];/*protectagainstoverrun*/unsignedinthead,tail;/*headandtailforqueuedevents*/wait_queue_head_twq; /*等待隊(duì)列,它定義在中,包含一個(gè)鎖變量和一個(gè)正在睡眠進(jìn)程鏈表。當(dāng)有好幾個(gè)進(jìn)程都在等待某件
7、事時(shí),Linux會(huì)把這些進(jìn)程記錄到這個(gè)等待隊(duì)列。*/spinlock_tlock;/* 使用自旋鎖。自旋鎖是基于共享變量來工作的,函數(shù)可以通過給某個(gè)變量設(shè)置一個(gè)特殊值來獲得鎖。而其它需要鎖的函數(shù)則會(huì)循環(huán)查詢鎖是否可用。*/#ifdefUSE_ASYNC structfasync_struct*aq;#endif#ifdefCONFIG_PMstructpm_dev*pm_dev;#endif}TS_DEV;//該結(jié)構(gòu)用