資源描述:
《嵌入式論文-劉衛(wèi)川》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、基于ARM的嵌入式Linux按鍵驅(qū)動(dòng)程序設(shè)計(jì)1開發(fā)環(huán)境1.1硬件平臺(tái)SI1547KEINT4S2147KBUTTONEINT5BUTTONR16穹那S3147KEINT6BUTTON47KEINT7S41工BUTTONS511:3■147KTCLK1t±rUSEEXINT19R18B_V驢VBUTTON本文以北京革新公司生產(chǎn)的OURS2410嵌入式開發(fā)板B板為硬件平臺(tái),采用三星公司生產(chǎn)的基于ARM920T核的S3C2410X中央處理器,5級(jí)流水線設(shè)計(jì),實(shí)現(xiàn)了MMU和哈佛結(jié)構(gòu)的緩存。按鍵采用的是B板
2、的底板上自帶的按鍵,按鍵的原理圖如圖1所示,每個(gè)按鍵都接有上拉電阻,從而保證作為輸入的I/O口在按鍵未按下時(shí)得到穩(wěn)定的高電平。rti表1可以看出,這5個(gè)按鍵分別以S3C2410處理器的I/O口GPF4,GPF5,GPF6,GPF7,GPG11為輸入端口(其中按鍵五輸入還可為TCKDo在這里我們以前三個(gè)按鍵為例,這三個(gè)I/O口平時(shí)工作在外部中斷模式,分別對(duì)應(yīng)外部中斷1.2軟件平臺(tái)選擇了開放源碼以及強(qiáng)大的社群支持的Linux操作系統(tǒng),根據(jù)需要對(duì)該系統(tǒng)進(jìn)行了相應(yīng)的剪裁,編譯,以更好地適用于嵌入式系統(tǒng)中。
3、在嵌入式系統(tǒng)軟件開發(fā)中,普遍釆用的交叉編譯的方法進(jìn)行編譯調(diào)試,即將軟件先利用交叉編譯、匯編和連接工具在宿主機(jī)上牛成可執(zhí)行的二進(jìn)制代碼(該代碼不能在宿主機(jī)上運(yùn)行,只能在目標(biāo)板上運(yùn)行),再下載到目標(biāo)板上運(yùn)行。本次開發(fā)采用的交叉編譯鏈?zhǔn)歉镄鹿咎峁┑?.95.2交叉編譯鏈。2設(shè)計(jì)思想和依據(jù)設(shè)備驅(qū)動(dòng)程序的任務(wù)就是控制設(shè)備的硬件完成指定的I/O操作。所以在設(shè)備管理中驅(qū)動(dòng)程序是直接和設(shè)備硬件打交道的。驅(qū)動(dòng)程序包含了對(duì)設(shè)備進(jìn)行各種操作的代碼,在操作系統(tǒng)的控制下,CPU通過執(zhí)行驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)對(duì)設(shè)備底層碩件的處理和
4、操作。Linux的設(shè)備驅(qū)動(dòng)程序的主要功能是:對(duì)設(shè)備進(jìn)行初始化;啟動(dòng)或停止設(shè)備的運(yùn)行;把設(shè)備上的數(shù)據(jù)傳送到內(nèi)存;把數(shù)據(jù)從內(nèi)存?zhèn)魉偷皆O(shè)備;檢測(cè)設(shè)備狀態(tài)[1]0Linux內(nèi)核把驅(qū)動(dòng)程序劃分為三類:字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng),對(duì)于不同的設(shè)備有不同的訪問方式。本文以按鍵驅(qū)動(dòng)為例,介紹基本的字符設(shè)備驅(qū)動(dòng)程序的編寫過程。驅(qū)動(dòng)程序有兩種加載方式:一是直接編譯進(jìn)內(nèi)核,啟動(dòng)內(nèi)核時(shí)可白動(dòng)加載;二是以模塊的方式加載,在系統(tǒng)啟動(dòng)之后可以insmod加載。我們?cè)谶@里采用第二種方式。3接口函數(shù)3.1.1open()函數(shù)應(yīng)用
5、程序在使用設(shè)備之前,必須調(diào)用該函數(shù)打開設(shè)備。本例屮該函數(shù)結(jié)構(gòu)為:staticints3c2410_open(structinode*inode,structfile*filp){keydev.head=keydev.tail=0;//清空按鍵動(dòng)作緩沖區(qū)keyEvent=keyEvent_raw;〃函數(shù)指針指向按鍵處理函數(shù)keyEvent_rawMOD」NC_USE_COUNT;//模塊計(jì)數(shù)值增1[5]return0;}3.1.2release()函數(shù)當(dāng)應(yīng)用程序不再使用設(shè)備時(shí),可通過調(diào)用該函數(shù)釋放資
6、源,關(guān)閉設(shè)備。木例屮該函數(shù)結(jié)構(gòu)為:staticints3c2410_release(slructinode*inode,structfile*filp){keyEvent=keyEvent_dummy;〃函數(shù)指針指向空函數(shù)MOD_DEC_USE_COUNT;return0;}3.1.3read()函數(shù)當(dāng)程序打開設(shè)備后,可以調(diào)用該函數(shù)對(duì)設(shè)備進(jìn)行操作,主要為讀収按鍵的動(dòng)作碼。本例屮該函數(shù)的主要結(jié)構(gòu)如下:staticssize_ts3c2410_read(structfile*filp,char*buf
7、,ssize_tcount,lofO*ppos){retry:if(keydev.head!=keydev.tail)//當(dāng)前循環(huán)隊(duì)列中有數(shù)據(jù){key_ret=keyRead();〃讀取按鍵copy_to_user(……);〃把數(shù)據(jù)從內(nèi)核空間傳送到用戶空間……〃返回else{if(flip->f_flags&O_NONBLOCK)//若用戶采用非阻塞方式讀取return-EAGAIN;interruptible_sleep_on(&(keydev.wq));〃用戶采用阻塞方式讀取,調(diào)用該兩數(shù)使〃進(jìn)
8、程睡眠gotoretry;1return0;}3.2屮斷處理3.2.1中斷模式設(shè)置函數(shù)set_external_irq()在開始初始化硬件吋,要同吋設(shè)置該設(shè)備的中斷模式,以button1為例,該函數(shù)參數(shù)設(shè)置如下:set_extemal」iq(IRQ_EINT4,EXT.LOWLEVEL,GPIO_PULLUP_EN);〃低電平觸發(fā)3.2.2注冊(cè)中斷函數(shù)request_irq()該函數(shù)主要作用為驅(qū)動(dòng)程序注冊(cè)屮斷,并確定屮斷處理程序的一些特性,以及為何設(shè)備注冊(cè)中斷。request_ir