




已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于嵌入式Linux的字符設(shè)備驅(qū)動開發(fā)第23卷第3期2008年6月成都信息工程學(xué)院JOURNALOFCHENGDUUNIVERSITYOFINFORMATIONTECHNOLOGYVo1.23No.3Jun.2008文章編號:671一l742(2008)03027505基于嵌入式Linux的字符設(shè)備驅(qū)動開發(fā)王科,姚振東(成都信息工程學(xué)院,四川成都610225)摘要:設(shè)備驅(qū)動程序是Linux內(nèi)核的重要組成部分,它控制了操作系統(tǒng)和硬件設(shè)備之問的交互,同時(shí)讓軟件開發(fā)人員在不用知道底層硬件特性的情況下方便地進(jìn)行上層軟件的開發(fā).基于Arm+Linux系統(tǒng),內(nèi)核版本2.6,對字符驅(qū)動程序的開發(fā)做出詳細(xì)的講解,通過調(diào)試程序,使驅(qū)動正常運(yùn)行.關(guān)鍵詞:嵌入式;Linux;字符設(shè)備驅(qū)動中圖分類號:TP393,04文獻(xiàn)標(biāo)識碼:A1引言越來越多的企業(yè)和科研機(jī)構(gòu)開始進(jìn)行嵌入式Linux的開發(fā)和應(yīng)用.究其原因,嵌入式Linux具有天生秉承的優(yōu)勢:開放的源碼,豐富的軟件資源;功能強(qiáng)大的內(nèi)核,精簡,高效,穩(wěn)定,支持多任務(wù),且可以靈活剪裁,功能定做;支持多種體系結(jié)構(gòu);完善的網(wǎng)絡(luò)通訊,圖形,文件管理機(jī)制等等.由于嵌入式操作系統(tǒng)本身沒有對種類繁多的硬件提供設(shè)備驅(qū)動,操作系統(tǒng)在沒有設(shè)備驅(qū)動的情況下無法正常運(yùn)行,同時(shí)對于嵌入式開發(fā),更沒有通用的驅(qū)動程序可以使用,這就要求我們能夠獨(dú)立開發(fā)基于自己硬件設(shè)備特點(diǎn)的設(shè)備驅(qū)動.重點(diǎn)講述了在基于Arm+Linux,內(nèi)核版本2.6的環(huán)境中,字符設(shè)備驅(qū)動程序的編寫方法及調(diào)試.2設(shè)備驅(qū)動類型在Linux操作系統(tǒng)下有兩類主要的設(shè)備文件類型,一種是字符設(shè)備,另一種是塊設(shè)備.字符設(shè)備和塊設(shè)備的主要區(qū)別是:在對字符設(shè)備發(fā)出讀請求時(shí),實(shí)際的硬件I/O讀就緊接著發(fā)生了,塊設(shè)備則是利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當(dāng)用戶進(jìn)程對設(shè)備請求能滿足用戶的要求,就返回請求的數(shù)據(jù),如果不能,就調(diào)用請求函數(shù)來進(jìn)行實(shí)際的I/O操作.塊設(shè)備主要針對磁盤等慢速設(shè)備設(shè)計(jì)的,以免耗費(fèi)過多的CPU時(shí)間來等待.基于這個(gè)特點(diǎn),一般都是編寫字符設(shè)備驅(qū)動去控制外圍芯片,如外圍時(shí)鐘芯片.3內(nèi)核空間和用戶空間設(shè)備驅(qū)動運(yùn)行在內(nèi)核空間,應(yīng)用程序運(yùn)行在用戶空問,應(yīng)用程序運(yùn)行在最低級別的用戶態(tài),在這一級別處理器禁止對硬件的直接訪問和內(nèi)存的未授權(quán)訪問,要使用戶空間和內(nèi)核空間進(jìn)行數(shù)據(jù)的傳輸,這就需要使用幾個(gè)函數(shù),copyfromuser()實(shí)現(xiàn)用戶空間到內(nèi)核空間數(shù)據(jù)復(fù)制,copytouser()實(shí)現(xiàn)內(nèi)核空間到用戶空間數(shù)據(jù)復(fù)制.4設(shè)備驅(qū)動動態(tài)加載機(jī)制Linux內(nèi)核是一個(gè)整體結(jié)構(gòu),因此向內(nèi)核添加或者刪除某些功能十分困難,而且添加一個(gè)有問題的設(shè)備驅(qū)動將導(dǎo)致整個(gè)系統(tǒng)崩潰.所以通常情況,可以將設(shè)備驅(qū)動程序動態(tài)的加載或者刪除.內(nèi)核版本2.6的Linux其字符設(shè)備驅(qū)動在加載時(shí),首先需要調(diào)用人口函數(shù)cdevinit(),該函數(shù)完成設(shè)備驅(qū)動的初始化工作,比如寄存器置位,結(jié)構(gòu)體賦值等.其中最重要的工作就是向內(nèi)核注冊設(shè)備,對于字符設(shè)備使用cdevadd()完成注冊,注冊成功后,該設(shè)備獲得了系統(tǒng)分配的主設(shè)備號,次設(shè)備號,并建立起與文件系統(tǒng)的關(guān)聯(lián).設(shè)備驅(qū)動在卸載時(shí)調(diào)用cdevdel(),之后就不能訪問這個(gè)驅(qū)動模塊了.系統(tǒng)調(diào)用部分則是對設(shè)備的操作過程.圖1是一個(gè)設(shè)備驅(qū)動模塊動態(tài)加載,卸載和系統(tǒng)調(diào)用過程.收稿日期:200709.17;修訂日期:20071016276成都信息工程學(xué)院第23卷5字符驅(qū)動訪問外部時(shí)鐘芯片實(shí)例下面基于一塊AT91RM9200處理器,通過驅(qū)動控制實(shí)時(shí)時(shí)鐘芯片DS1307來分析字符驅(qū)動的編寫原理.首先需要搞懂這個(gè)時(shí)鐘RTC驅(qū)動所占用的硬件資源,比如說端口資源.DS1307通過I2C接口和AT91RM9200的12C控制器接口PA25,PA26相連,12C控制器初始化如下.voidAT91一TwIInit(void)AT91PS一1Itwi=(AT91PSTwI)AT91CVABASETWI;/愎用PIOA的25,26腳為I2C的SDA,SCLAT91一SYS一>PIOA一【)ER=0x06000000;AT91一SYS一>PIOAASR=0x06000000;AT91一SYS一>PIOAPDR=0x06000000;/開啟外設(shè)時(shí)鐘AT91一SYS一>PMCPCER=OxO0001000;/中斷禁止twi一>TWIIDR=Oxffffffff:/開啟12C總線數(shù)據(jù)傳輸twi一>TWICR=0x24:/設(shè)置I2C時(shí)鐘波形發(fā)生寄存器twi一>TWICWGR=0x00019595:需要注意的是,在A11RM9200中,TI(TwowireInterface)就是表示12C總線.圖1設(shè)備驅(qū)動模塊在內(nèi)核中的加載卸載和系統(tǒng)調(diào)用在Linux2.6版本的內(nèi)核中,采用如下的方法初始化一個(gè)字符設(shè)備:定義一個(gè)文件操作的數(shù)據(jù)結(jié)構(gòu)DS1307一fopsstructfileoperationsDS1307一fops=.open=OPENDS1307.read=READDS1307,.write=WRITEDS1307,.release:CLOSEDS1307.;定義設(shè)備的主,次設(shè)備號以及設(shè)備名稱,intmajor=0;intminor=0;charmychrdevice=RTCDS1307:定義一個(gè)設(shè)備編號變量,此類型是一個(gè)32位的數(shù),其中12位用來表示主設(shè)備號,其余20位用來表示次設(shè)備號,如下:devtdev;采用動態(tài)分配設(shè)備號的方法注冊設(shè)備如下:allocchrdevregion(&dev,minor,1,mychrdevice);major=MAJOR(dev);/獲得系統(tǒng)分配的主設(shè)備號structcdev*DS1307一cdev=cdevalloc();/定義一個(gè)字符設(shè)備并填充數(shù)據(jù)空間cdevinit(DS1307一cdev,&DS1307一fops);mycdev一>owner=THISMODULE;cdevops=&DS1307一fops;cdevadd(DS1307一cdev);第3期王科等:基于嵌入式Linux的字符設(shè)備驅(qū)動開發(fā)277字符設(shè)備注冊完成后,調(diào)用AT91一TWIInit(void),整個(gè)字符驅(qū)動的初始化完成.在應(yīng)用程序中,對這個(gè)設(shè)備文件的打開,瀆,寫,關(guān)閉等操作,需要DS1307fops所定義的函數(shù)來解釋.所以接下來寫函數(shù)實(shí)現(xiàn)對DS1307的讀寫控制.DS1307的12C地址為0x68,故定義如下:#defineDS1307一I2CADDRESS(0x68<<16)首先需要實(shí)現(xiàn)對TWI總線的讀寫控制,如下:intTwIWrite(charaddress,char*data2send,charsize)A1PSTItwi=(A1PSTI)AT91CVABASE一1WI;/rrWI模式寄存器中設(shè)置從機(jī)地址,從機(jī)地址長度,并且定義為寫操作twi一>TwIMMR=(DS130712CADDRESSlAT91CTwIIADRSZ一1一BYTE)&AT91CTWIMREAD;twi一>TWIIADR=address;/從機(jī)內(nèi)部寄存器地址twi一>TWITHR=*(data2send+);/將需要發(fā)送的數(shù)據(jù)寫入傳送保持寄存器twi一>TWICR=A1CTWISTART;/啟動發(fā)送while(size一>1)/從機(jī)返回應(yīng)答信號ACK表示傳輸成功,并且開始下一個(gè)字節(jié)的傳輸while(!(twi一>TwISR&AT91CTwITXRDY);twi一>TWITHR=*(data2send+);twi一>TWICR:ATglCrrWISTOP;/停止傳輸while(!(twi一>TWISR&AT91CTWITXCOMP);/等待傳輸完成后,rrW1一SR中傳輸完成標(biāo)志TWITXCOMP置位return0;lIntTwIRead(charaddress,char*data,charsize)AT91PSTWItwi=(AT91PSTWI)AT91CVABASETWI:twi一>TwIMMR=DS130712CADDRESSlAT91CTwIIADRSZ一1-BYTElAT91CTwIMREAD;twi一>TWICR=AT91CTWISTART;status=twi一>TWISR:while(size一一>1)while(!(twi一>TWISR&AT91CTWIRXRDY):*(data+)=twi>TwIRHR:twi一>TWICR=AT91CTWISTOP:status=twi一>TWISR;while(!(twi一>TWISR&AT91CTWITXCOMP);*data=twi一>TWIRHR;return0;DS1307的內(nèi)部寄存器OxO0一Ox06依次存放的是秒,分,時(shí),星期,日,月,年,所以需要一次讀,寫7個(gè)寄存器才可以得到或者寫入正確的時(shí)間信息.同時(shí)注意的是,DS1307寄存器中的數(shù)據(jù)格式BCD需要轉(zhuǎn)換成BIN格式,定義如下轉(zhuǎn)換函數(shù)#defineBIN2BCD(va1)(va1)/10)<<4)+(va1)%10)#defineBCD2BIN(va1)(va1)&15)+(va1)>>4)*10)在linux內(nèi)核中定義了一個(gè),1u7結(jié)構(gòu)體,structrtctime278成都信息工程學(xué)院第23卷Inttmyear;Inttm它來表示實(shí)時(shí)時(shí)間.mon;Inttmday;Inttmwday;Inttmhour;Inttmmin;Inttmsec;對應(yīng)用程序中read()函數(shù)的解釋用如下函數(shù)實(shí)現(xiàn):staftcvoidREADDS1307(structinode*inode,char*buff,sizetcount,structfile*filp)chardata7;Structrtctimertctm,tictm;rtctm=&一rtctm;TwIRead(OxO,data,7);rtctm一>tmyear=2000+BCD2BIN(data6);rtctm一>tmmon=BCD2BIN(data5);rtctm一>tmmday=BCD2BIN(data4);rtctm一>tmwday=BCD2BIN(data3);rtctm一2>tmhour=BCD2BIN(data2);rtctm一>tmmin=BCD2BIN(data1);rtctm一>tmsee=BCD2BIN(data0J);copytouser(structrtctime*)buff,&rtctm,sizeof(structrtctime);對write()函數(shù)的解釋用如下函數(shù)實(shí)現(xiàn):staticvoidWRITEDS1307(structinode*inode,char*buff,sizetcount,structfile*filp)chardata7;Structrtctimertctm,r-tctm;rtctm=&一rtctm;Copyfromuser(&rtctm,(structrtctime*)buff,count);data6=BIN2B(,D(rtctm一2>tmyear一2000);data5=BIN2B(,D(rtctm一2>tmmon);data4=BIN2B(,D(rtctm一>tmmday);data3=BIN2BCD(rtctm一2>tmwday);data2=BIN2BCD(rtctm一2>tmhour);data1=BIN2B(,D(rtctm一2>tmmin);data0=BIN2BCD(rtctm一2>tmsee);TWIWte(OxO,data,7);驅(qū)動的基本讀寫功能就實(shí)現(xiàn)了.注意的是當(dāng)模塊調(diào)用結(jié)束時(shí),需要注銷模塊并且釋放占用的資源.cdevdel(DS1307一cdev);unregisterchrdevregion(dev,0);6加載模塊并調(diào)試模塊通過交叉編譯后,把生成的mychrdevice.ko文件下到目標(biāo)板上,通過如下命令可以動態(tài)加載此模塊insmodRTCDS1307.ko此時(shí)查看文件/proc/devices,可以看到系統(tǒng)自動給RTCDS1307分配的主設(shè)備號,添加設(shè)備文件節(jié)點(diǎn)就可以訪問RTCDS1307文件了.mknod/dev/RTCDS1307c主設(shè)備號0可以編寫如下應(yīng)用程序,來測試此時(shí)鐘驅(qū)動程序的運(yùn)行情況.通過調(diào)用系統(tǒng)函數(shù)read(),write(),讀,寫DS1307:Structrtctimerealtime.realtime;第3期王科等:基于嵌入式Linux的字符設(shè)備驅(qū)動開發(fā)279/定義一個(gè)時(shí)間結(jié)構(gòu)體來接收驅(qū)動返回的時(shí)間信息或者向驅(qū)動寫入這個(gè)結(jié)構(gòu)體信息.realtime=&一Realtime:realtime一>tmyear=2007:realtime一>tmmon=11:realtime一>tmmday=12:realtime一>tmwday=5:realtime一>tmhour=12:realtime一>tmmin=30:realtime一>tmsec=30:intfd=open(/devTCDS1307,ORDwR);write(fd,realtime,sizeof(reaitime);/以上操作將一個(gè)時(shí)間值寫到了DS1307為了驗(yàn)證寫時(shí)鐘是否正確,可以再將時(shí)鐘值讀出來memset(realtime,0,sizeof(realtime);read(fd,realtime,sizeof(realtime);printf(%04d一%02d一%02d,%01d,%02d:%02d:%02d,realtime一>tmyear,realtime一>tmmon,realtime一>tmmday,realtime一>tm-wday,realtime一>tmhour,realtime一>tmmin,realtime一>tmsec);此時(shí)將顯示讀到的實(shí)時(shí)時(shí)鐘信息:20071012,5,12:30:30讀寫操作完后釋放此文件句柄:close(fd):當(dāng)調(diào)式完成后,通過如下命令卸載模塊rmmodRTCDS13077結(jié)論通過編寫以上的應(yīng)用程序進(jìn)行驗(yàn)證,這個(gè)驅(qū)動能夠正常運(yùn)行,可以完成基本的時(shí)鐘讀寫操作,同時(shí)也驗(yàn)證了在Linux2.6內(nèi)核中,如上的字符驅(qū)動編寫方法的正確性.需要注意的是,在驅(qū)動程序中,需要對并發(fā)和競態(tài)做出相應(yīng)的處理,以防止由于頻繁讀寫操作導(dǎo)致系統(tǒng)崩潰,自旋鎖就是很好的解決措施.參考文獻(xiàn):1毛曙福.LinuxC高級程序員指南M.北京:國防_r-,3k出版社,2001.2孫瓊.嵌入式Linux應(yīng)用程序開
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年Android性能優(yōu)化最佳實(shí)踐分享一點(diǎn)面試小經(jīng)驗(yàn)-android 縮短inflate時(shí)間
- 建筑施工特種作業(yè)-建筑架子工附著式腳手架真題庫-7
- 森林消防演練題目及答案
- 如皋中考語文題目及答案
- 04《運(yùn)動和力的關(guān)系》-2025高中物理水平合格考備考知識清單+習(xí)題鞏固
- 2023-2024學(xué)年云南省玉溪市高二下學(xué)期期末教學(xué)質(zhì)量檢測數(shù)學(xué)試卷(解析版)
- 2024-2025學(xué)年山西省部分地市高二上學(xué)期期末考試語文試題(解析版)
- 店面房屋租賃合同范本-房屋店面租賃合同模板-店面租賃合同范本
- 中國石油新疆油田油氣儲運(yùn)分公司環(huán)境影響后評價(jià)報(bào)告書
- 上呼吸道感染的治療講課件
- 嵐皋縣某鈦磁鐵礦初步詳查設(shè)計(jì)
- 物業(yè)防盜應(yīng)急預(yù)案
- 2024用于水泥和混凝土中的焚燒飛灰
- 23秋國家開放大學(xué)《液壓與氣壓傳動》形考任務(wù)1-2參考答案
- 消防泵房閥門更換施工方案
- 生效的法律文書
- 《路由交換技術(shù)》部署和實(shí)施企業(yè)網(wǎng)絡(luò)互聯(lián)(任務(wù)2)
- 工程量清單及招標(biāo)控制價(jià)編制服務(wù)采購實(shí)施方案(技術(shù)標(biāo))
- 汽修廠配件材料管理制度
- 初中畢業(yè)生簡歷模板
- 云南特崗教師小學(xué)體育歷年真題
評論
0/150
提交評論