国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

簡述linux 驅動程序的數據封裝

開關電源芯片 ? 來源:Linux與SoC ? 作者:spy_os ? 2021-08-14 11:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

0.引言

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

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

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

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

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

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

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

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

1.數據結構 of_device_id

of_device_id 數據結構如下,定義在 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 這個數據結構,該文件的歷史暫時也只能查到 2005 年的 Linux-2.6.12-rc2

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

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

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

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

2.of_device_get_match_data()

函數原型位于 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);

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

代碼中增加下面的內容,來追蹤 of_device_get_match_data 執行流程。

#定義 of_device_id 并完成例化

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

#在 probe 函數中增加獲取數據的代碼

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

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

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

#of_device_get_match_data() 代碼流程

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

有幾種情況是無法獲取到數據的

解析 dtb 之后未創建設備結點

驅動代碼未實現 of_device_id 設備表

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

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

3.查看設備表信息

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

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

內核中 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

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

    關注

    135

    文章

    9553

    瀏覽量

    391915
  • usb
    usb
    +關注

    關注

    60

    文章

    8440

    瀏覽量

    284546
  • soc
    soc
    +關注

    關注

    40

    文章

    4576

    瀏覽量

    229154
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67521

原文標題:linux 驅動程序的數據封裝

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】Linux內核平臺抽線共和設備驅動程序

    \"; vcc-supply = <&vdd_3v3>; wakeup-source; }; }; 設備、驅動程序和平臺抽象簡介 LDM是Linux內核
    發表于 02-03 21:57

    【書籍評測活動NO.67】成為硬核Linux開發者:《Linux 設備驅動開發(第 2 版)》

    ——這便是《Linux 設備驅動開發》。本書從基礎知識出發,分專題透徹講解Linux環境下的設備驅動開發知識,幫助讀者從零構建驅動程序。如今
    發表于 11-17 17:52

    如何將 GPIO PWM 和 GPIO Capture 驅動程序導入 Linux 內核,實現 PWM 輸出并檢測引腳的變化狀態?

    如何將 GPIO PWM 和 GPIO Capture 驅動程序導入 Linux 內核,實現 PWM 輸出并檢測引腳的變化狀態
    發表于 08-20 08:20

    如何使 ML56-TK 驅動程序適應 Linux 內核?

    如何使 ML56-TK 驅動程序適應 Linux 內核
    發表于 08-20 07:57

    為FreeRTOS增加新的設備驅動程序

    如果你正在使用FreeRTOS構建嵌入式系統,并且考慮添加新的設備驅動程序,那么這篇文章很適合你。高效的設備集成不僅僅是讓設備功能正常運行——更關乎模塊化、可靠性和安全性。
    的頭像 發表于 08-06 15:44 ?990次閱讀
    為FreeRTOS增加新的設備<b class='flag-5'>驅動程序</b>

    zephyr設備驅動程序模型

    ? ? 1:Zephyr 內核支持多種設備驅動程序驅動程序是否可用取決于board 和驅動程序。 Zephyr 設備模型為配置作為系統一部分的驅動程序提供了一致的設備模型。設備型號負
    的頭像 發表于 07-29 10:34 ?698次閱讀
    zephyr設備<b class='flag-5'>驅動程序</b>模型

    求助,關于55513 Linux驅動程序問題求解

    ; 我們使用 linux 內核 5.4 來構建 fmac 驅動程序,但是當 insmod ko 文件時 brcmfmac 將失敗:brcmfmac:brcmf_sdio_htclk:訪問關閉時鐘失敗
    發表于 07-09 08:02

    如何安裝 CY7C65213 的驅動程序

    無法連接 teraterm。 我嘗試安裝 CypressDriverInstaller_1,但是驅動程序沒有更新。 你能指導如何安裝 CY7C65213 的驅動程序嗎?
    發表于 05-27 07:58

    CY4500 EZ-PD協議分析儀缺少驅動程序怎么解決?

    Win10 CY4500 Analyzer 4.0.0 安裝程序似乎不包含硬件驅動程序。固件更新實用程序或 CY4500 產品頁面上的支持部分也是如此。顯然沒有驅動程序
    發表于 05-23 06:43

    是否有辦法用標準Windows驅動程序控制GPIO嗎?

    關于 CY7C65213-28PVXI 的控制, 我正在考慮更改 VenderID 并使用標準 Windows 驅動程序對其進行控制。 但是,使用標準 Windows 驅動程序存在一個
    發表于 05-08 07:05

    Linux環境再升級:PLIN驅動程序正式發布

    PLIN驅動程序現已正式發布,本文將展示如何安裝PLIN驅動程序,以及如何在Linux環境下進行基本的PLIN通信操作,確保您能夠快速掌握并應用這一新工具。
    的頭像 發表于 04-21 15:29 ?1060次閱讀
    <b class='flag-5'>Linux</b>環境再升級:PLIN<b class='flag-5'>驅動程序</b>正式發布

    如何使用MCAL的TJA1145實現驅動程序

    你好: 我希望使用 MCAL 的 TJA1145 實現驅動程序,您能幫我嗎
    發表于 04-03 06:50

    RTC芯片有Linux PCA2131驅動程序嗎?

    RTC 芯片有 Linux PCA2131驅動程序嗎? 1) 如果沒有,我可以使用任何兼容的驅動程序驅動這個 RTC 芯片嗎? 2) 如果是,我在哪里可以找到它?
    發表于 03-31 06:22

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-Linux設備驅動的分類

    Drivers):這類驅動程序用于支持網絡接口卡(NIC)和其他網絡設備。它們負責管理數據包的傳輸、網絡連接和協議處理等功能。Linux設備驅動與整個軟硬件系統的關系從上圖可以看出,
    發表于 03-12 10:20

    飛凌嵌入式ElfBoard ELF 1板卡-Linux設備驅動的分類

    Drivers):這類驅動程序用于支持網絡接口卡(NIC)和其他網絡設備。它們負責管理數據包的傳輸、網絡連接和協議處理等功能。Linux設備驅動與整個軟硬件系統的關系從上圖可以看出,
    發表于 03-10 17:00