|
定義一個(gè)misc 設(shè)備,一般只需要填充minor、name、fops 這三個(gè)成員變量。
minor指次設(shè)備號(hào),可以從“內(nèi)核源碼/include/linux/miscdevice.h”文件中預(yù)定義的次設(shè)備號(hào)挑選,也可以自行定義子設(shè)備號(hào)(沒有被其他設(shè)備使用即可),通常情況下將該參數(shù)設(shè)置為MISC_DYNAMIC_MINOR,表示自動(dòng)分配子設(shè)備號(hào)。
name表示misc設(shè)備的名字。misc設(shè)備驅(qū)動(dòng)注冊(cè)成功之后,會(huì)在dev目錄下生成名為name的設(shè)備節(jié)點(diǎn)。
fops 指向了file_operations的結(jié)構(gòu)體,表示字符設(shè)備的操作集合。
13.2 雜項(xiàng)設(shè)備的注冊(cè)和卸載
不同于字符設(shè)備的注冊(cè)和卸載的繁瑣,雜項(xiàng)設(shè)備的注冊(cè)可以直接使用函數(shù)misc_register函數(shù)來完成,雜項(xiàng)設(shè)備的卸載可以直接使用misc_deregister函數(shù)來完成。上述兩個(gè)函數(shù)均定義在“內(nèi)核源碼/include/linux/miscdevice.h”文件當(dāng)中。
雜項(xiàng)設(shè)備的注冊(cè):
函數(shù)原型:
int misc_register(struct miscdevice *misc)
函數(shù)作用:
基于misc_class構(gòu)造一個(gè)設(shè)備,將miscdevice結(jié)構(gòu)掛載到misc_list列表上,并初始化與linux設(shè)備模型相關(guān)的結(jié)構(gòu)。進(jìn)而起到雜項(xiàng)設(shè)備注冊(cè)的作用。
參數(shù)含義:
misc: 雜項(xiàng)設(shè)備的結(jié)構(gòu)體指針
函數(shù)返回值:申請(qǐng)成功返回0,申請(qǐng)失敗返回負(fù)數(shù)
雜項(xiàng)設(shè)備的卸載:
函數(shù)原型:
int misc_deregister(struct miscdevice *misc)
函數(shù)作用:
從mist_list中刪除miscdevice,進(jìn)而起到雜項(xiàng)設(shè)備卸載的作用。
參數(shù)含義:
misc: 雜項(xiàng)設(shè)備的結(jié)構(gòu)體指針
**函數(shù)返回值:**卸載成功返回0,申請(qǐng)失敗返回負(fù)數(shù)
至此,注冊(cè)和卸載雜項(xiàng)設(shè)備的API函數(shù)就講解完成了,會(huì)在接下來的驅(qū)動(dòng)章節(jié)中對(duì)上述函數(shù)進(jìn)行具體使用。
13.3 雜項(xiàng)設(shè)備驅(qū)動(dòng)框架
MISC驅(qū)動(dòng)一般使用以下結(jié)構(gòu):
13.4 實(shí)驗(yàn)程序的編寫
本實(shí)驗(yàn)對(duì)應(yīng)的網(wǎng)盤路徑為:iTOP-RK3568開發(fā)板【底板V1.7版本】\03_【iTOP-RK3568開發(fā)板】指南教程\02_Linux驅(qū)動(dòng)配套資料\04_Linux驅(qū)動(dòng)例程\08。
本小節(jié)將編寫最簡(jiǎn)單的misc驅(qū)動(dòng),在驅(qū)動(dòng)入口函數(shù)中通過misc_register(…)函數(shù)注冊(cè)雜項(xiàng)設(shè)備驅(qū)動(dòng),在驅(qū)動(dòng)出口函數(shù)中通過misc_deregister(…)函數(shù)注銷雜項(xiàng)設(shè)備驅(qū)動(dòng)。編寫完成的miscdevice.c代碼如下所示:
13.5 運(yùn)行測(cè)試在上一小節(jié)中的miscdevice.c代碼同一目錄下創(chuàng)建 Makefile 文件,Makefile 文件內(nèi)容如下所示:
Makefile保存退出之后,來到存放miscdevice.c和Makefile文件目錄下,如下圖(圖13-1)所示:
然后使用命令“make”進(jìn)行驅(qū)動(dòng)的編譯,編譯完成如下圖(圖 13-2)所示:
編譯完生成 miscdevice.ko目標(biāo)文件,如下圖(圖 13-3)所示:
至此我們的驅(qū)動(dòng)模塊就編譯成功了,下面進(jìn)行驅(qū)動(dòng)的運(yùn)行測(cè)試。
可以看到驅(qū)動(dòng)加載之后,打印“misc registe is succeed”,說明misc驅(qū)動(dòng)注冊(cè)成功。輸入以下命令查看加載的驅(qū)動(dòng)模塊,驅(qū)動(dòng)加載成功如下(圖13-5)所示:
然后來到/sys/class/misc目錄下,可以看到名為“test”的文件夾已經(jīng)被創(chuàng)建了,在/sys/class/misc目錄下有misc類的所有設(shè)備,每個(gè)注冊(cè)的雜項(xiàng)設(shè)備對(duì)應(yīng)一個(gè)文件夾目錄,如下圖(圖13-6)所示:
驅(qū)動(dòng)加載成功之后會(huì)生成/dev/test設(shè)備驅(qū)動(dòng)文件,輸入以下命令查看雜項(xiàng)設(shè)備的主次設(shè)備號(hào)。
結(jié)果如下圖(圖 13-8)所示:
從上圖可以看出,/dev/test這個(gè)雜項(xiàng)設(shè)備的主設(shè)備號(hào)為10,次設(shè)備號(hào)為53,最后可以使用以下命令對(duì)驅(qū)動(dòng)進(jìn)行卸載,卸載完成如下圖(圖 13-9)所示:
更多內(nèi)容:B站搜索迅為RK3568開發(fā)板