嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)之:字符設(shè)備驅(qū)動(dòng)編程
3.設(shè)備驅(qū)動(dòng)程序主要組成
(1)早期版本的字符設(shè)備注冊。
早期版本的設(shè)備注冊使用函數(shù)register_chrdev(),調(diào)用該函數(shù)后就可以向系統(tǒng)申請主設(shè)備號(hào),如果register_chrdev()操作成功,設(shè)備名就會(huì)出現(xiàn)在/proc/devices文件里。在關(guān)閉設(shè)備時(shí),通常需要解除原先的設(shè)備注冊,此時(shí)可使用函數(shù)unregister_chrdev(),此后該設(shè)備就會(huì)從/proc/devices里消失。其中主設(shè)備號(hào)和次設(shè)備號(hào)不能大于255。
當(dāng)前不少的字符設(shè)備驅(qū)動(dòng)代碼仍然使用這些早期版本的函數(shù)接口,但在未來內(nèi)核的代碼中,將不會(huì)出現(xiàn)這種編程接口機(jī)制。因此應(yīng)該盡量使用后面講述的編程機(jī)制。
register_chrdev()函數(shù)格式如表11.1所示。
表11.1 register_chrdev()函數(shù)語法要點(diǎn)
所需頭文件 | #includelinux/fs.h> |
函數(shù)原型 | intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops) |
函數(shù)傳入值 | major:設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請的主設(shè)備號(hào),如果為0則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)地分配一個(gè)主設(shè)備號(hào) |
name:設(shè)備名 | |
fops:對(duì)各個(gè)調(diào)用的入口點(diǎn) | |
函數(shù)返回值 | 成功:如果是動(dòng)態(tài)分配主設(shè)備號(hào),此返回所分配的主設(shè)備號(hào)。且設(shè)備名就會(huì)出現(xiàn)在/proc/devices文件里 |
出錯(cuò):-1 |
unregister_chrdev()函數(shù)格式如下表11.2所示:
表11.2 unregister_chrdev()函數(shù)語法要點(diǎn)
所需頭文件 | #includelinux/fs.h> |
函數(shù)原型 | intunregister_chrdev(unsignedintmajor,constchar*name) |
函數(shù)傳入值 | major:設(shè)備的主設(shè)備號(hào),必須和注冊時(shí)的主設(shè)備號(hào)相同 |
name:設(shè)備名 | |
函數(shù)返回值 | 成功:0,且設(shè)備名從/proc/devices文件里消失 |
出錯(cuò):-1 |
(2)設(shè)備號(hào)相關(guān)函數(shù)。
在前面已經(jīng)提到設(shè)備號(hào)有主設(shè)備號(hào)和次設(shè)備號(hào),其中主設(shè)備號(hào)表示設(shè)備類型,對(duì)應(yīng)于確定的驅(qū)動(dòng)程序,具備相同主設(shè)備號(hào)的設(shè)備之間共用同一個(gè)驅(qū)動(dòng)程序,而用次設(shè)備號(hào)來標(biāo)識(shí)具體物理設(shè)備。因此在創(chuàng)建字符設(shè)備之前,必須先獲得設(shè)備的編號(hào)(可能需要分配多個(gè)設(shè)備號(hào))。
在Linux2.6的版本中,用dev_t類型來描述設(shè)備號(hào)(dev_t是32位數(shù)值類型,其中高12位表示主設(shè)備號(hào),低20位表示次設(shè)備號(hào))。用兩個(gè)宏MAJOR和MINOR分別獲得dev_t設(shè)備號(hào)的主設(shè)備號(hào)和次設(shè)備號(hào),而且用MKDEV宏來實(shí)現(xiàn)逆過程,即組合主設(shè)備號(hào)和次設(shè)備號(hào)而獲得dev_t類型設(shè)備號(hào)。
分配設(shè)備號(hào)有靜態(tài)和動(dòng)態(tài)的兩種方法。靜態(tài)分配(register_chrdev_region()函數(shù))是指在事先知道設(shè)備主設(shè)備號(hào)的情況下,通過參數(shù)函數(shù)指定第一個(gè)設(shè)備號(hào)(它的次設(shè)備號(hào)通常為0)而向系統(tǒng)申請分配一定數(shù)目的設(shè)備號(hào)。動(dòng)態(tài)分配(alloc_chrdev_region())是指通過參數(shù)僅設(shè)置第一個(gè)次設(shè)備號(hào)(通常為0,事先不會(huì)知道主設(shè)備號(hào))和要分配的設(shè)備數(shù)目而系統(tǒng)動(dòng)態(tài)分配所需的設(shè)備號(hào)。
通過unregister_chrdev_region()函數(shù)釋放已分配的(無論是靜態(tài)的還是動(dòng)態(tài)的)設(shè)備號(hào)。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評(píng)論