資源描述:
《Linux字符設(shè)備驅(qū)動程序設(shè)計.ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在PPT專區(qū)-天天文庫。
1、Linux字符設(shè)備驅(qū)動程序設(shè)計劉淼threewater@up-tech.com2006.3.21linux的驅(qū)動程序Linux下對外設(shè)的訪問只能通過驅(qū)動程序Linux對于驅(qū)動程序有統(tǒng)一的接口,以文件的形式定義系統(tǒng)的驅(qū)動程序:Open、Release、read、write、ioctl…驅(qū)動程序是內(nèi)核的一部分,可以使用中斷、DMA等操作驅(qū)動程序需要在用戶態(tài)和內(nèi)核態(tài)之間傳遞數(shù)據(jù)uClinux下可以在應(yīng)用層直接訪問外設(shè),操作寄存器口,但是無法處理中斷——不推薦使用對于復(fù)雜的應(yīng)用可以考慮是用mmap內(nèi)核功能的劃分進程管理(進程之間的通訊與同步)內(nèi)存
2、管理(malloc/free)文件系統(tǒng)設(shè)備控制網(wǎng)絡(luò)功能(網(wǎng)絡(luò)通訊協(xié)議等)Linux下設(shè)備和模塊的分類按照上述系統(tǒng)內(nèi)核的功能,Linux中把系統(tǒng)的設(shè)備定義成如下三類:字符設(shè)備塊設(shè)備網(wǎng)絡(luò)設(shè)備Linux下的設(shè)備Linux的設(shè)備以文件的形式存在于/dev目錄下設(shè)備文件是特殊文件,使用ls/dev-l命令可以看到:crw-------1rootroot10,7Aug312002amigamouse1crw-------1rootroot10,134Aug312002apm_biosbrw-rw----1rootdisk29,0Aug312002az
3、tcd主設(shè)備號和次設(shè)備號主設(shè)備號標識設(shè)備對應(yīng)的驅(qū)動程序一個驅(qū)動程序可以控制若干個設(shè)備,次設(shè)備號提供了一種區(qū)分它們的方法系統(tǒng)增加一個驅(qū)動程序就要賦予它一個主設(shè)備號。這一賦值過程在驅(qū)動程序的初始化過程中intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);創(chuàng)建設(shè)備節(jié)點設(shè)備已經(jīng)注冊到內(nèi)核表中,對于設(shè)備的訪問通過設(shè)備文件(設(shè)備文件與設(shè)備驅(qū)動程序的主設(shè)備號匹配),內(nèi)核會調(diào)用驅(qū)動程序中的正確函數(shù)給程序一個它們可以請求設(shè)備驅(qū)動程序的名字。這個名字必須
4、插入到/dev目錄中,并與驅(qū)動程序的主設(shè)備號和次設(shè)備號相連使用mknod在文件系統(tǒng)上創(chuàng)建一個設(shè)備節(jié)點mknod/dev/mydevicec2540動態(tài)分配設(shè)備號在Documentation/device.txt文件中可以找到已經(jīng)靜態(tài)分配給大部分設(shè)備的列表由于許多數(shù)字已經(jīng)分配了,為新設(shè)備選擇一個唯一的號碼是很困難的如果調(diào)用register_chrdev時的major為零,函數(shù)就會選擇一個空閑號碼并做為返回值返回動態(tài)分配的問題動態(tài)分配的主設(shè)備號不能保證總是一樣的,無法事先創(chuàng)建設(shè)備節(jié)點可以從/proc/devices讀取cat/proc/dev
5、ices利用腳本動態(tài)創(chuàng)建設(shè)備文件節(jié)點設(shè)備管理的問題如今,Linux支持很多不同種類的硬件。這意味著/dev中都有數(shù)百個特殊文件來表示所有這些設(shè)備。而且,這些特殊文件中大多數(shù)甚至不會映射到系統(tǒng)中存在的設(shè)備上使用devfs在Linux2.4的內(nèi)核里引入了devfs來解決linux下設(shè)備文件管理的問題在驅(qū)動程序中通過devfs_register()函數(shù)創(chuàng)建設(shè)備文件系統(tǒng)的節(jié)點系統(tǒng)啟動的時候mount設(shè)備文件系統(tǒng)所有需要的設(shè)備節(jié)點都由內(nèi)核自動管理。/dev目錄下只有掛載的設(shè)備Linux2.6內(nèi)核與devfsLinux2.6內(nèi)核引入了sysfs文
6、件系統(tǒng)為每個系統(tǒng)的硬件樹進行分級處理Devfs在Linux2.6中被標記為舍棄的特性(在Linux2.6.15及以后的版本則取消了對它的支持),而使用udev。維護動態(tài)設(shè)備從sysfs獲得的信息,可以提供對特定設(shè)備的固定設(shè)備名。對于熱插拔的設(shè)備,這尤其重要udev是在用戶空間的腳本文件,這很容易被編輯和修改為了保證舊應(yīng)用程序的兼容性,在嵌入式系統(tǒng)中,是用devfs還是一個好方法。即使在Linux2.6.15內(nèi)核以后,也可以通過ndevfs(nanodevfs)補丁提供對devfs特性的兼容。Linux內(nèi)核硬件驅(qū)動標準模板#include<
7、linux/module.h>#include#includestaticint__initname_of_initialization_routine(void){/*codehere*/}staticvoid__exitname_of_cleanup_routine(void){/*codehere*/}module_init(name_of_initialization_routine);module_exit(name_of_cleanup_routine);module
8、_init(1)include/linux/init.h中#definemodule_init(x)__initcall(x);#define__initcall(fn)staticinit