博客專欄

EEPW首頁 > 博客 > RK3568驅(qū)動(dòng)指南|第二篇 字符設(shè)備基礎(chǔ)-第11章 創(chuàng)建設(shè)備節(jié)點(diǎn)實(shí)驗(yàn)(一)

RK3568驅(qū)動(dòng)指南|第二篇 字符設(shè)備基礎(chǔ)-第11章 創(chuàng)建設(shè)備節(jié)點(diǎn)實(shí)驗(yàn)(一)

發(fā)布人:紅李亞 時(shí)間:2024-03-15 來源:工程師 發(fā)布文章
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼,支持SATA/PCIE/USB3.0 外圍接口。RK3568內(nèi)置獨(dú)立NPU,可用于輕量級(jí)人工智能應(yīng)用。RK3568 支持安卓 11 和 linux 系統(tǒng),主要面向物聯(lián)網(wǎng)網(wǎng)關(guān)、NVR 存儲(chǔ)、工控平板、工業(yè)檢測(cè)、工控盒、卡拉 OK、云終端、車載中控等行業(yè)。
第11章 創(chuàng)建設(shè)備節(jié)點(diǎn)實(shí)驗(yàn)
在上兩個(gè)章節(jié)的學(xué)習(xí)中,我們已經(jīng)成功的申請(qǐng)了設(shè)備號(hào)并且注冊(cè)了相應(yīng)的字符設(shè)備。系統(tǒng)通過設(shè)備號(hào)對(duì)設(shè)備進(jìn)行查找,而字符設(shè)備注冊(cè)到內(nèi)核之后,并不能直接進(jìn)行設(shè)備文件操作命令(打開、關(guān)閉、讀、寫等),需要相應(yīng)的設(shè)備文件作為橋梁以此來進(jìn)行設(shè)備的訪問,在本章節(jié)將對(duì)如何創(chuàng)建設(shè)備節(jié)點(diǎn)進(jìn)行學(xué)習(xí)。
11.1 創(chuàng)建設(shè)備節(jié)點(diǎn)
在Linux操作系統(tǒng)中一切皆文件,設(shè)備訪問也是通過文件的方式來進(jìn)行的,對(duì)于用來進(jìn)行設(shè)備訪問的文件稱之為設(shè)備節(jié)點(diǎn),設(shè)備節(jié)點(diǎn)被創(chuàng)建在/dev目錄下,將內(nèi)核中注冊(cè)的設(shè)備與用戶層進(jìn)行鏈接,這樣應(yīng)用程序才能對(duì)設(shè)備進(jìn)行訪問。
根據(jù)設(shè)備節(jié)點(diǎn)的創(chuàng)建方式不同,分為了手動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)和自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn),下面對(duì)兩種設(shè)備節(jié)點(diǎn)創(chuàng)建方式進(jìn)行介紹。
11.1.1 手動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)
使用mknod命令手動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn),mknod 命令格式為:
mknod NAME TYPE MAJOR MINOR
參數(shù)含義:
NAME: 要?jiǎng)?chuàng)建的節(jié)點(diǎn)名稱
TYPE: b表示塊設(shè)備,c表示字符設(shè)備,p表示管道
MAJOR:要鏈接設(shè)備的主設(shè)備號(hào)
MINOR: 要鏈接設(shè)備的從設(shè)備號(hào)
例如使用以下命令創(chuàng)建一個(gè)名為device_test的字符設(shè)備節(jié)點(diǎn),鏈接設(shè)備的主設(shè)備號(hào)和從設(shè)備號(hào)分別為236和0:
mknod /dev/device_test c 236 0
11.1.2 自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)
設(shè)備文件的自動(dòng)創(chuàng)建是利用udev(mdev)機(jī)制來實(shí)現(xiàn),多數(shù)情況下采用自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)的方式。udev(mdev)可以檢測(cè)系統(tǒng)中硬件設(shè)備狀態(tài),可以根據(jù)系統(tǒng)中硬件設(shè)備狀態(tài)來創(chuàng)建或者刪除設(shè)備文件。在驅(qū)動(dòng)中首先使用class_create(…)函數(shù)對(duì)class進(jìn)行創(chuàng)建,這個(gè)類存放于/sys/class/ 目錄下,之后使用device_create(…)函數(shù)創(chuàng)建相應(yīng)的設(shè)備,在進(jìn)行模塊加載時(shí),用戶空間中的udev會(huì)自動(dòng)響應(yīng)device_create()函數(shù),尋找對(duì)應(yīng)的類從而創(chuàng)建設(shè)備節(jié)點(diǎn)。
下面對(duì)于自動(dòng)創(chuàng)建節(jié)點(diǎn)中所用到的函數(shù)進(jìn)行解釋說明:
class_create(…)函數(shù)
該函數(shù)在“內(nèi)核源碼/include/linux/device.h”文件中所引用(由于上一小節(jié)中引用的cdev.h文件已包含device.h,所以不需要再重復(fù)引用),如下(圖11-1)所示:

函數(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)識(shí)別從而進(jìn)行設(shè)備節(jié)點(diǎn)的創(chuàng)建。

參數(shù)含義:

cls:指定所要?jiǎng)?chuàng)建的設(shè)備所從屬的類。

parent:指定該設(shè)備的父設(shè)備,如果沒有就指定為NULL。

devt:指定創(chuàng)建設(shè)備的設(shè)備號(hào)。

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)識(shí)別從而進(jìn)行設(shè)備節(jié)點(diǎn)的刪除。

參數(shù)含義:

cls:指定所要?jiǎng)?chuàng)建的設(shè)備所從屬的類。

devt:指定創(chuàng)建設(shè)備的設(shè)備號(hào)。

返回值:無

至此,關(guān)于自動(dòng)創(chuàng)建節(jié)點(diǎn)相關(guān)的函數(shù)就介紹完成了,會(huì)在下一小節(jié)中對(duì)于設(shè)備節(jié)點(diǎn)的自動(dòng)創(chuàng)建進(jìn)行相應(yīng)實(shí)驗(yàn)程序的編寫。

11.2 實(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)例程\06。

本章實(shí)驗(yàn)將編寫Linux下的自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)實(shí)驗(yàn)代碼,首先采用自動(dòng)申請(qǐng)?jiān)O(shè)備號(hào)的方式進(jìn)行設(shè)備號(hào)的申請(qǐng),并對(duì)獲取的主設(shè)備號(hào)與次設(shè)備號(hào)進(jìn)行打印,之后對(duì)字符設(shè)備進(jìn)行注冊(cè)(file_operations結(jié)構(gòu)體只填充owner 字段即可,會(huì)在下個(gè)章節(jié)對(duì)file_operations結(jié)構(gòu)體進(jìn)行講解),最后自動(dòng)對(duì)設(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)行測(cè)試

11.3.1 編譯驅(qū)動(dòng)程序

在上一小節(jié)中的chrdev_node.c代碼同一目錄下創(chuàng)建 Makefile 文件,Makefile 文件內(nèi)容如下(圖11-6)所示:

對(duì)于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)行測(cè)試。


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: 開發(fā)板

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉