www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式藝術(shù)
[導(dǎo)讀]Linux內(nèi)核是從V2.6開(kāi)始引入設(shè)備樹(shù)的概念,其起源于OF:OpenFirmware, 用于描述一個(gè)硬件平臺(tái)的硬件資源信息,這些信息包括:CPU的數(shù)量和類別、內(nèi)存基地址和大小、總線和橋、外設(shè)連接、中斷控制器和中斷使用情況、GPIO控制器和GPIO使用情況、Clock控制器和Clock使用情況等等。



Linux設(shè)備樹(shù)概念
DTS

Linux內(nèi)核是從V2.6開(kāi)始引入設(shè)備樹(shù)的概念,其起源于OF:OpenFirmware, 用于描述一個(gè)硬件平臺(tái)的硬件資源信息,這些信息包括:CPU的數(shù)量和類別、內(nèi)存基地址和大小、總線和橋、外設(shè)連接、中斷控制器和中斷使用情況、GPIO控制器和GPIO使用情況、Clock控制器和Clock使用情況等等。


官方說(shuō)明

The "Open Firmware Device Tree", or simply Device Tree (DT), is a data structure and language for describing hardware.

設(shè)備樹(shù)是一種數(shù)據(jù)結(jié)構(gòu)和一種用于描述硬件信息的語(yǔ)言。


設(shè)備樹(shù)的特點(diǎn)

  • 實(shí)現(xiàn)驅(qū)動(dòng)代碼與設(shè)備硬件信息相分離

  • 通過(guò)被bootloader(uboot)和Linux傳遞到內(nèi)核, 內(nèi)核可以從設(shè)備樹(shù)中獲取對(duì)應(yīng)的硬件信息。

  • 對(duì)于同一SOC的不同主板,只需更換設(shè)備樹(shù)文件即可實(shí)現(xiàn)不同主板的無(wú)差異支持,而無(wú)需更換內(nèi)核文件,實(shí)現(xiàn)了內(nèi)核和不同板級(jí)硬件數(shù)據(jù)的拆分。



設(shè)備樹(shù)的由來(lái)

明白了設(shè)備樹(shù)的概念,不妨思考一下:為什么要引入設(shè)備樹(shù)?

在Linux內(nèi)核v2.6版本以前,ARM架構(gòu)用于描述不同的硬件信息的文件都存放在arch/arm/plat-xxx和arch/arm/mach-xxx文件夾下,如下:

在這些文件內(nèi),都是通過(guò)手動(dòng)定義不同的硬件設(shè)備,步驟非常繁瑣

這樣就導(dǎo)致了Linux內(nèi)核代碼中充斥著大量的垃圾代碼,因?yàn)椴煌陌寮?jí)他們的硬件信息都不相同,這些都是硬件特有的信息,對(duì)內(nèi)核而言沒(méi)有任何的意義,但是往往這部分代碼特別的多,造成內(nèi)核的冗余。

設(shè)備樹(shù)的引入就是為了解決這個(gè)問(wèn)題,通過(guò)引入設(shè)備樹(shù),我們可以直接通過(guò)它來(lái)傳遞給Linux,而不再需要內(nèi)核中大量的垃圾代碼。



設(shè)備樹(shù)組成

整個(gè)設(shè)備樹(shù)牽涉面比較廣,即增加了新的用于描述設(shè)備硬件信息的文本格式,又增加了編譯這個(gè)文本的工具,同時(shí)還得支持Bootloader解析設(shè)備樹(shù),并將信息傳遞給內(nèi)核。

整個(gè)設(shè)備樹(shù)包含DTC(device tree compiler),DTS(device tree source)和DTB(device tree blob)。

  • DTS(device tree source)

DTS是一種ASCII文本格式的設(shè)備樹(shù)描述,在ARM Linux中,一個(gè)dts文件對(duì)應(yīng)一個(gè)ARM的設(shè)備,該文件一般放在arch/arm/boot/dts/目錄中。

當(dāng)然,我們還會(huì)看到一些dtsi文件,這些文件有什么用呢?

Dtsi:由于一個(gè)SoC可能對(duì)應(yīng)多個(gè)設(shè)備(一個(gè)SoC可以對(duì)應(yīng)多個(gè)產(chǎn)品和電路板),這些.dts文件勢(shì)必須包含許多共同的部分,Linux內(nèi)核為了簡(jiǎn)化,把SoC公用的部分或者多個(gè)設(shè)備共同的部分一般提煉為.dtsi,類似于C語(yǔ)言的頭文件。其他的設(shè)備對(duì)應(yīng)的.dts就包括這個(gè).dtsi 。

  • DTC(device tree compiler)

DTC是將.dts編譯為.dtb的工具,相當(dāng)于gcc。

DTC的源代碼位于內(nèi)核的scripts/dtc目錄中, 在Linux內(nèi)核使能了設(shè)備樹(shù)的情況下, 編譯內(nèi)核的時(shí)候,工具DTC會(huì)被編譯出來(lái), 對(duì)應(yīng)于scripts/dtc/Makefile中hostprogs-y:=dtc這一編譯目標(biāo)。

該工具一般在編譯內(nèi)核的時(shí)候,默認(rèn)會(huì)自動(dòng)執(zhí)行編譯操作,如果我們想單獨(dú)編譯設(shè)備樹(shù),該怎么辦呢?

兩條編譯命令:

將dts文件編譯為dtb:

											

dtc -I dts -O dtb xxx.dtb xxx.dts

將dtb文件反編譯為dts:

										

dtc -I dtb -O dts xxx.dts xxx.dtb

  • DTB(device tree blob)

dtb文件是.dts 被 DTC 編譯后的二進(jìn)制格式的設(shè)備樹(shù)文件,它由Linux內(nèi)核解析,也可以被bootloader進(jìn)行解析。

通常在我們?yōu)殡娐钒逯谱鱊AND、SD啟動(dòng)映像時(shí),會(huì)為.dtb文件單獨(dú)留下一個(gè)很小的區(qū)域以存放之,之后bootloader在引導(dǎo)內(nèi)核的過(guò)程中,會(huì)先讀取該.dtb到內(nèi)存。

總之,三者關(guān)系如下



設(shè)備樹(shù)語(yǔ)法

dts文件是一種ASCII文本格式的設(shè)備樹(shù)描述,它有以下幾種特性:

  • 每個(gè)設(shè)備樹(shù)文件都有一個(gè)根節(jié)點(diǎn),每個(gè)設(shè)備都是一個(gè)節(jié)點(diǎn)。

  • 節(jié)點(diǎn)間可以嵌套,形成父子關(guān)系,這樣就可以方便的描述設(shè)備間的關(guān)系。

  • 每個(gè)設(shè)備的屬性都用一組key-value對(duì)(鍵值對(duì))來(lái)描述。

  • 每個(gè)屬性的描述用;結(jié)束

記住上面的幾個(gè)核心特性,往下看!

4.1數(shù)據(jù)格式

																		

/dts-v1/; / { node1 { a-string-property = "A string"; a-string-list-property = "first string", "second string"; // hex is implied in byte arrays. no '0x' prefix is required a-byte-data-property = [01 23 34 56]; child-node1 { first-child-property; second-child-property =; a-string-property = "Hello, world"; }; child-node2 { }; }; node2 { an-empty-property; a-cell-property =; /* each number (cell) is a uint32 */ child-node1 { }; }; };

  • /:表示根節(jié)點(diǎn)

  • node1、node2:表示根節(jié)點(diǎn)下的兩個(gè)子節(jié)點(diǎn)

  • child-node1、child-node2:表示子節(jié)點(diǎn)node1下的兩個(gè)子節(jié)點(diǎn)

  • a-string-property = "A string";:字符串屬性,用雙引號(hào)表示

  • cell-property =;:32bit的無(wú)符號(hào)整數(shù),用尖括號(hào)表示

  • binary-property = [0x01 0x23 0x45 0x67];:二進(jìn)制數(shù)據(jù)用方括號(hào)表示

  • a-string-list-property = "first string", "second string";:用逗號(hào)表示字符串列表


4.2數(shù)據(jù)結(jié)構(gòu)

DeviceTree的結(jié)構(gòu)非常簡(jiǎn)單,由兩種元素組成:Node(節(jié)點(diǎn))和Property(屬性)。

																				

[label:] node-name[@unit-address] { [properties definitions] [child nodes] }

想象一下,一棵大樹(shù),每一個(gè)樹(shù)干都認(rèn)為是一個(gè)節(jié)點(diǎn),每一片樹(shù)葉,想作一個(gè)屬性!

  • label:節(jié)點(diǎn)的一個(gè)標(biāo)簽,可以作為別名

  • node-name:節(jié)點(diǎn)的名稱

  • unit-address:?jiǎn)卧刂?,也就是控制器的地?/span>

  • properties:屬性名稱

  • definitions:屬性的值


4.3屬性介紹

																							

/dts-v1/; / { compatible = "acme,coyotes-revenge"; #address-cells =; #size-cells =; cpus { cpu@0 { compatible = "arm,cortex-a9"; reg =; }; cpu@1 { compatible = "arm,cortex-a9"; reg =; }; }; serial@101f0000 { #address-cells =; #size-cells =; compatible = "arm,pl011"; reg =; }; };

4.3.1基本屬性

下面幾個(gè)屬性是基本屬性

  • /dts-v1/;:表示一個(gè)dts設(shè)備樹(shù)文件

  • /:表示根節(jié)點(diǎn)

  • compatible = "acme,coyotes-revenge";

    • compatible:“兼容性” 屬性,這是非常重要的一個(gè)屬性兼容屬性,由該屬性值來(lái)匹配對(duì)應(yīng)的驅(qū)動(dòng)代碼。

    • "acme,coyotes-revenge":該值遵循"manufacturer,model"格式manufacturer表示芯片廠商,model表示驅(qū)動(dòng)名稱

compatible是一個(gè)字符串列表。列表中的第一個(gè)字符串指定節(jié)點(diǎn)在表單中表示的確切設(shè)備","。

例如,飛思卡爾 MPC8349 片上系統(tǒng) (SoC) 有一個(gè)串行設(shè)備,可實(shí)現(xiàn) National Semiconductor ns16550 寄存器接口。因此,MPC8349 串行設(shè)備的 compatible 屬性應(yīng)為:compatible = "fsl,mpc8349-uart", "ns16550". 在這種情況下,fsl,mpc8349-uart指定確切的設(shè)備,并ns16550聲明它與 National Semiconductor 16550 UART 的寄存器級(jí)兼容。

  • cpus:表示一個(gè)子節(jié)點(diǎn),該子節(jié)點(diǎn)下又有兩個(gè)子節(jié)點(diǎn),分別為cpu0和cpu1。

  • cpu@0:遵循[@]格式

    • :ascii字符串,表示節(jié)點(diǎn)名稱

    • :?jiǎn)卧刂?,設(shè)備的私有地址,在節(jié)點(diǎn)reg屬性中描述。


4.3.2尋址屬性

下面幾個(gè)屬性與尋址相關(guān)的

  • #address-cells :表示reg屬性中表示地址字段的單元個(gè)數(shù),每個(gè)單元32bit,即用多少個(gè)32bit單元表示地址信息。

  • #size-cells:表示reg屬性中表示長(zhǎng)度字段的單元個(gè)數(shù),每個(gè)單元32bit,即用多少個(gè)32bit單元表示長(zhǎng)度信息。

  • reg:該屬性一般用于描述設(shè)備地址空間資源信息,一般都是某個(gè)外設(shè)的寄存器地址范圍信息。其式為reg = 。每個(gè)地址值都是一個(gè)或多個(gè) 32 位整數(shù)的列表,稱為單元格。同樣,長(zhǎng)度值可以是單元格列表,也可以是空的。


cpu節(jié)點(diǎn)為例

																															

cpu@0 { compatible = "arm,cortex-a9"; reg =; };

其#address-cells=1表示reg屬性中描述地址字段,所需32bit的單元個(gè)數(shù)為1,#size-cells=0表示reg屬性中沒(méi)有表示長(zhǎng)度的單元,即reg=


再以serial節(jié)點(diǎn)為例

																														

serial@101f0000 { #address-cells =; #size-cells =; compatible = "arm,pl011"; reg =; };

該設(shè)備都被分配一個(gè)基址,以及被分配區(qū)域的大小

其#address-cells=1表示reg屬性中描述地址字段需要1個(gè)32bit單元,#size-cells=1表示reg屬性中描述長(zhǎng)度字段需要2個(gè)單元,即reg=

  • 0x101f0000:表示serial的控制器起始地址

  • 0x1000:表示serial控制器所占用的大小


地址映射部分還要了解一個(gè)屬性,為什么要引入這個(gè)屬性呢?

根節(jié)點(diǎn)與根節(jié)點(diǎn)的直接子節(jié)點(diǎn),都使用了CPU的地址分配空間,但是根節(jié)點(diǎn)的非直接子節(jié)點(diǎn),并不會(huì)自動(dòng)實(shí)用CPU的地址空間,因此需要手動(dòng)用屬性分配。

如上述的serial節(jié)點(diǎn),屬于根節(jié)點(diǎn)下的直接子節(jié)點(diǎn),無(wú)需手動(dòng)再次分配地址空間,而下面所述的external-bus節(jié)點(diǎn),其內(nèi)部的子節(jié)點(diǎn)就需要再次分配!

																																	

/dts-v1/; / { compatible = "acme,coyotes-revenge"; #address-cells =; #size-cells =; ... external-bus { #address-cells =; #size-cells =; ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet 1 0  0x10160000   0x10000     // Chipselect 2, i2c controller 2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash ethernet@0,0 { compatible = "smc,smc91c111"; reg =; }; i2c@1,0 { compatible = "acme,a1234-i2c-bus"; #address-cells =; #size-cells =; reg =; rtc@58 { compatible = "maxim,ds1338"; reg =; }; }; flash@2,0 { compatible = "samsung,k8f1315ebm", "cfi-flash"; reg =; }; }; };

該總線使用了不同的尋址方式,分析一下external-bus節(jié)點(diǎn)

  • #address-cells =:用兩個(gè)單元表示地址

  • #size-cells =:用一個(gè)單元表示長(zhǎng)度

  • reg =:第一個(gè)0表示片選號(hào),第二個(gè)0表示基于片選的偏移,第三個(gè)表示偏移的大小


這種抽象的表示,如何映射到CPU地址區(qū)域呢?屬性來(lái)幫助!

																																			

ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet 1 0 0x10160000 0x10000 // Chipselect 2, i2c controller 2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash

range:表示了不同設(shè)備的地址空間范圍,表中的每一項(xiàng)都是一個(gè)元組,包含子地址、父地址以及子地址空間中區(qū)域的大小,這三個(gè)字段。

  • 子地址字段:由子節(jié)點(diǎn)的#address-cells決定,如前面的0 0、0 1

  • 父地址字段:由父節(jié)點(diǎn)的#address-cells決定,如0x10100000、0x10160000

  • 子地址空間字段:描述子節(jié)點(diǎn)的空間大小,由父節(jié)點(diǎn)的#size-cells決定,如0x10000、0x10000

經(jīng)過(guò)映射后,總線的地址映射如下:

  • Offset 0 from chip select 0 is mapped to address range 0x10100000..0x1010ffff

  • Offset 0 from chip select 1 is mapped to address range 0x10160000..0x1016ffff

  • Offset 0 from chip select 2 is mapped to address range 0x30000000..0x30ffffff

4.3.3中斷屬性
																																							

/dts-v1/; / {    compatible = "acme,coyotes-revenge";    #address-cells =;    #size-cells =;    interrupt-parent = <&intc>;    cpus {        #address-cells =;        #size-cells =;        cpu@0 {            compatible = "arm,cortex-a9";            reg =;        };        cpu@1 {            compatible = "arm,cortex-a9";            reg =;        };    };    serial@101f0000 {        compatible = "arm,pl011";        reg =;        interrupts = < 1 0 >;    };    intc: interrupt-controller@10140000 {        compatible = "arm,pl190";        reg =;        interrupt-controller;        #interrupt-cells =;    }; };

如上

  • interrupt-controller:聲明一個(gè)節(jié)點(diǎn)是接收中斷信號(hào)的設(shè)備,也就是中斷控制器

  • #interrupt-cells:interrupt-controller節(jié)點(diǎn)下的一個(gè)屬性,表明中斷標(biāo)識(shí)符用多少個(gè)單元表示

  • interrupt-parent:設(shè)備節(jié)點(diǎn)中的一個(gè)屬性,選擇哪個(gè)中斷控制器

  • interrupts:設(shè)備節(jié)點(diǎn)的一個(gè)屬性,中斷標(biāo)識(shí)符列表,其單元個(gè)數(shù)取決于#interrupt-cells

根據(jù)設(shè)備樹(shù),我們了解到:

  • 該機(jī)器有一個(gè)中斷控制器interrupt-controller@10140000

  • intc標(biāo)簽,為中斷控制器的別名,方便引用

  • #interrupt-cells =;:中斷標(biāo)識(shí)符用兩個(gè)單元格表示

  • interrupt-parent = <&intc>;:選擇中斷控制器

  • interrupts = < 1 0 >;:表示一個(gè)中斷,第一個(gè)值用于表明中斷線編號(hào),第二個(gè)值表明中斷類型,如高電平,低電平,跳變沿等


4.3.4其他屬性


																																												

aliases {        ethernet0 = e0;        serial0 = &serial0;    };

aliases:正如其名,別名屬性,使用方式:property = &label;


																																												

chosen {        bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";    };

chosen:該屬性并不表示一個(gè)真實(shí)的設(shè)備,但是提供一個(gè)空間,用于傳輸固件和Linux之間的數(shù)據(jù),像啟動(dòng)參數(shù),



設(shè)備樹(shù)的加載流程

我們知道,dts文件經(jīng)過(guò)dtc工具編譯為dtb,內(nèi)核加載并解析dtb文件,最終獲得設(shè)備樹(shù)的信息。

那么Linux如何加載``dtb文件,并生成對(duì)應(yīng)節(jié)點(diǎn)的呢?


5.1設(shè)備樹(shù)地址設(shè)置

我們一般通過(guò)Bootloader引導(dǎo)啟動(dòng)Kernel,在啟動(dòng)Kernel之前,Bootloader必須將dtb文件的首地址傳輸給Kernel,以供使用。

  1. Bootloader將dtb二進(jìn)制文件的起始地址寫(xiě)入r2寄存器中

  2. Kernel在第一個(gè)啟動(dòng)文件head.S/head-common.S中,讀取r2寄存器中的值,獲取dtb文件起始地址

  3. 跳轉(zhuǎn)入口函數(shù)start_kernel執(zhí)行C語(yǔ)言代碼


06獲取設(shè)備樹(shù)中的平臺(tái)信息——machine_desc

在dts文件中,在根節(jié)點(diǎn)中有一個(gè)compatible屬性,該屬性的值是一系列的字符串,比如compatible = “samsung,smdk2440”“samsung,smdk2410,samsung,smdk24xx”;,該屬性就是告訴內(nèi)核要選擇什么樣的machine_desc,因?yàn)閙achine_desc結(jié)構(gòu)體中有一個(gè)dt_compat成員,該成員表示machine_desc支持哪些單板,所以內(nèi)核會(huì)把compatible中的字符串與dt_compat進(jìn)行依次比較。


																																																	

start_kernel // init/main.c    setup_arch(&command_line);  // arch/arm/kernel/setup.c        mdesc = setup_machine_fdt(__atags_pointer);  // arch/arm/kernel/devtree.c                    early_init_dt_verify(phys_to_virt(dt_phys)  // 判斷是否有效的dtb, drivers/of/ftd.c                                    initial_boot_params = params;                    mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach);  // 找到最匹配的machine_desc, drivers/of/ftd.c                                    while ((data = get_next_compat(&compat))) {                                        score = of_flat_dt_match(dt_root, compat);                                        if (score > 0 && score < best_score) { best_data = data; best_score = score; } } machine_desc = mdesc;


5.3獲取設(shè)備樹(shù)的配置信息

在前面,我們也知道設(shè)備樹(shù)中的chosen屬性,用于傳輸固件和Linux之間的數(shù)據(jù),包含一些啟動(dòng)參數(shù),那么我們?cè)撊绾谓馕龀鰜?lái)呢?

  1. /chosen節(jié)點(diǎn)中bootargs屬性的值, 存入全局變量:boot_command_line

  2. 確定根節(jié)點(diǎn)的這2個(gè)屬性的值:#address-cells,#size-cells

  3. 存入全局變量:dt_root_addr_cells,dt_root_size_cells

  4. 解析/memory中的reg屬性, 提取出"base, size", 最終調(diào)用memblock_add(base, size);


5.4設(shè)備樹(shù)節(jié)點(diǎn)解析

dtb文件會(huì)在內(nèi)存中一直存在著,不會(huì)被內(nèi)核或者應(yīng)用程序占用,我們需要使用的時(shí)候可以直接使用dtb文件。dtb文件的內(nèi)容會(huì)被解析生成多個(gè)device_node,然后這些device_node構(gòu)成一棵樹(shù), 根節(jié)點(diǎn)為: of_root

每一個(gè)節(jié)點(diǎn)都以TAG(FDT_BEGIN_NODE, 0x00000001)開(kāi)始, 節(jié)點(diǎn)內(nèi)部可以嵌套其他節(jié)點(diǎn), 每一個(gè)屬性都以TAG(FDT_PROP, 0x00000003)開(kāi)始


  • 設(shè)備樹(shù)中的每一個(gè)節(jié)點(diǎn),都會(huì)被轉(zhuǎn)換為device_node結(jié)構(gòu)體

																																																					

struct device_node {            const char *name;  // 來(lái)自節(jié)點(diǎn)中的name屬性, 如果沒(méi)有該屬性, 則設(shè)為"NULL"            const char *type;  // 來(lái)自節(jié)點(diǎn)中的device_type屬性, 如果沒(méi)有該屬性, 則設(shè)為"NULL"            phandle phandle;            const char *full_name;  // 節(jié)點(diǎn)的名字, node-name[@unit-address]            struct fwnode_handle fwnode;            struct  property *properties;  // 節(jié)點(diǎn)的屬性            struct  property *deadprops;    /* removed properties */            struct  device_node *parent;   // 節(jié)點(diǎn)的父親            struct  device_node *child;    // 節(jié)點(diǎn)的孩子(子節(jié)點(diǎn))            struct  device_node *sibling;  // 節(jié)點(diǎn)的兄弟(同級(jí)節(jié)點(diǎn))        #if defined(CONFIG_OF_KOBJ)            struct  kobject kobj;        #endif            unsigned long _flags;            void    *data;        #if defined(CONFIG_SPARC)            const char *path_component_name;            unsigned int unique_id;            struct of_irq_controller *irq_trans;        #endif        };


  • device_node轉(zhuǎn)換為platform_device

那么多的device_node,哪些會(huì)被轉(zhuǎn)化為platform_device呢?

  1. 根節(jié)點(diǎn)下的子節(jié)點(diǎn),且該子節(jié)點(diǎn)必須包含compatible屬性;

  2. 如果一個(gè)節(jié)點(diǎn)的compatile屬性含有這些特殊的值(“simple-bus”,“simple-mfd”,“isa”,“arm,amba-bus”)之一,那么它的子結(jié)點(diǎn)(需含compatile屬性)也可以轉(zhuǎn)換為platform_device。

																																																								

struct platform_device { const char *name; int id; bool id_auto; struct device dev; u32 num_resources; struct resource *resource; const struct platform_device_id *id_entry; char *driver_override; /* Driver name to force a match */ /* MFD cell pointer */ struct mfd_cell *mfd_cell; /* arch specific additions */ struct pdev_archdata archdata; };

轉(zhuǎn)換完成之后,

  • 設(shè)備樹(shù)中的reg/irq等屬性,都存放在了platform_device->resource結(jié)構(gòu)體中

  • 設(shè)備樹(shù)中的其他屬性,都存在在了platform_device.dev->of_node結(jié)構(gòu)體中


  • C代碼獲取設(shè)備樹(shù)屬性

轉(zhuǎn)換完成之后,內(nèi)核提供了一些API來(lái)直接獲取設(shè)備樹(shù)中對(duì)應(yīng)的屬性。如:

  • of_property_read_u32_index:獲取設(shè)備樹(shù)中某個(gè)屬性的值

  • of_property_read_string:獲取設(shè)備樹(shù)中某個(gè)屬性的字符串的值

  • of_get_address:獲取設(shè)備樹(shù)中的某個(gè)節(jié)點(diǎn)的地址信息

整體總結(jié)下來(lái),有幾個(gè)類別

																																																															

a. 處理DTB of_fdt.h // dtb文件的相關(guān)操作函數(shù), 我們一般用不到, 因?yàn)閐tb文件在內(nèi)核中已經(jīng)被轉(zhuǎn)換為device_node樹(shù)(它更易于使用) b. 處理device_node of.h // 提供設(shè)備樹(shù)的一般處理函數(shù), 比如 of_property_read_u32(讀取某個(gè)屬性的u32值), of_get_child_count(獲取某個(gè)device_node的子節(jié)點(diǎn)數(shù)) of_address.h // 地址相關(guān)的函數(shù), 比如 of_get_address(獲得reg屬性中的addr, size值) of_match_device(從matches數(shù)組中取出與當(dāng)前設(shè)備最匹配的一項(xiàng)) of_dma.h // 設(shè)備樹(shù)中DMA相關(guān)屬性的函數(shù) of_gpio.h // GPIO相關(guān)的函數(shù) of_graph.h // GPU相關(guān)驅(qū)動(dòng)中用到的函數(shù), 從設(shè)備樹(shù)中獲得GPU信息 of_iommu.h // 很少用到 of_irq.h // 中斷相關(guān)的函數(shù) of_mdio.h // MDIO (Ethernet PHY) API of_net.h // OF helpers for network devices. of_pci.h // PCI相關(guān)函數(shù) of_pdt.h // 很少用到 of_reserved_mem.h // reserved_mem的相關(guān)函數(shù) c. 處理 platform_device of_platform.h // 把device_node轉(zhuǎn)換為platform_device時(shí)用到的函數(shù), // 比如of_device_alloc(根據(jù)device_node分配設(shè)置platform_device), // of_find_device_by_node (根據(jù)device_node查找到platform_device), // of_platform_bus_probe (處理device_node及它的子節(jié)點(diǎn)) of_device.h // 設(shè)備相關(guān)的函數(shù), 比如 of_match_device


上述總結(jié)下來(lái),流程為dts->dtb->device_node->platform_device



設(shè)備樹(shù)調(diào)試
  • 查看原始的dtb文件

																																																																

ls /sys/firmware/fdt hexdump -C /sys/firmware/fdt


  • 查看設(shè)備樹(shù)信息

																																																																		

ls /sys/firmware/devicetree ls /proc/device-tree

以目錄結(jié)構(gòu)程現(xiàn)的dtb文件, 根節(jié)點(diǎn)對(duì)應(yīng)base目錄, 每一個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)目錄, 每一個(gè)屬性對(duì)應(yīng)一個(gè)文件

/proc/device-tree 是鏈接文件, 指向/sys/firmware/devicetree/base


  • 查看所有硬件信息

																																																																					

ls /sys/devices/platform

系統(tǒng)中所有的platform_device, 有來(lái)自設(shè)備樹(shù)的, 也有來(lái)有.c文件中注冊(cè)的。





本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

8位單片機(jī)在嵌入式設(shè)計(jì)領(lǐng)域已經(jīng)成為半個(gè)多世紀(jì)以來(lái)的主流選擇。盡管嵌入式系統(tǒng)市場(chǎng)日益復(fù)雜,8位單片機(jī)依然不斷發(fā)展,積極應(yīng)對(duì)新的挑戰(zhàn)和系統(tǒng)需求。如今,Microchip推出的8位PIC?和AVR?單片機(jī)系列,配備了先進(jìn)的獨(dú)立...

關(guān)鍵字: 單片機(jī) 嵌入式 CPU

開(kāi)創(chuàng)中國(guó)文旅產(chǎn)業(yè)AI深度應(yīng)用新樣本 北京2025年8月22日 /美通社/ -- 以下為來(lái)自億歐的報(bào)道: 8月22日,桂林旅游股份有限公司旗下銀子巖景區(qū)聯(lián)合合作伙伴正式發(fā)布全球首款A(yù)I伴游財(cái)神玩具 —— "五...

關(guān)鍵字: AI IP 數(shù)字化 硬件

北京2025年8月18日 /美通社/ -- 2025年8月,軟通動(dòng)力集團(tuán)一項(xiàng)關(guān)鍵決策引發(fā)行業(yè)矚目——以自有資金8億元向全資子公司軟通計(jì)算機(jī)有限公司完成實(shí)繳增資,使其注冊(cè)資本增加至23億元。這筆戰(zhàn)略注資不僅彰顯集團(tuán)對(duì)信創(chuàng)核...

關(guān)鍵字: AI 硬件 計(jì)算機(jī) 智能化

上海2025年8月15日 /美通社/ -- 在數(shù)字化轉(zhuǎn)型浪潮與數(shù)據(jù)安全需求的雙重驅(qū)動(dòng)下,瀾起科技今日重磅推出第六代津逮? 性能核 CPU (以下簡(jiǎn)稱 C6P )。這款融合突破性架構(gòu)、全棧兼容性與芯片級(jí)安全防護(hù)的高性能服...

關(guān)鍵字: CPU BSP 數(shù)字化 AI

采用分離式架構(gòu),充分利用主機(jī) CPU 和 PCIe? 基礎(chǔ)設(shè)施,克服傳統(tǒng)存儲(chǔ)瓶頸

關(guān)鍵字: CPU 數(shù)據(jù)中心 服務(wù)器

受生成式 AI 驅(qū)動(dòng), RISC-V 芯片市場(chǎng)快速發(fā)展。預(yù)計(jì)到2030年,RISC-V SoC出貨量將達(dá)到1618.1億顆,營(yíng)收將達(dá)到927億美元。其中,用于AI加速器的RISC-V SoC出貨量將達(dá)到41億顆,營(yíng)收將達(dá)...

關(guān)鍵字: RISC-V CPU AI CUDA ARM 推理

7月21日消息,“全球最佳游戲CPU”銳龍7 9800X3D自去年11月上市以來(lái),價(jià)格一直比較堅(jiān)挺,前期還經(jīng)常處于缺貨狀態(tài)。

關(guān)鍵字: CPU GPU

人工智能 (AI) 正在以驚人的速度發(fā)展。企業(yè)不再僅僅是探索 AI,而是積極推動(dòng) AI 的規(guī)?;涞兀瑥膶?shí)驗(yàn)性應(yīng)用轉(zhuǎn)向?qū)嶋H部署。隨著生成式模型日益精簡(jiǎn)和高效,AI 的重心正從云端轉(zhuǎn)向邊緣側(cè)。如今,人們不再質(zhì)疑邊緣 AI...

關(guān)鍵字: 人工智能 CPU GPU

Linux內(nèi)核是一個(gè)操作系統(tǒng)(OS)內(nèi)核,本質(zhì)上定義為類Unix。它用于不同的操作系統(tǒng),主要是以不同的Linux發(fā)行版的形式。Linux內(nèi)核是第一個(gè)真正完整且突出的免費(fèi)和開(kāi)源軟件示例。Linux 內(nèi)核是第一個(gè)真正完整且突...

關(guān)鍵字: Linux內(nèi)核 OS

CPU通過(guò)將代碼轉(zhuǎn)換為機(jī)器語(yǔ)言、通過(guò)指令集架構(gòu)(ISA)識(shí)別代碼、以及利用控制單元(CU)和算術(shù)邏輯單元(ALU)執(zhí)行代碼這三種主要方式來(lái)認(rèn)識(shí)代碼。CPU首先將編寫(xiě)的高級(jí)語(yǔ)言代碼通過(guò)編譯器轉(zhuǎn)換為低級(jí)語(yǔ)言,即機(jī)器語(yǔ)言,這是...

關(guān)鍵字: CPU 機(jī)器語(yǔ)言
關(guān)閉