博客專欄

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

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

        發布人:紅李亞 時間:2024-03-15 來源:工程師 發布文章
        瑞芯微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)所示:

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


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 開發板

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 彝良县| 高清| 龙江县| 瓦房店市| 怀来县| 连州市| 鄂伦春自治旗| 灯塔市| 宝山区| 巫山县| 呼图壁县| 西乌珠穆沁旗| 化州市| 桂阳县| 平远县| 铜鼓县| 济南市| 邵武市| 建平县| 河东区| 黔东| 桑植县| 南通市| 佛学| 新乡县| 邯郸县| 盈江县| 抚顺县| 江永县| 中宁县| 延吉市| 宜宾县| 军事| 临泉县| 伽师县| 股票| 健康| 敖汉旗| 德清县| 郸城县| 永安市|