RK3568驅(qū)動(dòng)指南|第二篇 字符設(shè)備基礎(chǔ)-第11章 創(chuàng)建設(shè)備節(jié)點(diǎn)實(shí)驗(yàn)(一)
函數(shù)作用:
用于動(dòng)態(tài)創(chuàng)建設(shè)備的邏輯類,并完成部分字段的初始化,然后將其添加進(jìn)Linux內(nèi)核系統(tǒng)。
參數(shù)含義:
owner:struct module結(jié)構(gòu)體類型的指針,指向函數(shù)即將創(chuàng)建的這個(gè)struct
class的模塊。一般賦值為THIS_MODULE。
name:char類型的指針,代表即將創(chuàng)建的struct class變量的名字。
返回值:struct class * 類型的結(jié)構(gòu)體。
class_destroy(…)函數(shù)
該函數(shù)在“內(nèi)核源碼/include/linux/device.h”文件中所引用,如下(圖11-2)所示:
圖 11-2
函數(shù)作用:
用于刪除設(shè)備的邏輯類,即從Linux內(nèi)核系統(tǒng)中刪除設(shè)備的邏輯類。
參數(shù)含義:
owner:struct module結(jié)構(gòu)體類型的指針,指向函數(shù)即將創(chuàng)建的這個(gè)struct
class的模塊。一般賦值為THIS_MODULE。
name:char類型的指針,代表即將創(chuàng)建的struct class變量的名字。
返回值:無
device_create(…)函數(shù)
該函數(shù)在“內(nèi)核源碼/include/linux/device.h”文件中所引用,如下(圖11-3)所示:
函數(shù)作用:
用來在class類中下創(chuàng)建一個(gè)設(shè)備屬性文件,udev會(huì)自動(dòng)識別從而進(jìn)行設(shè)備節(jié)點(diǎn)的創(chuàng)建。
參數(shù)含義:
cls:指定所要?jiǎng)?chuàng)建的設(shè)備所從屬的類。
parent:指定該設(shè)備的父設(shè)備,如果沒有就指定為NULL。
devt:指定創(chuàng)建設(shè)備的設(shè)備號。
drvdata:被添加到該設(shè)備回調(diào)的數(shù)據(jù),沒有則指定為NULL。
fmt:添加到系統(tǒng)的設(shè)備節(jié)點(diǎn)名稱。
返回值:struct device * 類型結(jié)構(gòu)體
device_destroy(…)函數(shù)
在“內(nèi)核源碼/include/linux/device.h”文件中所引用,如下(圖11-4)所示:
函數(shù)作用:
用來刪除class類中的設(shè)備屬性文件,udev會(huì)自動(dòng)識別從而進(jìn)行設(shè)備節(jié)點(diǎn)的刪除。
參數(shù)含義:
cls:指定所要?jiǎng)?chuàng)建的設(shè)備所從屬的類。
devt:指定創(chuàng)建設(shè)備的設(shè)備號。
返回值:無
至此,關(guān)于自動(dòng)創(chuàng)建節(jié)點(diǎn)相關(guān)的函數(shù)就介紹完成了,會(huì)在下一小節(jié)中對于設(shè)備節(jié)點(diǎn)的自動(dòng)創(chuàng)建進(jìn)行相應(yīng)實(shí)驗(yàn)程序的編寫。
11.2 實(shí)驗(yàn)程序的編寫
本實(shí)驗(yàn)對應(yīng)的網(wǎng)盤路徑為:iTOP-RK3568開發(fā)板【底板V1.7版本】\03_【iTOP-RK3568開發(fā)板】指南教程\02_Linux驅(qū)動(dòng)配套資料\04_Linux驅(qū)動(dòng)例程\06。
本章實(shí)驗(yàn)將編寫Linux下的自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)實(shí)驗(yàn)代碼,首先采用自動(dòng)申請?jiān)O(shè)備號的方式進(jìn)行設(shè)備號的申請,并對獲取的主設(shè)備號與次設(shè)備號進(jìn)行打印,之后對字符設(shè)備進(jìn)行注冊(file_operations結(jié)構(gòu)體只填充owner 字段即可,會(huì)在下個(gè)章節(jié)對file_operations結(jié)構(gòu)體進(jìn)行講解),最后自動(dòng)對設(shè)備節(jié)點(diǎn)進(jìn)行創(chuàng)建。
編寫完成的chrdev_node.c代碼如下(圖11-5)所示
相較于上一章節(jié)實(shí)驗(yàn),本章節(jié)代碼在入口函數(shù)中添加了自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)相關(guān)代碼,在驅(qū)動(dòng)出口函數(shù)中添加了相應(yīng)的刪除設(shè)備節(jié)點(diǎn)相關(guān)代碼(相關(guān)代碼已加粗)。
需要注意的是,在進(jìn)行設(shè)備節(jié)點(diǎn)添加時(shí),類的創(chuàng)建要放在設(shè)備創(chuàng)建之前;在進(jìn)行設(shè)備節(jié)點(diǎn)刪除時(shí),類的刪除要放在設(shè)備刪除之后。
11.3 運(yùn)行測試
11.3.1 編譯驅(qū)動(dòng)程序
在上一小節(jié)中的chrdev_node.c代碼同一目錄下創(chuàng)建 Makefile 文件,Makefile 文件內(nèi)容如下(圖11-6)所示:
對于Makefile的內(nèi)容注釋已在上圖添加,保存退出之后,來到存放chrdev_node.c和Makefile文件目錄下,如下圖(圖11-7)所示:
然后使用命令“make”進(jìn)行驅(qū)動(dòng)的編譯,編譯完成如下圖(圖11-8)所示:
編譯完生成 chrdev_node.ko目標(biāo)文件,如下圖(圖11-9)所示:
至此我們的驅(qū)動(dòng)模塊就編譯成功了,下面進(jìn)行驅(qū)動(dòng)的運(yùn)行測試。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。