![嵌入式Linux設(shè)備驅(qū)動實(shí)驗(yàn)報(bào)告_第1頁](http://file4.renrendoc.com/view/46b29afc88461b81f1f664de66c4dddc/46b29afc88461b81f1f664de66c4dddc1.gif)
![嵌入式Linux設(shè)備驅(qū)動實(shí)驗(yàn)報(bào)告_第2頁](http://file4.renrendoc.com/view/46b29afc88461b81f1f664de66c4dddc/46b29afc88461b81f1f664de66c4dddc2.gif)
![嵌入式Linux設(shè)備驅(qū)動實(shí)驗(yàn)報(bào)告_第3頁](http://file4.renrendoc.com/view/46b29afc88461b81f1f664de66c4dddc/46b29afc88461b81f1f664de66c4dddc3.gif)
![嵌入式Linux設(shè)備驅(qū)動實(shí)驗(yàn)報(bào)告_第4頁](http://file4.renrendoc.com/view/46b29afc88461b81f1f664de66c4dddc/46b29afc88461b81f1f664de66c4dddc4.gif)
![嵌入式Linux設(shè)備驅(qū)動實(shí)驗(yàn)報(bào)告_第5頁](http://file4.renrendoc.com/view/46b29afc88461b81f1f664de66c4dddc/46b29afc88461b81f1f664de66c4dddc5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)實(shí)驗(yàn)報(bào)告SouthChinaUniversityofTLinux設(shè)備驅(qū)動實(shí)驗(yàn)學(xué)院專業(yè)學(xué)生姓名實(shí)驗(yàn)臺號指導(dǎo)教師提交日期一、實(shí)驗(yàn)?zāi)康?.了解Linux驅(qū)動程序的結(jié)構(gòu);2.掌握Linux驅(qū)動程序常用結(jié)構(gòu)體和操作函數(shù)的使用方法;3.初步掌握Linux驅(qū)動程序的編寫方法及過程;4.掌握Linux驅(qū)動程序的加載方法。二、實(shí)驗(yàn)內(nèi)容1.實(shí)現(xiàn)helloworld驅(qū)動,觀察驅(qū)動的加載和釋放過程;2.根據(jù)參考代碼,分析數(shù)碼顯示驅(qū)動的結(jié)構(gòu)和原理,給出設(shè)備程序的主要組成部分框圖;3.利用數(shù)碼顯示驅(qū)動模塊,編寫測試程序?qū)崿F(xiàn)按鍵對數(shù)碼顯示的控制,包括點(diǎn)亮和關(guān)閉,顯示不同數(shù)字等。三、實(shí)驗(yàn)原理3.1驅(qū)動程序介紹驅(qū)動程
2、序負(fù)責(zé)將應(yīng)用程序如讀、寫等操作正確無誤的傳遞給相關(guān)的硬件,并使硬件能夠做出正確反應(yīng)的代碼。驅(qū)動程序像一個(gè)黑盒子,它隱藏了硬件的工作細(xì)節(jié),應(yīng)用程序只需要通過一組標(biāo)準(zhǔn)化的接口實(shí)現(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è)備的讀寫都有緩存來支持,并且塊設(shè)備必須能夠隨機(jī)存取(
3、randomaccess)。典型的字符設(shè)備包括鼠標(biāo),鍵盤,串行口等。塊設(shè)備主要包括硬盤軟盤設(shè)備,CD-ROM等。網(wǎng)絡(luò)設(shè)備在Linux里做專門的處理。Linux的網(wǎng)絡(luò)系統(tǒng)主要是基于BSDunix的socket機(jī)制。在系統(tǒng)和驅(qū)動程序之間定義有專門的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進(jìn)行數(shù)據(jù)傳遞。系統(tǒng)有支持對發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(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)核版本一致。即,模塊具有版本依賴性,如果不一樣就會出錯(cuò),當(dāng)然可以在模塊程序中的includevlinux/module.h之前通過宏定義#define_NO_VERSION_表明不定義模塊的版本信息。內(nèi)核模塊程序與一般應(yīng)用程序之間主要不同之處是,模塊程序沒有main()函數(shù),模塊程序在裝載時(shí)調(diào)用init_module(void)函數(shù)添加到內(nèi)核中,在卸載時(shí)調(diào)用voidcl
5、eanup_module()函數(shù)從內(nèi)核中卸載。另外一個(gè)應(yīng)用程序從頭到尾只執(zhí)行一個(gè)任務(wù),但一個(gè)模塊可以把響應(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é)點(diǎn))訪問硬件設(shè)備,所有的設(shè)備節(jié)點(diǎn)在/dev目錄下。利用mknod命令生成設(shè)備文件系統(tǒng)的節(jié)點(diǎn),但只有超級用戶才能生成設(shè)備文。Mknod命令必須要有設(shè)備名和設(shè)備類型,主設(shè)備號(MajorNumber),次設(shè)備號(MinorNumber)等3個(gè)參數(shù)。主設(shè)備號用于內(nèi)核區(qū)分設(shè)備驅(qū)動,次設(shè)備號用于設(shè)備驅(qū)動區(qū)分設(shè)備
6、。一個(gè)設(shè)備驅(qū)動可能控制多個(gè)設(shè)備。新的設(shè)備驅(qū)動要有新的主設(shè)備號。在內(nèi)核源代碼的Documentation/devices.txt中定義了所有設(shè)備的主設(shè)備號。在創(chuàng)建設(shè)備的時(shí)候不要與常用的設(shè)備好沖突。3.5驅(qū)動程序基本框架如果采用模塊方式編寫設(shè)備驅(qū)動程序時(shí),通常至少要實(shí)現(xiàn)設(shè)備初始化模塊、設(shè)備打開模塊、數(shù)據(jù)讀寫與控制模塊、中斷處理模塊(有的驅(qū)動程序沒有)、設(shè)備釋放模塊和、設(shè)備卸載模塊等幾個(gè)部分。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)是一個(gè)定義在vlinux/fs.h中的函數(shù)指針數(shù)組。每個(gè)文件都與
7、它自己的函數(shù)集相關(guān)聯(lián)。這個(gè)結(jié)構(gòu)中的每一個(gè)字段都必須指向驅(qū)動程序中實(shí)現(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);四、實(shí)驗(yàn)步驟1啟動RedHat虛擬機(jī),連接主機(jī)和實(shí)驗(yàn)箱后進(jìn)行網(wǎng)絡(luò)設(shè)置2交叉編譯hello.c,將生成的hello.o文件復(fù)制到linux系統(tǒng)與PC的共享目錄下3在超級終端中將文件傳送到實(shí)驗(yàn)箱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個(gè)文件,將生成的文件4個(gè)文件通過超級終端傳送到實(shí)驗(yàn)箱7D提升XSB_EDR_8SEG_test,XSB_EDR_KEYPAD_test兩個(gè)應(yīng)用程序的權(quán)限8D查看/dev目錄下是否存在節(jié)點(diǎn)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運(yùn)行XSB_EDR_8SEG_test程序,觀察結(jié)果11加載驅(qū)動模塊XSB_EDR_KEYPAD.o12D運(yùn)行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ā)生時(shí)進(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ù)碼管顯示程序,顯示同一個(gè)數(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年川味復(fù)合調(diào)味料合作協(xié)議書
- 2025年五年級品德教學(xué)工作總結(jié)模版(三篇)
- 2025年代理售后服務(wù)合同模板(2篇)
- 2025年代理加工合同標(biāo)準(zhǔn)版本(2篇)
- 2025年九年級語文下冊教學(xué)工作總結(jié)范文(二篇)
- 2025年個(gè)人簡易倉庫租賃合同(4篇)
- 2025年二手車賣車協(xié)議樣本(4篇)
- 2025年代理合作協(xié)議范例(三篇)
- 2025年人教版小學(xué)二年級語文下冊教學(xué)工作總結(jié)范文(二篇)
- 2025年個(gè)人工程勞務(wù)合同樣本(三篇)
- 中國古代文學(xué)史 馬工程課件(上)01總緒論
- GB/T 22085.1-2008電子束及激光焊接接頭缺欠質(zhì)量分級指南第1部分:鋼
- 上海中心大廈-介紹 課件
- 《口腔修復(fù)學(xué)》種植義齒-課件
- 非酒精性脂肪性肝病防治指南解讀課件
- 地理微格教學(xué)課件
- 合成氨操作規(guī)程
- 清華大學(xué)抬頭信紙
- 牛津譯林版六年級下冊單詞詞匯表匯總(完整打印版)
- JJF 1975-2022 光譜輻射計(jì)校準(zhǔn)規(guī)范
- Q∕SY 05268-2017 油氣管道防雷防靜電與接地技術(shù)規(guī)范
評論
0/150
提交評論