色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

簡述linux 驅動程序的數(shù)據(jù)封裝

開關電源芯片 ? 來源:Linux與SoC ? 作者:spy_os ? 2021-08-14 11:34 ? 次閱讀

0.引言

基于 ARM 內(nèi)核的 SoC 在引入設備樹技術之后,通過設備樹文件來描述不同的設備并匹配不同的驅動代碼,使得一個 kernel 鏡像文件可以支持多種設備。這種代碼可重用的思想不僅體現(xiàn)在設備樹文件中,在驅動代碼中同樣也有所體現(xiàn)。

其中之一就是驅動代碼中設備描述表-of_device_id。同一個 IP 集成到不同 SoC 或者根據(jù)應用場景激活不同功能,可以通過 of_device_id 這個數(shù)據(jù)結構來實現(xiàn)。

對于同一個 IP 集成到不同 SoC 的應用場景而言,其寄存器基地址以及時鐘參數(shù)可能不同,但是 IP 功能基本一樣。那么可以通過 of_device_id 里的不同 data 條目獲取對應的參數(shù)信息。例如 exynos 的 dsi IP,在不同版本的 SoC 中基地址不同,定義了 5 種 SoC 類型。在 dsi probe 時獲取其在 SoC 中的基地址。

a3718f80-fc4b-11eb-9bcf-12bb97331649.png

a3a6fc88-fc4b-11eb-9bcf-12bb97331649.png

下面驅動代碼表示該模塊需要支持多種不同時鐘頻率的初始化,可以定義一個 of_device_id 表,根據(jù)匹配到的設備信息為每一種時鐘提供獨立的初始化函數(shù)。由 of_device_id_match_data 獲取到不同的 init_fn,按照不同的 dev.of_node,執(zhí)行 return init_fn(np);

a4da811a-fc4b-11eb-9bcf-12bb97331649.png

以上應用場景核心的數(shù)據(jù)結構是 of_device_id,關鍵的處理函數(shù)是 of_device_get_match_data(),當然,關于 of_device_id 的應用場景不僅僅限于上面說的這兩種。

1.數(shù)據(jù)結構 of_device_id

of_device_id 數(shù)據(jù)結構如下,定義在 mod_devicetable.h 中,組成也并不復雜。

1struct of_device_id {

2 char name[32];

3 char type[32];

4 char compatible[128];

5 const void *data;

6};

mod_devicetable.h 這個文件最初并沒有 of_device_id 這個數(shù)據(jù)結構,該文件的歷史暫時也只能查到 2005 年的 Linux-2.6.12-rc2

a53c80c2-fc4b-11eb-9bcf-12bb97331649.png

它的功能從最初的文件中也可以看到,主要是為 PCI 以及 USB 設備使用的,將設備的 vendor ID、subsystem ID、class 等信息提供給 scripts/table2alias.c,當系統(tǒng)新插入一個 PCI 或 USB 設備時,用戶空間程序根據(jù)對應的 vendor ID 等信息來加載對應的驅動程序。

2005 年 7 月 Linux-2.6.13-rc2 中提交了 of_match_id 這個數(shù)據(jù)結構的代碼。

a551b2da-fc4b-11eb-9bcf-12bb97331649.png

2.of_device_get_match_data()

函數(shù)原型位于 drivers/of/device.c

1const void *of_device_get_match_data(

2 const struct device *dev)

3{

4 const struct of_device_id *match;

5

6 match = of_match_device(xxx);

7 if (!match)

8 return NULL;

9

10 return match-》data;

11}

12EXPORT_SYMBOL(of_device_get_match_data);

這個函數(shù)的返回值類型可強制轉換成任何類型,取決于驅動程序中例化數(shù)據(jù)結構 of_device_id data。當然,由于 of_device_get_match_data 的函數(shù)返回值類型決定了不做強制類型轉換,也不會有問題。

代碼中增加下面的內(nèi)容,來追蹤 of_device_get_match_data 執(zhí)行流程。

#定義 of_device_id 并完成例化

a694184a-fc4b-11eb-9bcf-12bb97331649.png

#在 probe 函數(shù)中增加獲取數(shù)據(jù)的代碼

a7176844-fc4b-11eb-9bcf-12bb97331649.png

執(zhí)行結果顯示正確的獲取到了 of_device_id 各個成員例化的 value 值

a7510c34-fc4b-11eb-9bcf-12bb97331649.png

#of_device_get_match_data() 代碼流程

a7784c04-fc4b-11eb-9bcf-12bb97331649.png

有幾種情況是無法獲取到數(shù)據(jù)的

解析 dtb 之后未創(chuàng)建設備結點

驅動代碼未實現(xiàn) of_device_id 設備表

of_device_id 成員 compatible、name、type 的值和設備樹中定義的同

基于模塊加載的并且可以熱插拔的驅動程序,可以在系統(tǒng)啟動后查看設備表信息。以定位出未獲取到設備表信息的故障原因。

3.查看設備表信息

能夠查看到設備表信息的一個前置條件是在定義 of_device_id 的時候,要將該設備表通過 MODULE_DEVICE_TABLE 來進行聲明注冊,否則在用戶空間是看不到的。其定義在/include/linux/module.h 中。type 可以是 of、usb、pci 等,name 為設備表的名字。

a7f6127e-fc4b-11eb-9bcf-12bb97331649.png

內(nèi)核中 scripts/mod/file2alias.c,用于將設備表導出到用戶空間 modules.alias 中,所以可以直接查看 modules.alias 文件。

a84db114-fc4b-11eb-9bcf-12bb97331649.png

也可以通過 modinfo 來查看 ko 文件符號信息!

a8b86b3a-fc4b-11eb-9bcf-12bb97331649.png

設備表的定義如下,代碼定義了 name、type,那么設備樹里同樣也要定義:

a9455112-fc4b-11eb-9bcf-12bb97331649.png

刪除 MODULE_DEVICE_TABLE,modules.alias 里是沒有設備表信息的。

a954c796-fc4b-11eb-9bcf-12bb97331649.png

對于 of_device_id 而言,name、type、compatible 添加的方法:

a9784482-fc4b-11eb-9bcf-12bb97331649.png

#USB 設備表

1struct usb_device_id {

2 /* which fields to match against? */

3 __u16 match_flags;

4

5 /* Used for product specific matches; range is inclusive */

6 __u16 idVendor;

7 __u16 idProduct;

8 __u16 bcdDevice_lo;

9 __u16 bcdDevice_hi;

10

11 /* Used for device class matches */

12 __u8 bDeviceClass;

13 __u8 bDeviceSubClass;

14 __u8 bDeviceProtocol;

15

16 /* Used for interface class matches */

17 __u8 bInterfaceClass;

18 __u8 bInterfaceSubClass;

19 __u8 bInterfaceProtocol;

20

21 /* Used for vendor-specific interface matches */

22 __u8 bInterfaceNumber;

23

24 /* not matched against */

25 kernel_ulong_t driver_info

26 __attribute__((aligned(sizeof(kernel_ulong_t))));

27};

#PCI 設備表

1struct pci_device_id {

2 __u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/

3 __u32 subvendor, subdevice; /* Subsystem ID‘s or PCI_ANY_ID */

4 __u32 class, class_mask; /* (class,subclass,prog-if) triplet */

5 kernel_ulong_t driver_data; /* Data private to the driver */

6};

對于這兩種類型的設備,導出的符號信息和普通設備也不一樣。

PCI 設備導出到用戶空間的設備信息:

aa0d2f3e-fc4b-11eb-9bcf-12bb97331649.png

導出 PCI 設備信息的代碼

aa66d8ea-fc4b-11eb-9bcf-12bb97331649.png

USB 設備導出到用戶空間的設備信息:

aaba9d9a-fc4b-11eb-9bcf-12bb97331649.png

導出 USB 設備信息的代碼

ab7ded72-fc4b-11eb-9bcf-12bb97331649.png

除了上面三種設備描述 table 之外,kernel 還提供了很多種其他的設備描述表,定義在 include/linux/mod_devicetable.h

mod_devicetable.h 的 commit log:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/include/linux/mod_devicetable.h

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9156

    瀏覽量

    368554
  • usb
    usb
    +關注

    關注

    60

    文章

    7978

    瀏覽量

    265546
  • soc
    soc
    +關注

    關注

    38

    文章

    4196

    瀏覽量

    218780
  • 函數(shù)
    +關注

    關注

    3

    文章

    4345

    瀏覽量

    62867

原文標題:linux 驅動程序的數(shù)據(jù)封裝

文章出處:【微信號:gh_3980db2283cd,微信公眾號:開關電源芯片】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    適用于Oracle的ODBC驅動程序

    Linux 上符合 ODBC 標準的報告、分析、BI 和 ETL 工具訪問 Oracle 數(shù)據(jù)庫。我們的 ODBC 驅動程序完全支持標準 ODBC API 功能和數(shù)據(jù)類型,并支持
    的頭像 發(fā)表于 01-13 09:17 ?86次閱讀

    適用于Oracle的dbExpress驅動程序

    (包括社區(qū)版)快速訪問 Oracle macOS(32 位和 64 位)和 Linux(64 位)平臺。對于此服務器,dbExpress 將驅動程序作為實現(xiàn)通用 dbExpress 的獨立庫提供 用于
    的頭像 發(fā)表于 01-09 16:04 ?94次閱讀
    適用于Oracle的dbExpress<b class='flag-5'>驅動程序</b>

    Linux驅動程序程序員指南

    電子發(fā)燒友網(wǎng)站提供《Linux驅動程序程序員指南.pdf》資料免費下載
    發(fā)表于 11-22 15:53 ?0次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>驅動程序</b><b class='flag-5'>程序</b>員指南

    pcie設備驅動程序安裝步驟

    設備能夠正常工作的重要步驟。 1. 準備工作 在開始安裝PCIe設備驅動程序之前,需要做一些準備工作: 確認設備兼容性 :確保你的PCIe設備與你的操作系統(tǒng)兼容。 備份數(shù)據(jù) :在安裝任何驅動程序之前,備份重要
    的頭像 發(fā)表于 11-13 10:32 ?1233次閱讀

    Wilink8 Linux Wi-Fi驅動程序R8.8版用戶指南

    電子發(fā)燒友網(wǎng)站提供《Wilink8 Linux Wi-Fi驅動程序R8.8版用戶指南.pdf》資料免費下載
    發(fā)表于 11-05 09:19 ?0次下載
    Wilink8 <b class='flag-5'>Linux</b> Wi-Fi<b class='flag-5'>驅動程序</b>R8.8版用戶指南

    用于bq275xx電量計的WinCE/Linux驅動程序

    電子發(fā)燒友網(wǎng)站提供《用于bq275xx電量計的WinCE/Linux驅動程序.pdf》資料免費下載
    發(fā)表于 10-17 11:17 ?0次下載
    用于bq275xx電量計的WinCE/<b class='flag-5'>Linux</b><b class='flag-5'>驅動程序</b>

    LSP 2.10 DaVinci Linux驅動程序

    電子發(fā)燒友網(wǎng)站提供《LSP 2.10 DaVinci Linux驅動程序.pdf》資料免費下載
    發(fā)表于 10-09 09:30 ?0次下載
    LSP 2.10 DaVinci <b class='flag-5'>Linux</b><b class='flag-5'>驅動程序</b>

    Linux設備驅動程序分類有哪些

    Linux設備驅動程序是操作系統(tǒng)與硬件設備之間的橋梁,負責實現(xiàn)硬件設備與操作系統(tǒng)之間的通信和控制。Linux設備驅動程序的分類繁多,可以根據(jù)不同的標準進行分類。 按硬件類型分類
    的頭像 發(fā)表于 08-30 15:11 ?660次閱讀

    linux驅動程序如何加載進內(nèi)核

    Linux系統(tǒng)中,驅動程序是內(nèi)核與硬件設備之間的橋梁。它們允許內(nèi)核與硬件設備進行通信,從而實現(xiàn)對硬件設備的控制和管理。 驅動程序的編寫 驅動程序的編寫是
    的頭像 發(fā)表于 08-30 15:02 ?558次閱讀

    linux驅動程序主要有哪些功能

    Linux驅動程序是操作系統(tǒng)與硬件設備之間進行通信的橋梁,負責實現(xiàn)硬件設備與操作系統(tǒng)之間的數(shù)據(jù)交換和控制。Linux驅動程序的主要功能包括以
    的頭像 發(fā)表于 08-30 14:47 ?428次閱讀

    linux驅動程序的編譯方法是什么

    Linux驅動程序的編譯方法主要包括兩種: 與內(nèi)核一起編譯 和 編譯成獨立的內(nèi)核模塊 。以下是對這兩種方法的介紹: 一、與內(nèi)核一起編譯 與內(nèi)核一起編譯意味著將驅動程序的源代碼直接集成到Linu
    的頭像 發(fā)表于 08-30 14:46 ?736次閱讀

    linux驅動程序的編譯方法有哪兩種

    Linux驅動程序的編譯方法主要可以歸納為兩種: 手動編譯 和 使用內(nèi)核構建系統(tǒng)(Makefile)自動編譯 。 1. 手動編譯 手動編譯驅動程序通常涉及直接使用GCC(GNU Compiler
    的頭像 發(fā)表于 08-30 14:39 ?872次閱讀

    linux驅動程序運行在什么空間

    Linux 驅動程序是操作系統(tǒng)的一部分,負責管理硬件設備與操作系統(tǒng)之間的交互。驅動程序運行在內(nèi)核空間(Kernel Space),這是操作系統(tǒng)的核心部分,與用戶空間(User Space)相對。內(nèi)核
    的頭像 發(fā)表于 08-30 14:37 ?491次閱讀

    虹科技術 Linux環(huán)境再升級:PLIN驅動程序正式發(fā)布

    Linux驅動程序領域再添新成員,PLIN驅動程序現(xiàn)已正式發(fā)布。
    的頭像 發(fā)表于 06-28 13:34 ?395次閱讀
    虹科技術 <b class='flag-5'>Linux</b>環(huán)境再升級:PLIN<b class='flag-5'>驅動程序</b>正式發(fā)布

    怎么編寫Framebuffer驅動程序

    Framebuffer 驅動程序框架 分為上下兩層: fbmem.c:承上啟下 實現(xiàn)、注冊 file_operations 結構體 把 APP 的調(diào)用向下轉發(fā)到具體的硬件驅動程序
    的頭像 發(fā)表于 03-22 09:13 ?601次閱讀
    怎么編寫Framebuffer<b class='flag-5'>驅動程序</b>
    主站蜘蛛池模板: 美国ZOOM动物在线观看| 在线电台收听| 高H各种PLAY全肉NP| 亚洲AV色香蕉一区二区三区| 果冻传媒AV精品一区| 在线播放午夜理论片| 欧美一区二区高清| 国产亚洲日韩在线播放不卡| 伊人影院综合| 最美女人体内射精一区二区| 国产人妻人伦精品久久无码| 一抽一出BGM免费3分钟| 狠狠干2022| 99精品视频| 亚洲风情无码免费视频| 国产精品乱人无码伦AV在线A| 亚洲一区精品在线| 人妻免费久久久久久久了| 国产无遮挡又黄又爽在线视频| 97在线视频免费| 亚洲精品久久久久久久蜜臀老牛| 美娇妻的性奴史1一4| 国产精品-区区久久久狼| 97国产精品人妻无码免费| 性欧美FREE少妇XXX| 欧美色图天堂网| 干极品美女| 60老妇性xxxxhd| 亚洲精品无码葡京AV天堂| 日本久久精品免视看国产成人| 久久国产精品久久国产精品| 国产高清精品国语特黄A片| 午夜DJ国产精华日本无码| 免费a毛片| 精品无码一区二区三区中文字幕| 成片免费观看视频在线网| 中文字幕日本久久2019| 亚洲 欧美 制服 校园 动漫| 全彩acg无翼乌火影忍者| 老板揉搓秘书丰满大乳| 黑吊大战白女出浆|