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