RK3568驅動指南|第二篇 字符設備基礎-第11章 創建設備節點實驗(一)

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

函數作用:

​用於動態創建設備的邏輯類,並完成部分字段的初始化,然後將其添加進Linux內核系統。

參數含義:

​owner:struct module結構體類型的指針,指向函數即將創建的這個struct

class的模塊。一般賦值爲THIS_MODULE。

​name:char類型的指針,代表即將創建的struct class變量的名字。

返回值:struct class * 類型的結構體。

class_destroy(…)函數

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

圖 11-2

函數作用:

​用於刪除設備的邏輯類,即從Linux內核系統中刪除設備的邏輯類。

參數含義:

​owner:struct module結構體類型的指針,指向函數即將創建的這個struct

class的模塊。一般賦值爲THIS_MODULE。

​name:char類型的指針,代表即將創建的struct class變量的名字。

返回值:無

device_create(…)函數

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

函數作用:

​用來在class類中下創建一個設備屬性文件,udev會自動識別從而進行設備節點的創建。

參數含義:

​cls:指定所要創建的設備所從屬的類。

​parent:指定該設備的父設備,如果沒有就指定爲NULL。

​devt:指定創建設備的設備號。

​drvdata:被添加到該設備回調的數據,沒有則指定爲NULL。

​fmt:添加到系統的設備節點名稱。

返回值:struct device * 類型結構體

device_destroy(…)函數

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

函數作用:

​用來刪除class類中的設備屬性文件,udev會自動識別從而進行設備節點的刪除。

參數含義:

​cls:指定所要創建的設備所從屬的類。

​devt:指定創建設備的設備號。

返回值:無

至此,關於自動創建節點相關的函數就介紹完成了,會在下一小節中對於設備節點的自動創建進行相應實驗程序的編寫。

11.2 實驗程序的編寫

本實驗對應的網盤路徑爲:iTOP-RK3568開發板【底板V1.7版本】\03_【iTOP-RK3568開發板】指南教程\02_Linux驅動配套資料\04_Linux驅動例程\06。

本章實驗將編寫Linux下的自動創建設備節點實驗代碼,首先採用自動申請設備號的方式進行設備號的申請,並對獲取的主設備號與次設備號進行打印,之後對字符設備進行註冊(file_operations結構體只填充owner 字段即可,會在下個章節對file_operations結構體進行講解),最後自動對設備節點進行創建。

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

相較於上一章節實驗,本章節代碼在入口函數中添加了自動創建設備節點相關代碼,在驅動出口函數中添加了相應的刪除設備節點相關代碼(相關代碼已加粗)。

需要注意的是,在進行設備節點添加時,類的創建要放在設備創建之前;在進行設備節點刪除時,類的刪除要放在設備刪除之後。

11.3 運行測試

11.3.1 編譯驅動程序

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

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

然後使用命令“make”進行驅動的編譯,編譯完成如下圖(圖11-8)所示:

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

至此我們的驅動模塊就編譯成功了,下面進行驅動的運行測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章