嵌入式Linux設(shè)備驅(qū)動實驗報告_第1頁
嵌入式Linux設(shè)備驅(qū)動實驗報告_第2頁
嵌入式Linux設(shè)備驅(qū)動實驗報告_第3頁
嵌入式Linux設(shè)備驅(qū)動實驗報告_第4頁
嵌入式Linux設(shè)備驅(qū)動實驗報告_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、嵌入式系統(tǒng)實驗報告SouthChinaUniversityofTLinux設(shè)備驅(qū)動實驗學(xué)院專業(yè)學(xué)生姓名實驗臺號指導(dǎo)教師提交日期一、實驗?zāi)康?.了解Linux驅(qū)動程序的結(jié)構(gòu);2.掌握Linux驅(qū)動程序常用結(jié)構(gòu)體和操作函數(shù)的使用方法;3.初步掌握Linux驅(qū)動程序的編寫方法及過程;4.掌握Linux驅(qū)動程序的加載方法。二、實驗內(nèi)容1.實現(xiàn)helloworld驅(qū)動,觀察驅(qū)動的加載和釋放過程;2.根據(jù)參考代碼,分析數(shù)碼顯示驅(qū)動的結(jié)構(gòu)和原理,給出設(shè)備程序的主要組成部分框圖;3.利用數(shù)碼顯示驅(qū)動模塊,編寫測試程序?qū)崿F(xiàn)按鍵對數(shù)碼顯示的控制,包括點亮和關(guān)閉,顯示不同數(shù)字等。三、實驗原理3.1驅(qū)動程序介紹驅(qū)動程

2、序負(fù)責(zé)將應(yīng)用程序如讀、寫等操作正確無誤的傳遞給相關(guān)的硬件,并使硬件能夠做出正確反應(yīng)的代碼。驅(qū)動程序像一個黑盒子,它隱藏了硬件的工作細(xì)節(jié),應(yīng)用程序只需要通過一組標(biāo)準(zhǔn)化的接口實現(xiàn)對硬件的操作。32LinuxLinux設(shè)備驅(qū)動程序在Linux的內(nèi)核源代碼中占有很大的比例,源代碼的長度日益增加,主要是驅(qū)動程序的增加。雖然Linux內(nèi)核的不斷升級,但驅(qū)動程序的結(jié)構(gòu)還是相對穩(wěn)定。Linux系統(tǒng)的設(shè)備分為字符設(shè)備(chardevice),塊設(shè)備(blockdevice)和網(wǎng)絡(luò)設(shè)備(networkdevice)ODD字符設(shè)備是指在存取時沒有緩存的設(shè)備,而塊設(shè)備的讀寫都有緩存來支持,并且塊設(shè)備必須能夠隨機存取(

3、randomaccess)。典型的字符設(shè)備包括鼠標(biāo),鍵盤,串行口等。塊設(shè)備主要包括硬盤軟盤設(shè)備,CD-ROM等。網(wǎng)絡(luò)設(shè)備在Linux里做專門的處理。Linux的網(wǎng)絡(luò)系統(tǒng)主要是基于BSDunix的socket機制。在系統(tǒng)和驅(qū)動程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進(jìn)行數(shù)據(jù)傳遞。系統(tǒng)有支持對發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機制,提供對多協(xié)議的支持。33驅(qū)動程序的結(jié)構(gòu)驅(qū)動程序的結(jié)構(gòu)如圖3.1所示,應(yīng)用程序經(jīng)過系統(tǒng)調(diào)用,進(jìn)入核心層,內(nèi)核要控制硬件需要通過驅(qū)動程序?qū)崿F(xiàn),驅(qū)動程序相當(dāng)于內(nèi)核與硬件之間的“系統(tǒng)調(diào)用”3.3.1內(nèi)核模塊內(nèi)核模塊是Linux內(nèi)核的重要組成要素,內(nèi)核模塊能在Linux

4、系統(tǒng)啟動之后能夠動態(tài)進(jìn)行裝載和卸載,因此不需對內(nèi)核進(jìn)行重新編譯或重啟系統(tǒng)就可將內(nèi)核的一部分替換掉,Linux內(nèi)核的所有設(shè)備驅(qū)動,文件系統(tǒng),網(wǎng)絡(luò)協(xié)議等可做成模塊的形式來提供。在所有的模塊中需記錄編譯的內(nèi)核版本信息,并與當(dāng)前執(zhí)行的內(nèi)核版本一致。即,模塊具有版本依賴性,如果不一樣就會出錯,當(dāng)然可以在模塊程序中的includevlinux/module.h之前通過宏定義#define_NO_VERSION_表明不定義模塊的版本信息。內(nèi)核模塊程序與一般應(yīng)用程序之間主要不同之處是,模塊程序沒有main()函數(shù),模塊程序在裝載時調(diào)用init_module(void)函數(shù)添加到內(nèi)核中,在卸載時調(diào)用voidcl

5、eanup_module()函數(shù)從內(nèi)核中卸載。另外一個應(yīng)用程序從頭到尾只執(zhí)行一個任務(wù),但一個模塊可以把響應(yīng)未來請求的事務(wù)登記到內(nèi)核中,然后等待系統(tǒng)調(diào)用,內(nèi)核模塊程序結(jié)構(gòu)如圖3.2所示。insmodrmmod圖3.2內(nèi)核模塊程序結(jié)構(gòu)3.4主、從設(shè)備號應(yīng)用程序通過設(shè)備文件系統(tǒng)(devfs)的名字(或節(jié)點)訪問硬件設(shè)備,所有的設(shè)備節(jié)點在/dev目錄下。利用mknod命令生成設(shè)備文件系統(tǒng)的節(jié)點,但只有超級用戶才能生成設(shè)備文。Mknod命令必須要有設(shè)備名和設(shè)備類型,主設(shè)備號(MajorNumber),次設(shè)備號(MinorNumber)等3個參數(shù)。主設(shè)備號用于內(nèi)核區(qū)分設(shè)備驅(qū)動,次設(shè)備號用于設(shè)備驅(qū)動區(qū)分設(shè)備

6、。一個設(shè)備驅(qū)動可能控制多個設(shè)備。新的設(shè)備驅(qū)動要有新的主設(shè)備號。在內(nèi)核源代碼的Documentation/devices.txt中定義了所有設(shè)備的主設(shè)備號。在創(chuàng)建設(shè)備的時候不要與常用的設(shè)備好沖突。3.5驅(qū)動程序基本框架如果采用模塊方式編寫設(shè)備驅(qū)動程序時,通常至少要實現(xiàn)設(shè)備初始化模塊、設(shè)備打開模塊、數(shù)據(jù)讀寫與控制模塊、中斷處理模塊(有的驅(qū)動程序沒有)、設(shè)備釋放模塊和、設(shè)備卸載模塊等幾個部分。3.6重要結(jié)構(gòu)體打開的設(shè)備在內(nèi)核內(nèi)部由file結(jié)構(gòu)標(biāo)識,內(nèi)核使用file_operation結(jié)構(gòu)訪問驅(qū)動程序函數(shù)。file_operation結(jié)構(gòu)是一個定義在vlinux/fs.h中的函數(shù)指針數(shù)組。每個文件都與

7、它自己的函數(shù)集相關(guān)聯(lián)。這個結(jié)構(gòu)中的每一個字段都必須指向驅(qū)動程序中實現(xiàn)特定操作的函數(shù)。結(jié)構(gòu)如下,詳細(xì)內(nèi)容可查閱相關(guān)文檔。structfile_operationsstructmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*p

8、oll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatas

9、ync);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lock*);ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);unsignedlong

10、(*get_unmapped_area)(structfile*,unsignedlong,unsignedlong,unsignedlong,unsignedlong);四、實驗步驟1啟動RedHat虛擬機,連接主機和實驗箱后進(jìn)行網(wǎng)絡(luò)設(shè)置2交叉編譯hello.c,將生成的hello.o文件復(fù)制到linux系統(tǒng)與PC的共享目錄下3在超級終端中將文件傳送到實驗箱4加載hello驅(qū)動程序:root51Board$insmodhello.o,觀察結(jié)果5釋放hello驅(qū)動程序:root51Board$rmmodhello,觀察結(jié)果6因源碼包中已包含makefile,故利用make命令交叉編譯XSB_E

11、DR_8SEG.、cXSB_EDR_8SEG_test、(XSB_EDR_KEYPAD、cXSB_EDR_KEYPAD_test.C改)等4個文件,將生成的文件4個文件通過超級終端傳送到實驗箱7D提升XSB_EDR_8SEG_test,XSB_EDR_KEYPAD_test兩個應(yīng)用程序的權(quán)限8D查看/dev目錄下是否存在節(jié)點xsb_edr_8seg,xsb_edr_keypad,如果不存在,手動DODO:mknodxsb_edr_8segc611、mknodxsb_edr_keypadc6219加載驅(qū)動模塊XSB_EDR_8SEG.oinsmodXSB_EDR_8SEG.o動態(tài)加載lsmod查

12、看是否加載成功10D運行XSB_EDR_8SEG_test程序,觀察結(jié)果11加載驅(qū)動模塊XSB_EDR_KEYPAD.o12D運行XSB_EDR_KEYPAD_test程序,利用按鍵測試程序,觀察結(jié)果是否正確五、程序說明再利用驅(qū)動對按鍵和數(shù)碼管進(jìn)主程序開啟驅(qū)動后配置按鍵事件,然后handleXSB_EDR_KEYPAD_test序首先開啟按鍵和數(shù)碼管驅(qū)動,行操作,讀取按鍵值并在數(shù)碼管上顯示出對應(yīng)數(shù)字。進(jìn)入數(shù)碼管的循環(huán)顯示,不停顯示按鍵緩存變量的數(shù)值。當(dāng)有按鍵事件發(fā)生時進(jìn)入按鍵處理程序,利用命令獲取當(dāng)前按下的按鍵值。六、關(guān)鍵源代碼注釋#include#include#include#includ

13、e#include#include#include#includetypedefunsignedcharu8;#defineNUM_00 x3f#defineNUM_10 x06#defineNUM_20 x5b#defineNUM_30 x30#defineNUM_40 x19#defineNUM_50 x12#defineNUM_60 x2#defineNUM_70 x78#defineNUM_80 x0#defineNUM_90 x10intfd_key;按鍵驅(qū)動主設(shè)備號fd_setreadfds;voidhandle();charbuf=O;按鍵緩存charnumber=NUM_0,N

14、UM_1,NUM_2,NUM_3,NUM_4,NUM_5,NUM_6,NUM_7,NUM_&NUM_9;數(shù)碼管段碼表voidappear_same(intfd,intbuf)/數(shù)碼管顯示程序,顯示同一個數(shù)字chari,j;for(i=1;i=6;i+)ioctl(fd,i,number+buf);/執(zhí)行數(shù)碼管命令,在i數(shù)碼管顯示數(shù)字bufsleep(1);intmain(void)intdac_value;longoflags;intfd;數(shù)碼管主設(shè)備號fd_key=open(/dev/xsb_edr_kbd,O_RDWR);打開按鍵驅(qū)動,獲取主設(shè)備號signal(SIGIO,&handle);fcntl(fd_key,F_SETOWN,getpid();oflags=fcntl(fd_key,F_GETFL);fcntl(fd_key,F_SETFL,oflags|FASYNC);fd=open(/dev/xsb_edr_8seg,O_RDWR);/打開數(shù)碼管驅(qū)動,獲取主設(shè)備號if(fd0)printf(#8segtestdeviceopenfail#%dn,fd);打開不正常,串口打印提示return(-1);while(1)appear_same(fd,buf);循環(huán)顯示讀取的按鍵數(shù)據(jù)close(fd);/關(guān)閉數(shù)碼管驅(qū)動printf(C

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論