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



Linux設(shè)備樹概念
DTS

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


官方說明

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

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


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

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

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

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



設(shè)備樹的由來

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

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

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

這樣就導(dǎo)致了Linux內(nèi)核代碼中充斥著大量的垃圾代碼,因?yàn)椴煌陌寮壦麄兊挠布畔⒍疾幌嗤?,這些都是硬件特有的信息,對內(nèi)核而言沒有任何的意義,但是往往這部分代碼特別的多,造成內(nèi)核的冗余。

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



設(shè)備樹組成

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

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

  • DTS(device tree source)

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

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

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

  • DTC(device tree compiler)

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

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

該工具一般在編譯內(nèi)核的時候,默認(rèn)會自動執(zhí)行編譯操作,如果我們想單獨(dú)編譯設(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è)備樹文件,它由Linux內(nèi)核解析,也可以被bootloader進(jìn)行解析。

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

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



設(shè)備樹語法

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

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

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

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

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

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

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)下的兩個子節(jié)點(diǎn)

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

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

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

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

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


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

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

																				

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

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

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

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

  • unit-address:單元地址,也就是控制器的地址

  • 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基本屬性

下面幾個屬性是基本屬性

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

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

  • compatible = "acme,coyotes-revenge";

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

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

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

例如,飛思卡爾 MPC8349 片上系統(tǒng) (SoC) 有一個串行設(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 的寄存器級兼容。

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

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

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

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


4.3.2尋址屬性

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

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

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

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


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

																															

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

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


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

																														

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

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

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

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

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


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

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

如上述的serial節(jié)點(diǎn),屬于根節(jié)點(diǎn)下的直接子節(jié)點(diǎn),無需手動再次分配地址空間,而下面所述的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 =:用兩個單元表示地址

  • #size-cells =:用一個單元表示長度

  • reg =:第一個0表示片選號,第二個0表示基于片選的偏移,第三個表示偏移的大小


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

																																			

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)都是一個元組,包含子地址、父地址以及子地址空間中區(qū)域的大小,這三個字段。

  • 子地址字段:由子節(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)過映射后,總線的地址映射如下:

  • 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:聲明一個節(jié)點(diǎn)是接收中斷信號的設(shè)備,也就是中斷控制器

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

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

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

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

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

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

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

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

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


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:該屬性并不表示一個真實(shí)的設(shè)備,但是提供一個空間,用于傳輸固件和Linux之間的數(shù)據(jù),像啟動參數(shù),



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

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

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


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

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

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

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

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


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

在dts文件中,在根節(jié)點(diǎn)中有一個compatible屬性,該屬性的值是一系列的字符串,比如compatible = “samsung,smdk2440”“samsung,smdk2410,samsung,smdk24xx”;,該屬性就是告訴內(nèi)核要選擇什么樣的machine_desc,因?yàn)閙achine_desc結(jié)構(gòu)體中有一個dt_compat成員,該成員表示machine_desc支持哪些單板,所以內(nèi)核會把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è)備樹中的chosen屬性,用于傳輸固件和Linux之間的數(shù)據(jù),包含一些啟動參數(shù),那么我們該如何解析出來呢?

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

  2. 確定根節(jié)點(diǎn)的這2個屬性的值:#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è)備樹節(jié)點(diǎn)解析

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

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


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

																																																					

struct device_node {            const char *name;  // 來自節(jié)點(diǎn)中的name屬性, 如果沒有該屬性, 則設(shè)為"NULL"            const char *type;  // 來自節(jié)點(diǎn)中的device_type屬性, 如果沒有該屬性, 則設(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)的兄弟(同級節(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,哪些會被轉(zhuǎn)化為platform_device呢?

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

  2. 如果一個節(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è)備樹中的reg/irq等屬性,都存放在了platform_device->resource結(jié)構(gòu)體中

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


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

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

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

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

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

整體總結(jié)下來,有幾個類別

																																																															

a. 處理DTB of_fdt.h // dtb文件的相關(guān)操作函數(shù), 我們一般用不到, 因?yàn)閐tb文件在內(nèi)核中已經(jīng)被轉(zhuǎn)換為device_node樹(它更易于使用) b. 處理device_node of.h // 提供設(shè)備樹的一般處理函數(shù), 比如 of_property_read_u32(讀取某個屬性的u32值), of_get_child_count(獲取某個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è)備樹中DMA相關(guān)屬性的函數(shù) of_gpio.h // GPIO相關(guān)的函數(shù) of_graph.h // GPU相關(guān)驅(qū)動中用到的函數(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ù), // 比如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é)下來,流程為dts->dtb->device_node->platform_device



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

																																																																

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


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

																																																																		

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

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

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


  • 查看所有硬件信息

																																																																					

ls /sys/devices/platform

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





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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉