色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

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

          RK3568驅(qū)動指南|第二篇 字符設備基礎-第11章 創(chuàng)建設備節(jié)點實驗(一)

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

          函數(shù)作用:

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

          參數(shù)含義:

          owner:struct module結(jié)構(gòu)體類型的指針,指向函數(shù)即將創(chuàng)建的這個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ù)作用:

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

          參數(shù)含義:

          owner:struct module結(jié)構(gòu)體類型的指針,指向函數(shù)即將創(chuàng)建的這個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)建一個設備屬性文件,udev會自動識別從而進行設備節(jié)點的創(chuàng)建。

          參數(shù)含義:

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

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

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

          drvdata:被添加到該設備回調(diào)的數(shù)據(jù),沒有則指定為NULL。

          fmt:添加到系統(tǒng)的設備節(jié)點名稱。

          返回值:struct device * 類型結(jié)構(gòu)體

          device_destroy(…)函數(shù)

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

          函數(shù)作用:

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

          參數(shù)含義:

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

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

          返回值:無

          至此,關于自動創(chuàng)建節(jié)點相關的函數(shù)就介紹完成了,會在下一小節(jié)中對于設備節(jié)點的自動創(chuàng)建進行相應實驗程序的編寫。

          11.2 實驗程序的編寫

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

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

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

          相較于上一章節(jié)實驗,本章節(jié)代碼在入口函數(shù)中添加了自動創(chuàng)建設備節(jié)點相關代碼,在驅(qū)動出口函數(shù)中添加了相應的刪除設備節(jié)點相關代碼(相關代碼已加粗)。

          需要注意的是,在進行設備節(jié)點添加時,類的創(chuàng)建要放在設備創(chuàng)建之前;在進行設備節(jié)點刪除時,類的刪除要放在設備刪除之后。

          11.3 運行測試

          11.3.1 編譯驅(qū)動程序

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

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

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

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

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


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



          關鍵詞: 開發(fā)板

          相關推薦

          技術專區(qū)

          關閉