日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

簡(jiǎn)述linux 驅(qū)動(dòng)程序的數(shù)據(jù)封裝

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

掃碼添加小助手

加入工程師交流群

0.引言

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

其中之一就是驅(qū)動(dòng)代碼中設(shè)備描述表-of_device_id。同一個(gè) IP 集成到不同 SoC 或者根據(jù)應(yīng)用場(chǎng)景激活不同功能,可以通過(guò) of_device_id 這個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。

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

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

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

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

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

以上應(yīng)用場(chǎng)景核心的數(shù)據(jù)結(jié)構(gòu)是 of_device_id,關(guān)鍵的處理函數(shù)是 of_device_get_match_data(),當(dāng)然,關(guān)于 of_device_id 的應(yīng)用場(chǎng)景不僅僅限于上面說(shuō)的這兩種。

1.數(shù)據(jù)結(jié)構(gòu) of_device_id

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

1struct of_device_id {

2 char name[32];

3 char type[32];

4 char compatible[128];

5 const void *data;

6};

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

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

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

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

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);

這個(gè)函數(shù)的返回值類型可強(qiáng)制轉(zhuǎn)換成任何類型,取決于驅(qū)動(dòng)程序中例化數(shù)據(jù)結(jié)構(gòu) of_device_id data。當(dāng)然,由于 of_device_get_match_data 的函數(shù)返回值類型決定了不做強(qiáng)制類型轉(zhuǎn)換,也不會(huì)有問(wèn)題。

代碼中增加下面的內(nèi)容,來(lá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í)行結(jié)果顯示正確的獲取到了 of_device_id 各個(gè)成員例化的 value 值

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

#of_device_get_match_data() 代碼流程

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

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

解析 dtb 之后未創(chuàng)建設(shè)備結(jié)點(diǎn)

驅(qū)動(dòng)代碼未實(shí)現(xiàn) of_device_id 設(shè)備表

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

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

3.查看設(shè)備表信息

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

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

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

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

也可以通過(guò) modinfo 來(lái)查看 ko 文件符號(hào)信息!

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

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

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

刪除 MODULE_DEVICE_TABLE,modules.alias 里是沒(méi)有設(shè)備表信息的。

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

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

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

#USB 設(shè)備表

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 設(shè)備表

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};

對(duì)于這兩種類型的設(shè)備,導(dǎo)出的符號(hào)信息和普通設(shè)備也不一樣。

PCI 設(shè)備導(dǎo)出到用戶空間的設(shè)備信息:

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

導(dǎo)出 PCI 設(shè)備信息的代碼

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

USB 設(shè)備導(dǎo)出到用戶空間的設(shè)備信息:

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

導(dǎo)出 USB 設(shè)備信息的代碼

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

除了上面三種設(shè)備描述 table 之外,kernel 還提供了很多種其他的設(shè)備描述表,定義在 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)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    135

    文章

    9596

    瀏覽量

    393843
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8481

    瀏覽量

    286107
  • soc
    soc
    +關(guān)注

    關(guān)注

    40

    文章

    4636

    瀏覽量

    230316
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4423

    瀏覽量

    67880

原文標(biāo)題:linux 驅(qū)動(dòng)程序的數(shù)據(jù)封裝

文章出處:【微信號(hào):gh_3980db2283cd,微信公眾號(hào):開關(guān)電源芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何在 EB Tresos 工作區(qū)中升級(jí) RTD 驅(qū)動(dòng)程序

    我目前在 S32G274A 板上有一個(gè)工作項(xiàng)目,使用 LLCE CAN 驅(qū)動(dòng)程序 (v1.0.2) 和 RTD 驅(qū)動(dòng)程序(以太網(wǎng)、端口、平臺(tái)等)版本 2.0.0。這些驅(qū)動(dòng)程序的 EB Tresos
    發(fā)表于 04-27 07:22

    32g3 有適用于 linux 的 vr5510 驅(qū)動(dòng)程序嗎?

    HI 我正在運(yùn)行帶有linux_yocto映像的 s32g3 VNP-RDB3 板。 s32g3 有適用于 linux 的 vr5510 驅(qū)動(dòng)程序嗎? 我可以看到有支持驅(qū)動(dòng)程序http
    發(fā)表于 04-15 07:14

    Android 11(i.MX8MM,內(nèi)核 5.4.70)– CLANG 的 QCA9377 WiFi 藍(lán)牙驅(qū)動(dòng)程序編譯問(wèn)題求解

    為了啟用 WiFi 功能,我們采用了 QCACLD-2.0 驅(qū)動(dòng)程序: https://github.com/technexion/QCACLD-2.0/tree/tn-cnss.lea.nrt_3.0
    發(fā)表于 04-01 06:12

    在圖像上,Debian 無(wú)法為 wifi 構(gòu)建驅(qū)動(dòng)程序,怎么解決?

    在圖像上,Debian 無(wú)法為 wifi 構(gòu)建驅(qū)動(dòng)程序。缺少一些內(nèi)核包。是否可以發(fā)布它,我們可以通過(guò) apt 安裝它?所以我們對(duì)系統(tǒng)無(wú)能為力 無(wú)論我愿意什么,都是不可能的。這讓我很生氣。 make
    發(fā)表于 03-25 06:00

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核平臺(tái)抽線共和設(shè)備驅(qū)動(dòng)程序

    \"; vcc-supply = <&vdd_3v3>; wakeup-source; }; }; 設(shè)備、驅(qū)動(dòng)程序和平臺(tái)抽象簡(jiǎn)介 LDM是Linux內(nèi)核
    發(fā)表于 02-03 21:57

    【書籍評(píng)測(cè)活動(dòng)NO.67】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》

    ——這便是《Linux 設(shè)備驅(qū)動(dòng)開發(fā)》。本書從基礎(chǔ)知識(shí)出發(fā),分專題透徹講解Linux環(huán)境下的設(shè)備驅(qū)動(dòng)開發(fā)知識(shí),幫助讀者從零構(gòu)建驅(qū)動(dòng)程序。如今
    發(fā)表于 11-17 17:52

    摩爾線程發(fā)布圖形顯卡驅(qū)動(dòng)程序v310.120

    8月20日,摩爾線程發(fā)布版本號(hào)為v310.120的圖形顯卡驅(qū)動(dòng)程序。本次更新帶來(lái)多項(xiàng)重大技術(shù)升級(jí):新增對(duì)Windows 11 24H2版本的正式支持,WDDM驅(qū)動(dòng)同步升級(jí)至3.2版本。同時(shí),新驅(qū)動(dòng)
    的頭像 發(fā)表于 08-21 16:07 ?1689次閱讀

    如何將 GPIO PWM 和 GPIO Capture 驅(qū)動(dòng)程序導(dǎo)入 Linux 內(nèi)核,實(shí)現(xiàn) PWM 輸出并檢測(cè)引腳的變化狀態(tài)?

    如何將 GPIO PWM 和 GPIO Capture 驅(qū)動(dòng)程序導(dǎo)入 Linux 內(nèi)核,實(shí)現(xiàn) PWM 輸出并檢測(cè)引腳的變化狀態(tài)
    發(fā)表于 08-20 08:20

    如何使 ML56-TK 驅(qū)動(dòng)程序適應(yīng) Linux 內(nèi)核?

    如何使 ML56-TK 驅(qū)動(dòng)程序適應(yīng) Linux 內(nèi)核
    發(fā)表于 08-20 07:57

    為FreeRTOS增加新的設(shè)備驅(qū)動(dòng)程序

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

    zephyr設(shè)備驅(qū)動(dòng)程序模型

    ? ? 1:Zephyr 內(nèi)核支持多種設(shè)備驅(qū)動(dòng)程序。驅(qū)動(dòng)程序是否可用取決于board 和驅(qū)動(dòng)程序。 Zephyr 設(shè)備模型為配置作為系統(tǒng)一部分的驅(qū)動(dòng)程序提供了一致的設(shè)備模型。設(shè)備型號(hào)負(fù)
    的頭像 發(fā)表于 07-29 10:34 ?868次閱讀
    zephyr設(shè)備<b class='flag-5'>驅(qū)動(dòng)程序</b>模型

    求助,關(guān)于55513 Linux驅(qū)動(dòng)程序問(wèn)題求解

    ; 我們使用 linux 內(nèi)核 5.4 來(lái)構(gòu)建 fmac 驅(qū)動(dòng)程序,但是當(dāng) insmod ko 文件時(shí) brcmfmac 將失敗:brcmfmac:brcmf_sdio_htclk:訪問(wèn)關(guān)閉時(shí)鐘失敗
    發(fā)表于 07-09 08:02

    如何安裝 CY7C65213 的驅(qū)動(dòng)程序?

    無(wú)法連接 teraterm。 我嘗試安裝 CypressDriverInstaller_1,但是驅(qū)動(dòng)程序沒(méi)有更新。 你能指導(dǎo)如何安裝 CY7C65213 的驅(qū)動(dòng)程序嗎?
    發(fā)表于 05-27 07:58

    CY4500 EZ-PD協(xié)議分析儀缺少驅(qū)動(dòng)程序怎么解決?

    Win10 CY4500 Analyzer 4.0.0 安裝程序似乎不包含硬件驅(qū)動(dòng)程序。固件更新實(shí)用程序或 CY4500 產(chǎn)品頁(yè)面上的支持部分也是如此。顯然沒(méi)有驅(qū)動(dòng)程序
    發(fā)表于 05-23 06:43

    是否有辦法用標(biāo)準(zhǔn)Windows驅(qū)動(dòng)程序控制GPIO嗎?

    關(guān)于 CY7C65213-28PVXI 的控制, 我正在考慮更改 VenderID 并使用標(biāo)準(zhǔn) Windows 驅(qū)動(dòng)程序對(duì)其進(jìn)行控制。 但是,使用標(biāo)準(zhǔn) Windows 驅(qū)動(dòng)程序存在一個(gè)
    發(fā)表于 05-08 07:05
    新干县| 东乌珠穆沁旗| 杭锦旗| 尼勒克县| 呼和浩特市| 青冈县| 洪江市| 广元市| 大连市| 汉源县| 天水市| 会昌县| 南丹县| 闽侯县| 盖州市| 应城市| 晋城| 高平市| 大港区| 云和县| 民和| 汉中市| 沙河市| 洪泽县| 本溪| 沈丘县| 子洲县| 洞头县| 怀集县| 宜兰市| 信丰县| 天镇县| 繁峙县| 土默特左旗| 无极县| 城步| 华蓥市| 大连市| 深水埗区| 米林县| 洪江市|