<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)指南|第二篇 字符設備基礎-第16章 一個(gè)驅動(dòng)兼容不同設備實(shí)驗

RK3568驅動(dòng)指南|第二篇 字符設備基礎-第16章 一個(gè)驅動(dòng)兼容不同設備實(shí)驗

發(fā)布人:紅李亞 時(shí)間:2024-04-17 來(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è)。

第16章 一個(gè)驅動(dòng)兼容不同設備實(shí)驗
在Linux中,使用主設備號來(lái)表示對應某一類(lèi)驅動(dòng),使用次設備號來(lái)表示這類(lèi)驅動(dòng)下的各個(gè)設備。假如現在驅動(dòng)要支持的主設備號相同,但是次設備號不同的設備。驅動(dòng)程序要怎樣編寫(xiě)呢,上一章節學(xué)習的私有數據private_date在此時(shí)就派上了用場(chǎng),具體是怎樣使用的呢,多個(gè)設備是如何在一個(gè)驅動(dòng)中兼容的呢,帶著(zhù)疑問(wèn),讓我們開(kāi)始本章節的學(xué)習吧。

16.1 container_of函數簡(jiǎn)介
container_of在Linux內核中是一個(gè)常用的宏,用于從包含在某個(gè)結構中的指針獲得結構本身的指針,通俗地講就是通過(guò)結構體變量中某個(gè)成員的首地址進(jìn)而獲得整個(gè)結構體變量的首地址。那么可以使用這個(gè)函數獲取不同設備的地址,來(lái)對不同的設備進(jìn)行操作,從而一個(gè)驅動(dòng)可以兼容不同的設備。

container_of

函數原型:

container_of(ptr,type,member)

函數作用:

通過(guò)結構體變量中某個(gè)成員的首地址獲取到整個(gè)結構體變量的首地址。

參數含義:

ptr是結構體變量中某個(gè)成員的地址。

type是結構體的類(lèi)型

member是該結構體變量的具體名字

container_of宏的作用是通過(guò)結構體內某個(gè)成員變量的地址和該變量名,以及結構體類(lèi)型。找到該結構體變量的地址。

16.2 實(shí)驗程序編寫(xiě)
16.2.1 驅動(dòng)程序編寫(xiě)
本驅動(dòng)程序對應的網(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)例程\11\module。

本章實(shí)驗將使用container_of函數編寫(xiě)一個(gè)驅動(dòng)兼容不同設備的實(shí)例代碼,編寫(xiě)完成的代碼如下所示:

  

  

16.2.2 編寫(xiě)測試 APP
本應用程序對應的網(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)例程\11\app。

編寫(xiě)應用程序,打開(kāi)生成的倆個(gè)設備,并向倆個(gè)設備中寫(xiě)入數據,編寫(xiě)完成的應用程序app.c代碼如下所示:

 16.3 運行測試

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

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

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

  16.3 運行測試

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

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

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

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

  編譯完生成 file.ko目標文件,如下圖(圖16-3)所示:

  至此我們的驅動(dòng)模塊就編譯成功了,下面進(jìn)行應用程序編譯

16.3.2 編譯應用程序
因為測試APP是要在開(kāi)發(fā)板上運行的,所以需要aarch64-linux-gnu-gcc來(lái)編譯,輸入以下命令,編譯完成以后會(huì )生成一個(gè)app的可執行程序,如下圖(圖 16-4)所示:

aarch64-linux-gnu-gcc app.c -o app

  下面進(jìn)行驅動(dòng)程序的測試。

16.3.2 運行測試
驅動(dòng)模塊file.ko和測試程序app都已經(jīng)準備好了,接下來(lái)就是運行測試。

輸入以下命令加載驅動(dòng)模塊,如下圖(圖 16-6)所示:

insmod file.ko

  驅動(dòng)加載成功之后會(huì )生成/dev/test1和/dev/test2設備驅動(dòng)文件,輸入以下命令查看設備,可以看到一個(gè)驅動(dòng)創(chuàng )建并管理了多個(gè)驅動(dòng)設備,如下圖(圖 16-8)所示:

  運行應用程序,如下(圖 16-10)所示:

  如上圖所示,可以看到用戶(hù)順利向倆個(gè)設備寫(xiě)入數據,且每個(gè)設備擁有私有數據。


*博客內容為網(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>