<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

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

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

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

函數作用:

用于動(dòng)態(tài)創(chuàng )建設備的邏輯類(lèi),并完成部分字段的初始化,然后將其添加進(jìn)Linux內核系統。

參數含義:

owner:struct module結構體類(lèi)型的指針,指向函數即將創(chuàng )建的這個(gè)struct

class的模塊。一般賦值為T(mén)HIS_MODULE。

name:char類(lèi)型的指針,代表即將創(chuàng )建的struct class變量的名字。

返回值:struct class * 類(lèi)型的結構體。

class_destroy(…)函數

該函數在“內核源碼/include/linux/device.h”文件中所引用,如下(圖11-2)所示:

圖 11-2

函數作用:

用于刪除設備的邏輯類(lèi),即從Linux內核系統中刪除設備的邏輯類(lèi)。

參數含義:

owner:struct module結構體類(lèi)型的指針,指向函數即將創(chuàng )建的這個(gè)struct

class的模塊。一般賦值為T(mén)HIS_MODULE。

name:char類(lèi)型的指針,代表即將創(chuàng )建的struct class變量的名字。

返回值:無(wú)

device_create(…)函數

該函數在“內核源碼/include/linux/device.h”文件中所引用,如下(圖11-3)所示:

函數作用:

用來(lái)在class類(lèi)中下創(chuàng )建一個(gè)設備屬性文件,udev會(huì )自動(dòng)識別從而進(jìn)行設備節點(diǎn)的創(chuàng )建。

參數含義:

cls:指定所要創(chuàng )建的設備所從屬的類(lèi)。

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

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

drvdata:被添加到該設備回調的數據,沒(méi)有則指定為NULL。

fmt:添加到系統的設備節點(diǎn)名稱(chēng)。

返回值:struct device * 類(lèi)型結構體

device_destroy(…)函數

在“內核源碼/include/linux/device.h”文件中所引用,如下(圖11-4)所示:

函數作用:

用來(lái)刪除class類(lèi)中的設備屬性文件,udev會(huì )自動(dòng)識別從而進(jìn)行設備節點(diǎn)的刪除。

參數含義:

cls:指定所要創(chuàng )建的設備所從屬的類(lèi)。

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

返回值:無(wú)

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

11.2 實(shí)驗程序的編寫(xiě)

本實(shí)驗對應的網(wǎng)盤(pán)路徑為:iTOP-RK3568開(kāi)發(fā)板【底板V1.7版本】\03_【iTOP-RK3568開(kāi)發(fā)板】指南教程\02_Linux驅動(dòng)配套資料\04_Linux驅動(dòng)例程\06。

本章實(shí)驗將編寫(xiě)Linux下的自動(dòng)創(chuàng )建設備節點(diǎn)實(shí)驗代碼,首先采用自動(dòng)申請設備號的方式進(jìn)行設備號的申請,并對獲取的主設備號與次設備號進(jìn)行打印,之后對字符設備進(jìn)行注冊(file_operations結構體只填充owner 字段即可,會(huì )在下個(gè)章節對file_operations結構體進(jìn)行講解),最后自動(dòng)對設備節點(diǎn)進(jìn)行創(chuàng )建。

編寫(xiě)完成的chrdev_node.c代碼如下(圖11-5)所示

相較于上一章節實(shí)驗,本章節代碼在入口函數中添加了自動(dòng)創(chuàng )建設備節點(diǎn)相關(guān)代碼,在驅動(dòng)出口函數中添加了相應的刪除設備節點(diǎn)相關(guān)代碼(相關(guān)代碼已加粗)。

需要注意的是,在進(jìn)行設備節點(diǎn)添加時(shí),類(lèi)的創(chuàng )建要放在設備創(chuàng )建之前;在進(jìn)行設備節點(diǎn)刪除時(shí),類(lèi)的刪除要放在設備刪除之后。

11.3 運行測試

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

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

對于Makefile的內容注釋已在上圖添加,保存退出之后,來(lái)到存放chrdev_node.c和Makefile文件目錄下,如下圖(圖11-7)所示:

然后使用命令“make”進(jìn)行驅動(dòng)的編譯,編譯完成如下圖(圖11-8)所示:

編譯完生成 chrdev_node.ko目標文件,如下圖(圖11-9)所示:

至此我們的驅動(dòng)模塊就編譯成功了,下面進(jìn)行驅動(dòng)的運行測試。


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



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

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>