




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第16章LED驅(qū)動程序設(shè)計(jì)
本章通過一個(gè)簡單的ledLinuxu驅(qū)動程序介紹字符驅(qū)動程序的設(shè)計(jì)。主要內(nèi)容:§16.1
Linux設(shè)備分類§16.2
Linux設(shè)備驅(qū)動程序結(jié)構(gòu)§16.3
LinuxLED驅(qū)動程序§16.4
LinuxLED驅(qū)動程序有關(guān)函數(shù)§16.5
LinuxLED驅(qū)動程序設(shè)計(jì)§16.1Linux設(shè)備分類Linux支持的設(shè)備驅(qū)動可分為3類:1.字符設(shè)備2.塊設(shè)備3.網(wǎng)絡(luò)設(shè)備。其中字符設(shè)備的處理是以字節(jié)為單位來進(jìn)行的,我們這里僅討論字符設(shè)備驅(qū)動。§16.2Linux設(shè)備驅(qū)動程序結(jié)構(gòu)一、設(shè)備驅(qū)動程序之間的共性二、用動態(tài)方法對設(shè)備驅(qū)動程序完成一些操作三、內(nèi)核模塊的加載和卸載一、設(shè)備驅(qū)動程序之間的共性所有的設(shè)備驅(qū)動程序都有一些共性,都要要完成以下任務(wù):1.向系統(tǒng)申請主次設(shè)備號。2.實(shí)現(xiàn)設(shè)備初始化和卸載功能。3.設(shè)計(jì)設(shè)備文件操作,如定義file_operations結(jié)構(gòu)。4.設(shè)計(jì)設(shè)備文件操作調(diào)用,如讀寫等操作。5.實(shí)現(xiàn)中斷服務(wù)函數(shù),用requset_irq向內(nèi)核注冊。6.將驅(qū)動程序編譯到內(nèi)核或編譯成模塊,用ismod命令加載。7.生成設(shè)備節(jié)點(diǎn)文件。二、用動態(tài)方法對設(shè)備驅(qū)動程序完成一些操作我們常用動態(tài)方法對設(shè)備驅(qū)動程序完成一些操作:1.加載在系統(tǒng)啟動時(shí)用ismod命令把驅(qū)動程序(.o文件)加到內(nèi)核去2.卸載不需要時(shí)用rmmod來卸載內(nèi)核模塊3.設(shè)備初始化向系統(tǒng)添加一個(gè)驅(qū)動程序相當(dāng)于添加一個(gè)主設(shè)備號,可以調(diào)用register_chrdev();4.注銷一個(gè)驅(qū)動程序可以調(diào)用unregister();5.打開文件用open();6.關(guān)閉文件用close();7.讀文件用read();8.寫文件用write();三、內(nèi)核模塊的加載和卸載內(nèi)核模塊和和一般應(yīng)用程序主要不同是內(nèi)核模塊沒有主程序main()。1.內(nèi)核模塊加載用init_moddule(void);。2.內(nèi)核模塊卸載用(void)cleanup();。內(nèi)核空間和用戶空間數(shù)據(jù)互換:3.從內(nèi)核空間讀數(shù)據(jù)到用戶空間用copy_to_user。具體如:
Unsegnedlongcopy_to_user(void_user*to,constviod*from,unsegnedlongn);其中*to是用戶空間指針,*from是內(nèi)核空間指針,n表示復(fù)制數(shù)據(jù)的字節(jié)數(shù)。如成功返回0,不成功返回沒用成功的字節(jié)數(shù)。4.用戶空間數(shù)據(jù)傳送給內(nèi)核空間用copy_from_user。具體如:
Unsegnedlongcopy_from_user(void*to,constvoid_user*from,unsegnedlongn)其中*to是內(nèi)核空間指針,*from是用戶空間指針,n表示復(fù)制數(shù)據(jù)的字節(jié)數(shù)。如成功返回0,不成功返回沒用成功的字節(jié)數(shù)?!?6.3LinuxLED驅(qū)動程序嵌入式LED驅(qū)動程序主要包括以下內(nèi)容:1.編寫設(shè)備驅(qū)動程序,將LED部件控制過程編入驅(qū)動程序文件操作框架中。2.將驅(qū)動程序文件操作框架結(jié)構(gòu)體注冊進(jìn)內(nèi)核,并與LED驅(qū)動程序申請的主設(shè)備號關(guān)聯(lián)。3.編譯LED驅(qū)動程序。4.根據(jù)主設(shè)備號,在/dev/目錄下創(chuàng)建LED驅(qū)動程序?qū)?yīng)的設(shè)備文件。5.編寫和編譯LED驅(qū)動測試程序,測試LED驅(qū)動?!?6.4LinuxLED驅(qū)動程序有關(guān)函數(shù)一、虛擬地址映射二、獲取設(shè)備號三、將編寫的設(shè)備驅(qū)動程序注冊進(jìn)內(nèi)核五、添加一個(gè)字符設(shè)備到系統(tǒng)中四、字符驅(qū)動設(shè)備結(jié)構(gòu)體初始化六、從系統(tǒng)刪除一個(gè)字符設(shè)備一、虛擬地址映射內(nèi)核對硬件的訪問一般采用虛擬地址,此時(shí)可以通過ioremap來獲取。取消虛擬地址采用iounmap。具體如下:獲取虛擬地址void*ioremap(unsignedlongphys_addr,unsignedlongsize);
取消虛擬地址void*iounmap(*addr);addr是映射后得到的虛擬地址。二、獲取設(shè)備號驅(qū)動程序?yàn)榱双@取自己的設(shè)備號,可以向內(nèi)核申請,采用:Intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name);first表示要分配的起始設(shè)備號,次設(shè)備號通常為0。分配成功返回0,出錯(cuò)返回一個(gè)負(fù)數(shù)。釋放原先申請的設(shè)備號,用:voidunregister_chrdev_region(dev_t_first,unsignedintcount);first是第一個(gè)設(shè)備號,count是申請的設(shè)備數(shù)量。三、將編寫的設(shè)備驅(qū)動程序注冊進(jìn)內(nèi)核內(nèi)核中每個(gè)字符設(shè)備都對應(yīng)一個(gè)cdev結(jié)構(gòu)的變量,定義如下:
structcdev(structkobjectkobj;/*每個(gè)cdev都是一個(gè)kobject,存cdev文件的組織結(jié)構(gòu)和名字和父目錄等信息*/
Structmodule*owner;//指向驅(qū)動的模塊
Conststructfile_operations*ops;//這個(gè)字符文件的操作方法
Structlist_headlist;//字符設(shè)備文件
inode.i_devices鏈表頭
Dev_tdev;//起始設(shè)備號
Unsignedintcount;//設(shè)備范圍號大小};四、字符驅(qū)動設(shè)備結(jié)構(gòu)體初始化voidcdev_init(structcdev*cdev,conststructfile_operations*fops);cdev為驅(qū)動中定義的structcdev結(jié)構(gòu)體;fops為file_operations結(jié)構(gòu)體。即這個(gè)字符文件的操作方法。五、添加一個(gè)字符設(shè)備到系統(tǒng)中Intcdev_add(structcdev*p,dev_tdev,unsignedcount);p為通過cdev_init初始化的structcdev結(jié)構(gòu)體指針。count是設(shè)備編號數(shù)量,常取1。六、從系統(tǒng)刪除一個(gè)字符設(shè)備從系統(tǒng)刪除一個(gè)字符設(shè)備,用下面函數(shù):
Voidcdev_del(structcdev*p);§16.5LinuxLED驅(qū)動程序設(shè)計(jì)一、LED驅(qū)動電路二、LED驅(qū)動程序一、LED驅(qū)動電路LED驅(qū)動電路如16-1所示。LED1-ED5分別與GPX2_7、GPX1_0、GPF3_4、GPF3_5相連,
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鹵味供貨協(xié)議合同范本
- 三年級口算題全集1000道
- 單位拆遷合同范本
- 與老師合作合同范本
- 付協(xié)調(diào)費(fèi)合同范本
- 2025年天津市安全員知識題庫附答案
- 東鵬瓷磚供銷合同范本
- 公益捐助合同范本
- 單位蔬菜訂購合同范本
- 賣模具合同范本
- 小羊詩歌大全1479首(小羊喝水?dāng)U句)
- 2022-2023學(xué)年遼寧省鞍山市普通高中高一年級下冊學(xué)期第一次月考數(shù)學(xué)(A卷)試題【含答案】
- 中國農(nóng)村居民儲蓄行為研究共3篇
- 華為鴻蒙深度研究
- 心理咨詢師考試題庫及答案
- 弟子規(guī)42+用人物須明求+教案
- GB/T 7307-200155°非密封管螺紋
- GB/T 32972-2016鋼鐵企業(yè)軋鋼加熱爐節(jié)能設(shè)計(jì)技術(shù)規(guī)范
- 年平均雷暴日2023
- 《育兒百科》松田道雄
- 穴位注射操作流程圖
評論
0/150
提交評論