版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式驅(qū)動(dòng)程序開(kāi)發(fā)
嵌入式驅(qū)動(dòng)開(kāi)發(fā)驅(qū)動(dòng)程序開(kāi)發(fā)概覽文件系統(tǒng)和驅(qū)動(dòng)程序開(kāi)發(fā)字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)中斷和I/O在驅(qū)動(dòng)開(kāi)發(fā)中的作用驅(qū)動(dòng)程序開(kāi)發(fā)概覽驅(qū)動(dòng)程序?qū)Ρ葢?yīng)用程序應(yīng)用程序是一個(gè)進(jìn)程編程從主函數(shù)main()開(kāi)始主函數(shù)main()返回即是進(jìn)程結(jié)束驅(qū)動(dòng)程序是一系列內(nèi)核函數(shù)驅(qū)動(dòng)程序向內(nèi)核添加了一些函數(shù),是內(nèi)核的一部分Open()Release()Read()Write()這些函數(shù)由內(nèi)核在適當(dāng)?shù)臅r(shí)候來(lái)調(diào)用這些函數(shù)可以用來(lái)完成硬件訪問(wèn)等操作驅(qū)動(dòng)程序開(kāi)發(fā)概覽驅(qū)動(dòng)程序作用設(shè)備驅(qū)動(dòng)程序使得某個(gè)特定的硬件可以響應(yīng)一個(gè)定義良好的內(nèi)部編程接口,同時(shí)完成隱藏設(shè)備的工作。用戶操作通過(guò)一組標(biāo)準(zhǔn)化的調(diào)用完成,而這些調(diào)用是和特定的驅(qū)動(dòng)程序無(wú)關(guān)的。將這些調(diào)用映射到作用于實(shí)際硬件的特定操作上,是設(shè)備驅(qū)動(dòng)程序的任務(wù)。對(duì)用戶程序而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供了一致的接口,一般來(lái)說(shuō)是把設(shè)備映射為一個(gè)特殊的設(shè)備文件(也有設(shè)備不作這樣的映射),用戶程序可以像對(duì)其它文件一樣對(duì)此設(shè)備文件進(jìn)行操作
驅(qū)動(dòng)程序接口Linux對(duì)硬件設(shè)備支持兩個(gè)標(biāo)準(zhǔn)接口:塊特別設(shè)備文件和字符特別設(shè)備文件通過(guò)塊(字符)特別設(shè)備文件存取的設(shè)備稱為塊(字符)設(shè)備或具有塊(字符)設(shè)備接口.塊設(shè)備接口僅支持面向塊的I/O操作,所有I/O操作都通過(guò)在內(nèi)核地址空間中的I/O緩沖區(qū)進(jìn)行,它可以運(yùn)行幾乎在任意長(zhǎng)度和任意位置上的I/O請(qǐng)求,即提供隨機(jī)存取的功能。字符設(shè)備接口支持面向字符的I/O操作,它不經(jīng)過(guò)系統(tǒng)的快速緩存,所以它們負(fù)責(zé)管理自己的緩沖區(qū)結(jié)構(gòu).字符設(shè)備接口只支持順序存取的功能,一般不能進(jìn)行任意長(zhǎng)度的I/O請(qǐng)求,而是限制I/O請(qǐng)求的長(zhǎng)度必須是設(shè)備要求的基本塊長(zhǎng)的倍數(shù).Linux驅(qū)動(dòng)程序分類設(shè)備驅(qū)動(dòng)程序分類字符設(shè)備塊設(shè)備網(wǎng)絡(luò)接口其他驅(qū)動(dòng)程序的作用從傳統(tǒng)嵌入式開(kāi)發(fā)角度來(lái)看,Linux驅(qū)動(dòng)程序是直接操控硬件的軟件直接讀寫(xiě)硬件寄存器,控制硬件操作設(shè)備緩沖區(qū)數(shù)據(jù)讀寫(xiě)存儲(chǔ)介質(zhì),比如flash或硬盤(pán)操作輸出設(shè)備和執(zhí)行機(jī)文件系統(tǒng)和Linux驅(qū)動(dòng)設(shè)備提供dev文件系統(tǒng)節(jié)點(diǎn)和proc文件系統(tǒng)節(jié)點(diǎn)應(yīng)用程序通過(guò)dev文件節(jié)點(diǎn)訪問(wèn)驅(qū)動(dòng)程序字符型驅(qū)動(dòng)一般通過(guò)標(biāo)準(zhǔn)的文件I/O訪問(wèn)塊設(shè)備在上層加載文件系統(tǒng),比如以FAT32的形式訪問(wèn)網(wǎng)絡(luò)設(shè)備通過(guò)SOCKET來(lái)訪問(wèn)應(yīng)用程序通過(guò)proc文件節(jié)點(diǎn)可以查詢?cè)O(shè)備驅(qū)動(dòng)的信息驅(qū)動(dòng)程序在哪兒驅(qū)動(dòng)程序位于內(nèi)核源代碼的drivers目錄下,按照層次結(jié)構(gòu)分門(mén)別類放置驅(qū)動(dòng)程序占kernel源代碼超過(guò)50%。開(kāi)發(fā)完畢的驅(qū)動(dòng)程序,放置在/lib/modules/kernel-version里L(fēng)inux驅(qū)動(dòng)程序開(kāi)發(fā)流程熟悉設(shè)備的特性確定設(shè)備驅(qū)動(dòng)程序是哪一類編寫(xiě)測(cè)試用例搜集可重用的代碼編寫(xiě)自己的驅(qū)動(dòng)程序代碼調(diào)試、編碼、測(cè)試Linux驅(qū)動(dòng)程序加載方式驅(qū)動(dòng)程序直接編譯入內(nèi)核驅(qū)動(dòng)程序在內(nèi)核啟動(dòng)時(shí)就已經(jīng)在內(nèi)存中可以保留專用存儲(chǔ)器空間驅(qū)動(dòng)程序以模塊形式存儲(chǔ)在文件系統(tǒng)里,需要時(shí)動(dòng)態(tài)載入內(nèi)核驅(qū)動(dòng)程序按需加載,不用時(shí)節(jié)省內(nèi)存驅(qū)動(dòng)程序相對(duì)獨(dú)立于內(nèi)核,升級(jí)靈活授權(quán)方式靈活設(shè)備驅(qū)動(dòng)開(kāi)發(fā)中的基本函數(shù)Linux對(duì)于驅(qū)動(dòng)程序有統(tǒng)一的接口,以文件的形式定義系統(tǒng)的驅(qū)動(dòng)程序:Open、Release、read、write、ioctl…驅(qū)動(dòng)程序是內(nèi)核的一部分,可以使用中斷、DMA等操作驅(qū)動(dòng)程序需要在用戶態(tài)和內(nèi)核態(tài)之間傳遞數(shù)據(jù)主設(shè)備號(hào)和次設(shè)備號(hào)主設(shè)備號(hào)標(biāo)識(shí)設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)程序一個(gè)驅(qū)動(dòng)程序可以控制若干個(gè)設(shè)備,次設(shè)備號(hào)提供了一種區(qū)分它們的方法系統(tǒng)增加一個(gè)驅(qū)動(dòng)程序就要賦予它一個(gè)主設(shè)備號(hào)。這一賦值過(guò)程在驅(qū)動(dòng)程序的初始化過(guò)程中int
register_chrdev(unsigned
intmajor,constchar*name,struct
file_operations*fops);創(chuàng)建設(shè)備節(jié)點(diǎn)設(shè)備已經(jīng)注冊(cè)到內(nèi)核表中,對(duì)于設(shè)備的訪問(wèn)通過(guò)設(shè)備文件(設(shè)備文件與設(shè)備驅(qū)動(dòng)程序的主設(shè)備號(hào)匹配),內(nèi)核會(huì)調(diào)用驅(qū)動(dòng)程序中的正確函數(shù)給程序一個(gè)它們可以請(qǐng)求設(shè)備驅(qū)動(dòng)程序的名字。這個(gè)名字必須插入到/dev目錄中,并與驅(qū)動(dòng)程序的主設(shè)備號(hào)和次設(shè)備號(hào)相連使用mknod在文件系統(tǒng)上創(chuàng)建一個(gè)設(shè)備節(jié)點(diǎn)mknod/dev/mydevicec2540設(shè)備驅(qū)動(dòng)程序的代碼驅(qū)動(dòng)程序的注冊(cè)與注銷register函數(shù)用于注冊(cè)u(píng)nregister函數(shù)用于注銷設(shè)備的打開(kāi)與釋放open()release()設(shè)備的讀寫(xiě)操作read()write()設(shè)備的控制操作ioctl()設(shè)備驅(qū)動(dòng)的加載使用模塊的方式動(dòng)態(tài)加載驅(qū)動(dòng)int
func_init(void)
Makefile:insmod
xx.olsmodrmmod
xx.o將驅(qū)動(dòng)靜態(tài)編譯到內(nèi)核里面
int__initfunc_init(void)
Makefile:啟動(dòng)時(shí)自動(dòng)加載編寫(xiě)驅(qū)動(dòng)程序讀寫(xiě)幾乎所有設(shè)備都有輸入和輸出。每個(gè)驅(qū)動(dòng)程序要負(fù)責(zé)本設(shè)備的讀寫(xiě)操作。操作系統(tǒng)不需要知道對(duì)設(shè)備的具體讀寫(xiě)操作怎樣進(jìn)行,這些都由驅(qū)動(dòng)程序屏蔽掉了操作系統(tǒng)定義好一些讀寫(xiě)接口,由驅(qū)動(dòng)程序完成具體的功能在驅(qū)動(dòng)程序初始化時(shí),需要把具有這種接口的讀寫(xiě)函數(shù)注冊(cè)進(jìn)操作系統(tǒng)編寫(xiě)驅(qū)動(dòng)程序中斷中斷在現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)中有重要的地位操作系統(tǒng)必須提供驅(qū)動(dòng)程序響應(yīng)中斷的能力一般是把一個(gè)中斷處理程序注冊(cè)到系統(tǒng)中去操作系統(tǒng)在硬件中斷發(fā)生后調(diào)用驅(qū)動(dòng)程序的處理程序Linux支持中斷的共享,即多個(gè)設(shè)備共享一個(gè)中斷內(nèi)核模塊模塊是內(nèi)核的一部分,但是并沒(méi)有被編譯到內(nèi)核里去。它們被分別編譯和連接成目標(biāo)文件。用命令insmod插入一個(gè)模塊到內(nèi)核中,用命令rmmod卸載一個(gè)模塊在Linux內(nèi)核中,以下內(nèi)容一般編譯成模塊:大多數(shù)的驅(qū)動(dòng)程序。包括SCSI設(shè)備,CD-ROM,網(wǎng)絡(luò)設(shè)備,不常用的字符設(shè)備,如打印機(jī),watchdog等。大多數(shù)文件系統(tǒng),理論上除了根文件系統(tǒng)不能是模塊,其他文件系統(tǒng)都可以是模塊。一些內(nèi)核支持的不常用的可執(zhí)行文件格式,如binfmt_misc。內(nèi)存申請(qǐng)和釋放include/linux/kernel.h里聲明了kmalloc()和kfree()。用于在內(nèi)核模式下申請(qǐng)和釋放內(nèi)存。與用戶模式下的malloc()不同,kmalloc()申請(qǐng)空間有大小限制。長(zhǎng)度是2的整次方??梢陨暾?qǐng)的最大長(zhǎng)度也有限制。另外kmalloc()有priority參數(shù)Kfree()釋放的內(nèi)存必須是kmalloc()申請(qǐng)的申請(qǐng)中斷和釋放中斷request_irq()、free_irq()是驅(qū)動(dòng)程序申請(qǐng)中斷和釋放中斷的調(diào)用。在include/linux/sched.h里聲明
I/OI/O端口的存取使用:inlineunsignedint
inb(unsignedshortport);inlineunsignedint
inb_p(unsignedshortport);inlinevoidoutb(char
value,unsignedshortport);inlinevoidoutb_p(char
value,unsignedshortport);在include/adm/io.h里定義中斷打開(kāi)關(guān)閉系統(tǒng)提供給驅(qū)動(dòng)程序開(kāi)放和關(guān)閉響應(yīng)中斷的能力是在include/asm/system.h
#definecli()__asm____volatile__("cli"::)#def
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 32577-2025軌道交通有人環(huán)境中電磁發(fā)射限值與測(cè)量
- 照相機(jī)及器材制造工誠(chéng)信品質(zhì)模擬考核試卷含答案
- 殘疾人職業(yè)能力評(píng)估師操作管理能力考核試卷含答案
- 機(jī)動(dòng)車檢測(cè)工班組建設(shè)評(píng)優(yōu)考核試卷含答案
- 三輪四輪規(guī)范管理制度
- 酒店員工勞動(dòng)合同管理與簽訂制度
- 超市員工培訓(xùn)及考核標(biāo)準(zhǔn)制度
- 柔性產(chǎn)品知識(shí)培訓(xùn)
- 2024-2025學(xué)年陜西省榆林市靖邊縣高一下學(xué)期第二次月考?xì)v史試題(解析版)
- 2024-2025學(xué)年江蘇省鹽城市七校聯(lián)盟高二下學(xué)期期中聯(lián)考?xì)v史試題(解析版)
- 2026年山東省威海市單招職業(yè)傾向性測(cè)試題庫(kù)附答案解析
- 2026年《必背60題》抖音本地生活BD經(jīng)理高頻面試題包含詳細(xì)解答
- 盤(pán)口暗語(yǔ)及盤(pán)口數(shù)字語(yǔ)言
- QC-提高衛(wèi)生間防水一次驗(yàn)收合格率
- 彈藥庫(kù)防火防爆消防演示
- 用友實(shí)施方法論課件
- 大地測(cè)量控制點(diǎn)坐標(biāo)轉(zhuǎn)換技術(shù)規(guī)程
- 食材配送服務(wù)方投標(biāo)方案(技術(shù)標(biāo))
- 食品安全全球標(biāo)準(zhǔn)BRCGS第9版內(nèi)部審核全套記錄
- TCSAE 261-2022 自主代客泊車 地圖與定位技術(shù)要求
- 成就心態(tài)的感悟
評(píng)論
0/150
提交評(píng)論