自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文搞定 Linux 設(shè)備樹

系統(tǒng) Linux
在Linux 2.6中, ARM架構(gòu)的板極硬件細節(jié)過多地被硬編碼在arch/arm/plat-xxx和arch/arm/mach-xxx中,采用設(shè)備樹后,許多硬件的細節(jié)可以直接通過它傳遞給Linux,而不再需要在內(nèi)核中進行大量的冗余編碼。

[[430921]]

 設(shè)備樹是一種描述硬件的數(shù)據(jù)結(jié)構(gòu),它起源于OpenFirmware(OF)。

在Linux 2.6中, ARM架構(gòu)的板極硬件細節(jié)過多地被硬編碼在arch/arm/plat-xxx和arch/arm/mach-xxx中,采用設(shè)備樹后,許多硬件的細節(jié)可以直接通過它傳遞給Linux,而不再需要在內(nèi)核中進行大量的冗余編碼。

1. linux設(shè)備樹中DTS、 DTC和DTB的關(guān)系

  •  (1) DTS:.dts文件是設(shè)備樹的源文件。由于一個SoC可能對應(yīng)多個設(shè)備,這些.dst文件可能包含很多共同的部分,共同的部分一般被提煉為一個 .dtsi 文件,這個文件相當于C語言的頭文件。
  •  (2) DTC:DTC是將.dts編譯為.dtb的工具,相當于gcc。
  •  (3) DTB:.dtb文件是 .dts 被 DTC 編譯后的二進制格式的設(shè)備樹文件,它可以被linux內(nèi)核解析。

2. DTS語法

2.1 .dtsi 頭文件

和 C 語言一樣,設(shè)備樹也支持頭文件,設(shè)備樹的頭文件擴展名為 .dtsi;同時也可以像C 語言一樣包含 .h頭文件;例如:(代碼來源 linux-4.15/arch/arm/boot/dts/s3c2416.dtsi) 

  1. #include <dt-bindings/clock/s3c2443.h>  
  2. #include "s3c24xx.dtsi" 

注:.dtsi 文件一般用于描述 SOC 的內(nèi)部外設(shè)信息,比如 CPU 架構(gòu)、主頻、外設(shè)寄存器地址范圍,比如 UART、 IIC 等等。

2.2 設(shè)備節(jié)點

在設(shè)備樹中節(jié)點命名格式如下: 

  1. node-name@unit-address 

node-name:是設(shè)備節(jié)點的名稱,為ASCII字符串,節(jié)點名字應(yīng)該能夠清晰的描述出節(jié)點的功能,比如“uart1”就表示這個節(jié)點是UART1外設(shè);unit-address:一般表示設(shè)備的地址或寄存器首地址,如果某個節(jié)點沒有地址或者寄存器的話 “unit-address” 可以不要;注:根節(jié)點沒有node-name 或者 unit-address,它被定義為 /。

設(shè)備節(jié)點的例子如下圖:

在上圖中:cpu 和 ethernet依靠不同的unit-address 分辨不同的CPU;可見,node-name相同的情況下,可以通過不同的unit-address定義不同的設(shè)備節(jié)點。

2.2.1 設(shè)備節(jié)點的標準屬性

2.2.1.1 compatible 屬性

compatible 屬性也叫做 “兼容性” 屬性,這是非常重要的一個屬性!compatible 屬性的值是一個字符串列表, compatible 屬性用于將設(shè)備和驅(qū)動綁定起來。字符串列表用于選擇設(shè)備所要使用的驅(qū)動程序。compatible 屬性值的推薦格式: 

  1. "manufacturer,model" 
  •  ① manufacturer : 表示廠商;
  •  ② model : 一般是模塊對應(yīng)的驅(qū)動名字。

例如: 

  1. compatible = "fsl,mpc8641", "ns16550"; 

上面的compatible有兩個屬性,分別是 "fsl,mpc8641" 和 "ns16550";其中 "fsl,mpc8641" 的廠商是 fsl;設(shè)備首先會使用第一個屬性值在 Linux 內(nèi)核里面查找,看看能不能找到與之匹配的驅(qū)動文件;

如果沒找到,就使用第二個屬性值查找,以此類推,直到查到到對應(yīng)的驅(qū)動程序 或者 查找完整個 Linux 內(nèi)核也沒有對應(yīng)的驅(qū)動程序為止。

注:一般驅(qū)動程序文件都會有一個 OF 匹配表,此 OF 匹配表保存著一些 compatible 值,如果設(shè)備節(jié)點的 compatible 屬性值和 OF 匹配表中的任何一個值相等,那么就表示設(shè)備可以使用這個驅(qū)動。

2.2.1.2 model 屬性

model 屬性值也是一個字符串,一般 model 屬性描述設(shè)備模塊信息,比如名字什么的,例如: 

  1. model = "Samsung S3C2416 SoC"

2.2.1.3 phandle 屬性

phandle屬性為devicetree中唯一的節(jié)點指定一個數(shù)字標識符,節(jié)點中的phandle屬性,它的取值必須是唯一的(不要跟其他的phandle值一樣),例如: 

  1. pic@10000000 { 
  2.     phandle = <1> 
  3.     interrupt-controller;  
  4. };  
  5. another-device-node {  
  6.     interrupt-parent = <1>;   // 使用phandle值為1來引用上述節(jié)點  
  7. }; 

注:DTS中的大多數(shù)設(shè)備樹將不包含顯式的phandle屬性,當DTS被編譯成二進制DTB格式時,DTC工具會自動插入phandle屬性。

2.2.1.4 status 屬性

status 屬性看名字就知道是和設(shè)備狀態(tài)有關(guān)的, status 屬性值也是字符串,字符串是設(shè)備的狀態(tài)信息,可選的狀態(tài)如下表所示:

status值 描述
“okay” 表明設(shè)備是可操作的。
“disabled” 表明設(shè)備當前是不可操作的,但是在未來可以變?yōu)榭刹僮鞯模热鐭岵灏卧O(shè)備插入以后。至于 disabled 的具體含義還要看設(shè)備的綁定文檔。
“fail” 表明設(shè)備不可操作,設(shè)備檢測到了一系列的錯誤,而且設(shè)備也不大可能變得可操作。
“fail-sss” 含義和“fail”相同,后面的 sss 部分是檢測到的錯誤內(nèi)容

2.2.1.5 #address-cells 和 #size-cells

#address-cells 和 #size-cells的值都是無符號 32 位整型,可以用在任何擁有子節(jié)點的設(shè)備中,用于描述子節(jié)點的地址信息。#address-cells 屬性值決定了子節(jié)點 reg 屬性中地址信息所占用的字長(32 位), #size-cells 屬性值決定了子節(jié)點 reg 屬性中長度信息所占的字長(32 位)。#address-cells 和 #size-cells 表明了子節(jié)點應(yīng)該如何編寫 reg 屬性值,一般 reg 屬性都是和地址有關(guān)的內(nèi)容,和地址相關(guān)的信息有兩種:起始地址和地址長度,reg 屬性的格式一為: 

  1. reg = <address1 length1 address2 length2 address3 length3……> 

例如一個64位的處理器: 

  1. soc {  
  2.     #address-cells = <2> 
  3.     #size-cells = <1> 
  4.     serial {  
  5.         compatible = "xxx" 
  6.         reg = <0x4600 0x5000 0x100>;  /*地址信息是:0x00004600 00005000,長度信息是:0x100*/  
  7.         };  
  8. }; 

2.2.1.6 reg 屬性

reg 屬性的值一般是 (address, length) 對,reg 屬性一般用于描述設(shè)備地址空間資源信息,一般都是某個外設(shè)的寄存器地址范圍信息。

例如:一個設(shè)備有兩個寄存器塊,一個的地址是0x3000,占據(jù)32字節(jié);另一個的地址是0xFE00,占據(jù)256字節(jié),表示如下: 

  1. reg = <0x3000 0x20 0xFE00 0x100>

注:上述對應(yīng)#address-cells = <1>; #size-cells = <1>;。

2.2.1.7 ranges 屬性

ranges屬性值可以為空或者按照 (child-bus-address,parent-bus-address,length) 格式編寫的數(shù)字矩陣, ranges 是一個地址映射/轉(zhuǎn)換表, ranges 屬性每個項目由子地址、父地址和地址空間長度這三部分組成:

  •  child-bus-address:子總線地址空間的物理地址,由父節(jié)點的 #address-cells 確定此物理地址所占用的字長。
  •  parent-bus-address:父總線地址空間的物理地址,同樣由父節(jié)點的 #address-cells 確定此物理地址所占用的字長。
  •  length:子地址空間的長度,由父節(jié)點的 #size-cells 確定此地址長度所占用的字長。 
  1. soc {  
  2.     compatible = "simple-bus" 
  3.     #address-cells = <1> 
  4.     #size-cells = <1> 
  5.     ranges = <0x0 0xe0000000 0x00100000> 
  6.     serial {  
  7.         device_type = "serial" 
  8.         compatible = "ns16550" 
  9.         reg = <0x4600 0x100> 
  10.         clock-frequency = <0> 
  11.         interrupts = <0xA 0x8> 
  12.         interrupt-parent = <&ipic> 
  13.         };  
  14. }; 

節(jié)點 soc 定義的 ranges 屬性,值為 <0x0 0xe0000000 0x00100000>,此屬性值指定了一個 1024KB(0x00100000) 的地址范圍,子地址空間的物理起始地址為 0x0,父地址空間的物理起始地址為 0xe0000000。

serial 是串口設(shè)備節(jié)點,

reg 屬性定義了 serial 設(shè)備寄存器的起始地址為 0x4600,寄存器長度為 0x100。

經(jīng)過地址轉(zhuǎn)換, serial 設(shè)備可以從 0xe0004600 開始進行讀寫操作,0xe0004600=0x4600+0xe0000000。

2.2.1.8 name 屬性

name 屬性值為字符串, name 屬性用于記錄節(jié)點名字, name 屬性已經(jīng)被棄用,不推薦使用name 屬性,一些老的設(shè)備樹文件可能會使用此屬性。

2.2.1.9 device_type 屬性

device_type 屬性值為字符串, IEEE 1275 會用到此屬性,用于描述設(shè)備的 FCode,但是設(shè)備樹沒有 FCode,所以此屬性也被拋棄了。此屬性只能用于 cpu 節(jié)點或者 memory 節(jié)點。 

  1. memory@30000000 {  
  2.     device_type = "memory" 
  3.     reg =  <0x30000000 0x4000000> 
  4. }; 

2.2.2 根節(jié)點

每個設(shè)備樹文件只有一個根節(jié)點,其他所有的設(shè)備節(jié)點都是它的子節(jié)點,它的路徑是 /。根節(jié)點有以下屬性:

屬性 屬性值類型 描述
#address-cells < u32 > 在它的子節(jié)點的reg屬性中, 使用多少個u32整數(shù)來描述地址(address)
model < string > 用于標識系統(tǒng)板卡(例如smdk2440開發(fā)板),推薦的格式是“manufacturer,model-number”
compatible < stringlist > 定義一系列的字符串, 用來指定內(nèi)核中哪個machinedesc可以支持本設(shè)備

例如:compatible = "samsung,smdk2440","samsung,s3c24xx" ,內(nèi)核會優(yōu)先尋找支持smdk2440的machinedesc結(jié)構(gòu)體,如果找不到才會繼續(xù)尋找支持s3c24xx的machine_desc結(jié)構(gòu)體(優(yōu)先選擇第一項,然后才是第二項,第三項……)

2.2.3 特殊節(jié)點

2.2.3.1 /aliases 子節(jié)點

aliases 節(jié)點的主要功能就是定義別名,定義別名的目的就是為了方便訪問節(jié)點。

例如:定義 flexcan1 和 flexcan2 的別名是 can0 和 can1。 

  1. aliases {  
  2.     can0 = &flexcan1;  
  3.     can1 = &flexcan2;  
  4. }; 

2.2.3.2 /memory 子節(jié)點

所有設(shè)備樹都需要一個memory設(shè)備節(jié)點,它描述了系統(tǒng)的物理內(nèi)存布局。如果系統(tǒng)有多個內(nèi)存塊,可以創(chuàng)建多個memory節(jié)點,或者可以在單個memory節(jié)點的reg屬性中指定這些地址范圍和內(nèi)存空間大小。

例如:一個64位的系統(tǒng)有兩塊內(nèi)存空間:RAM1:起始地址是0x0,地址空間是 0x80000000;RAM2:起始地址是0x10000000,地址空間也是0x80000000;同時根節(jié)點下的 #address-cells = <2>和#size-cells = <2>,這個memory節(jié)點描述為: 

  1. memory@0 {  
  2.     device_type = "memory" 
  3.     reg = <0x00000000 0x00000000 0x00000000 0x80000000  
  4.            0x00000000 0x10000000 0x00000000 0x80000000> 
  5. }; 

或者: 

  1. memory@0 {  
  2.     device_type = "memory" 
  3.     reg = <0x00000000 0x00000000 0x00000000 0x80000000> 
  4. };  
  5. memory@10000000 {  
  6.     device_type = "memory" 
  7.     reg = <0x00000000 0x10000000 0x00000000 0x80000000> 
  8. }; 

2.2.3.3 /chosen 子節(jié)點

chosen 并不是一個真實的設(shè)備, chosen 節(jié)點主要是為了 uboot 向 Linux 內(nèi)核傳遞數(shù)據(jù),重點是 bootargs 參數(shù)。例如: 

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

2.2.3.4 /cpus 和 /cpus/cpu* 子節(jié)點

cpus節(jié)點下有1個或多個cpu子節(jié)點, cpu子節(jié)點中用reg屬性用來標明自己是哪一個cpu,所以 /cpus 中有以下2個屬性: 

  1. #address-cells   // 在它的子節(jié)點的reg屬性中, 使用多少個u32整數(shù)來描述地址(address)  
  2. #size-cells      // 在它的子節(jié)點的reg屬性中, 使用多少個u32整數(shù)來描述大小(size)  
  3.                  // 必須設(shè)置為0 

例如: 

  1. cpus {  
  2.     #address-cells = <1> 
  3.     #size-cells = <0> 
  4.     cpu@0 {  
  5.         device_type = "cpu" 
  6.         reg = <0> 
  7.         cache-unified;  
  8.         cache-size = <0x8000>; // L1, 32KB  
  9.         cache-block-size = <32> 
  10.         timebase-frequency = <82500000>; // 82.5 MHz  
  11.         next-level-cache = <&L2_0>; // phandle to L2  
  12.         L2_0:l2-cache {  
  13.             compatible = "cache" 
  14.             cache-unified;  
  15.             cache-size = <0x40000>; // 256 KB  
  16.             cache-sets = <1024> 
  17.             cache-block-size = <32> 
  18.             cache-level = <2> 
  19.             next-level-cache = <&L3>; // phandle to L3  
  20.             L3:l3-cache {  
  21.                 compatible = "cache" 
  22.                 cache-unified;  
  23.                 cache-size = <0x40000>; // 256 KB  
  24.                 cache-sets = <0x400>; // 1024  
  25.                 cache-block-size = <32> 
  26.                 cache-level = <3> 
  27.                 };  
  28.             }; 
  29.         };  
  30.     cpu@1 {  
  31.         device_type = "cpu" 
  32.         reg = <1> 
  33.         cache-unified;  
  34.         cache-block-size = <32> 
  35.         cache-size = <0x8000>; // L1, 32KB  
  36.         timebase-frequency = <82500000>; // 82.5 MHzclock-frequency = <825000000>; // 825 MHz  
  37.         cache-level = <2> 
  38.         next-level-cache = <&L2_1>; // phandle to L2  
  39.         L2_1:l2-cache {  
  40.             compatible = "cache" 
  41.             cache-unified;  
  42.             cache-size = <0x40000>; // 256 KB  
  43.             cache-sets = <0x400>; // 1024  
  44.             cache-line-size = <32>; // 32 bytes  
  45.             next-level-cache = <&L3>; // phandle to L3  
  46.             };  
  47.         };  
  48. }; 

2.2.3.5 引用其他節(jié)點

2.2.3.5.1 phandle

節(jié)點中的phandle屬性, 它的取值必須是唯一的(不要跟其他的phandle值一樣) 

  1. pic@10000000 {  
  2.     phandle = <1> 
  3.     interrupt-controller;  
  4. };  
  5. another-device-node {  
  6.     interrupt-parent = <1>;   // 使用phandle值為1來引用上述節(jié)點  
  7. }; 

2.2.3.5.2 label 

  1. PIC: pic@10000000 {  
  2.     interrupt-controller;  
  3. };  
  4. another-device-node {  
  5.     interrupt-parent = <&PIC>;   // 使用label來引用上述節(jié)點,   
  6.                                  // 使用lable時實際上也是使用phandle來引用,   
  7.                                  // 在編譯dts文件為dtb文件時, 編譯器dtc會在dtb中插入phandle屬性  
  8. }; 

2.2.4 DTB格式

.dtb文件是 .dts 被 DTC 編譯后的二進制格式的設(shè)備樹文件,它的文件布局如下:

從上圖可以看出,DTB文件主要包含四部分內(nèi)容:struct ftdheader、memory reservation block、structure block、strings block;

 ① struct ftdheader:用來表明各個分部的偏移地址,整個文件的大小,版本號等;

 ② memory reservation block:在設(shè)備樹中使用/memreserve/ 定義的保留內(nèi)存信息;

 ③ structure block:保存節(jié)點的信息,節(jié)點的結(jié)構(gòu);

 ④ strings block:保存屬性的名字,單獨作為字符串保存;

struct ftd_header結(jié)構(gòu)體的定義如下: 

  1. struct fdt_header {  
  2.     uint32_t magic; /*它的值為0xd00dfeed,以大端模式保存*/  
  3.     uint32_t totalsize; /*整個DTB文件的大小*/  
  4.     uint32_t off_dt_struct; /*structure block的偏移地址*/  
  5.     uint32_t off_dt_strings; /*strings block的偏移地址*/  
  6.     uint32_t off_mem_rsvmap; /*memory reservation block的偏移地址*/  
  7.     uint32_t version; /*設(shè)備樹版本信息*/  
  8.     uint32_t last_comp_version; /*向后兼容的最低設(shè)備樹版本信息*/  
  9.     uint32_t boot_cpuid_phys; /*CPU ID*/  
  10.     uint32_t size_dt_strings; /*strings block的大小*/  
  11.     uint32_t size_dt_struct; /*structure block的大小*/  
  12. }; 

fdtreserveentry結(jié)構(gòu)體如下: 

  1. struct fdt_reserve_entry {  
  2.     uint64_t address;  /*64bit 的地址*/  
  3.     uint64_t size;    /*保留的內(nèi)存空間的大小*/  
  4. }; 

該結(jié)構(gòu)體用于表示memreserve的起始地址和內(nèi)存空間的大小,它緊跟在struct ftdheader結(jié)構(gòu)體后面。

例如:/memreserve/ 0x33000000 0x10000,fdtreserve_entry 結(jié)構(gòu)體的成員 address = 0x33000000,size = 0x10000。

structure block是用于描述設(shè)備樹節(jié)點的結(jié)構(gòu),保存著節(jié)點的信息、節(jié)點的結(jié)構(gòu),它有5種標記類型:

 ① FDTBEGINNODE (0x00000001):表示節(jié)點的開始,它的后面緊跟的是節(jié)點的名字;

 ② FDTENDNODE (0x00000002):表示節(jié)點的結(jié)束;

 ③ FDTPROP (0x00000003) :表示開始描述節(jié)點里面的一個屬性,在FDTPROP后面緊跟一個結(jié)構(gòu)體如下所示: 

  1. struct {  
  2.     uint32_t len;       /*表示屬性值的長度*/  
  3.     uint32_t nameoff;   /*屬性的名字在string block的偏移*/  
  4. }  

注:上面的這個結(jié)構(gòu)體后緊跟著是屬性值,屬性的名字保存在字符串塊(Strings block)中。

 ④ FDT_END (0x00000009):表示structure block的結(jié)束。

單個節(jié)點在structure block的存儲格式如下圖如所示:(注:子節(jié)點的存儲格式也是一樣)

總結(jié):

 (1) DTB文件可以分為四個部分:struct ftdheader、memory reservation block、structure block、strings block;

 (2) 最開始的為struct ftdheader,包含其它三個部分的偏移地址;

 (3) memory reservation block記錄保留內(nèi)存信息;

 (4) structure block保存節(jié)點的信息,節(jié)點的結(jié)構(gòu);

 (5) strings block保存屬性的名字,將屬性名字單獨作為字符串保存。

2.2.5 DTB文件分析

編譯生成dtb文件的源設(shè)備樹jz2440.dts文件如下: 

  1. // SPDX-License-Identifier: GPL-2.0  
  2. /*  
  3.  * SAMSUNG SMDK2440 board device tree source  
  4.  *  
  5.  * Copyright (c) 2018 weidongshan@qq.com  
  6.  * dtc -I dtb -O dts -o jz2440.dts jz2440.dtb  
  7.  */  
  8. #define S3C2410_GPA(_nr)    ((0<<16) + (_nr))  
  9. #define S3C2410_GPB(_nr)    ((1<<16) + (_nr))  
  10. #define S3C2410_GPC(_nr)    ((2<<16) + (_nr))  
  11. #define S3C2410_GPD(_nr)    ((3<<16) + (_nr))  
  12. #define S3C2410_GPE(_nr)    ((4<<16) + (_nr))  
  13. #define S3C2410_GPF(_nr)    ((5<<16) + (_nr))  
  14. #define S3C2410_GPG(_nr)    ((6<<16) + (_nr))  
  15. #define S3C2410_GPH(_nr)    ((7<<16) + (_nr))  
  16. #define S3C2410_GPJ(_nr)    ((8<<16) + (_nr))  
  17. #define S3C2410_GPK(_nr)    ((9<<16) + (_nr))  
  18. #define S3C2410_GPL(_nr)    ((10<<16) + (_nr))  
  19. #define S3C2410_GPM(_nr)    ((11<<16) + (_nr))  
  20. /dts-v1/;  
  21. / {  
  22.     model = "SMDK2440" 
  23.     compatible = "samsung,smdk2440" 
  24.     #address-cells = <1> 
  25.     #size-cells = <1> 
  26.     memory@30000000 {  
  27.         device_type = "memory" 
  28.         reg =  <0x30000000 0x4000000> 
  29.     }; 
  30.      chosen {  
  31.         bootargs = "console=ttySAC0,115200 rw root=/dev/mtdblock4 rootfstype=yaffs2" 
  32.     };  
  33.     led {  
  34.         compatible = "jz2440_led" 
  35.         reg = <S3C2410_GPF(5) 1> 
  36.     };  
  37. }; 

jz2440.dtb 文件的內(nèi)容如下:

接下來我們對應(yīng)上圖的編號逐一分析,其中編號①~⑩表示的是fdtheader 結(jié)構(gòu)體的成員信息:

 ① 對應(yīng) magic,表示設(shè)備樹魔數(shù),固定為0xd00dfeed;

 ② 對應(yīng) totalsize,表示整個設(shè)備設(shè)dtb文件的大小,從上圖可知0x000001B9正好是dtb文件的大小441B;

 ③ 對應(yīng) offdtstruct,表示structure block的偏移地址,為 0x00000038;

 ④ 對應(yīng)offdtstrings,表示 strings block的偏移地址,為 0x00000174;

 ⑤ 對應(yīng) offmemrsvmap;,表示memory reservation block的偏移地址,為 0x00000028;

 ⑥ 對應(yīng) version ,設(shè)備樹版本的版本號為0x11;

 ⑦ 對應(yīng) lastcompversion,向下兼容版本號0x10;

 ⑧ 對應(yīng) bootcpuidphys,在多核處理器中用于啟動的主cpu的物理id,為0x0;

 ⑨ 對應(yīng) sizedtstrings,strings block的大小為 0x45;

 ⑩ 對應(yīng) sizedtstruct,structure block的大小為 0x0000013C;

 ⑪~⑫ 對應(yīng)結(jié)構(gòu)體 fdtreserve_entry ,它所在的地址為0x28,jz2440.dts 設(shè)備樹文件沒有設(shè)置 /memreserve/,所以address = 0x0,size = 0x0;

 ⑬ 所處的地址是0x38,它處在structure block中,0x00000001表示的是設(shè)備節(jié)點的開始;

 ⑭ 接著緊跟的是設(shè)備節(jié)點的名字,這里是根節(jié)點,所以為0x00000000;

 ⑮ 0x00000003 表示的是開始描述設(shè)備節(jié)點的一個屬性;

 ⑯ 表示這個屬性值的長度為0x09;

 ⑰ 表示這個屬性的名字在strings block的偏移量是0,找到strings block的地址0x0174的地方,可知這個屬性的名字是model;

 ⑱ 這個model屬性的值是"SMDK2440",加上字符串的結(jié)束符NULL,剛好9個字節(jié)。

2.2.6 DTB文件結(jié)構(gòu)圖

(1) dtb 文件的結(jié)構(gòu)圖如下:

Linux設(shè)備樹語法規(guī)范

(2) 設(shè)備節(jié)點的結(jié)構(gòu)圖如下:

 

 

責(zé)任編輯:龐桂玉 來源: Linux學(xué)習(xí)
相關(guān)推薦

2021-10-06 20:23:08

Linux共享內(nèi)存

2021-08-13 05:50:01

ContainerdDockerKubernetes

2024-01-09 08:24:47

JMM核心線程

2021-03-28 18:40:02

LinuxWindowsJava

2019-09-23 10:51:14

JavaJava虛擬機Linux

2020-12-18 11:54:22

Linux系統(tǒng)架構(gòu)

2021-02-22 09:05:59

Linux字符設(shè)備架構(gòu)

2021-06-04 09:35:05

Linux字符設(shè)備架構(gòu)

2022-08-17 18:25:37

Java分布式搜索引擎

2021-08-31 07:02:20

Diff算法DOM

2020-10-29 08:55:04

微服務(wù)

2022-04-15 08:03:41

SaaS應(yīng)用管理市場

2021-04-19 17:32:34

Java內(nèi)存模型

2021-08-31 07:02:34

數(shù)據(jù)響應(yīng)Vue偵測數(shù)據(jù)變化

2021-04-02 06:17:10

大數(shù)加減乘除數(shù)據(jù)結(jié)構(gòu)算法

2025-04-07 08:20:00

ORMPython代碼

2020-11-30 12:32:40

PyTorch語義分割python

2023-08-01 08:27:15

Java I/ONIO

2024-01-29 09:04:15

Wi-Fi數(shù)據(jù)設(shè)備

2022-06-10 09:04:24

Python讀取文件代碼
點贊
收藏

51CTO技術(shù)棧公眾號