精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux Device Tree(二):基本概念

系統(tǒng) Linux
本文主要是介紹Device Tree的基礎(chǔ)概念。

一、前言

一些背景知識(例如:為何要引入Device Tree,這個機(jī)制是用來解決什么問題的)請參考引入Device Tree的原因,本文主要是介紹Device Tree的基礎(chǔ)概念。

簡單的說,如果要使用Device Tree,首先用戶要了解自己的硬件配置和系統(tǒng)運(yùn)行參數(shù),并把這些信息組織成Device Tree source file。通過DTC(Device Tree Compiler),可以將這些適合人類閱讀的Device Tree source file變成適合機(jī)器處理的Device Tree binary file(有一個更好聽的名字,DTB,device tree blob)。在系統(tǒng)啟動的時候,boot program(例如:firmware、bootloader)可以將保存在flash中的DTB copy到內(nèi)存(當(dāng)然也可以通過其他方式,例如可以通過bootloader的交互式命令加載DTB,或者firmware可以探測到device的信息,組織成DTB保存在內(nèi)存中),并把DTB的起始地址傳遞給client program(例如OS kernel,bootloader或者其他特殊功能的程序)。對于計(jì)算機(jī)系統(tǒng)(computer system),一般是firmware->bootloader->OS,對于嵌入式系統(tǒng),一般是bootloader->OS。

本文主要描述下面兩個主題:

1、Device Tree source file語法介紹

2、Device Tree binaryfile格式介紹

二、Device Tree的結(jié)構(gòu)

在描述Device Tree的結(jié)構(gòu)之前,我們先問一個基礎(chǔ)問題:是否Device Tree要描述系統(tǒng)中的所有硬件信息?答案是否定的。基本上,那些可以動態(tài)探測到的設(shè)備是不需要描述的,例如USB device。不過對于SOC上的usb host controller,它是無法動態(tài)識別的,需要在device tree中描述。同樣的道理,在computer system中,PCI device可以被動態(tài)探測到,不需要在device tree中描述,但是PCI bridge如果不能被探測,那么就需要描述之。

為了了解Device Tree的結(jié)構(gòu),我們首先給出一個Device Tree的示例:

  1. / o device-tree  
  2.       |- name = "device-tree"  
  3.       |- model = "MyBoardName"  
  4.       |- compatible = "MyBoardFamilyName"  
  5.       |- #address-cells = <2>  
  6.       |- #size-cells = <2>  
  7.       |- linux,phandle = <0>  
  8.       |  
  9.       o cpus  
  10.       | | - name = "cpus"  
  11.       | | - linux,phandle = <1>  
  12.       | | - #address-cells = <1>  
  13.       | | - #size-cells = <0>  
  14.       | |  
  15.       | o PowerPC,970@0  
  16.       |   |- name = "PowerPC,970"  
  17.       |   |- device_type = "cpu"  
  18.       |   |- reg = <0>  
  19.       |   |- clock-frequency = <0x5f5e1000>  
  20.       |   |- 64-bit  
  21.       |   |- linux,phandle = <2>  
  22.       |  
  23.       o memory@0  
  24.       | |- name = "memory"  
  25.       | |- device_type = "memory"  
  26.       | |- reg = <0x00000000 0x00000000 0x00000000 0x20000000> 
  27.       | |- linux,phandle = <3>  
  28.       |  
  29.       o chosen  
  30.         |- name = "chosen"  
  31.         |- bootargs = "root=/dev/sda2"  
  32.         |- linux,phandle = <4>  

從上圖中可以看出,device tree的基本單元是node。這些node被組織成樹狀結(jié)構(gòu),除了root node,每個node都只有一個parent。一個device tree文件中只能有一個root node。每個node中包含了若干的property/value來描述該node的一些特性。每個node用節(jié)點(diǎn)名字(node name)標(biāo)識,節(jié)點(diǎn)名字的格式是node-name@unit-address。如果該node沒有reg屬性(后面會描述這個property),那么該節(jié)點(diǎn)名字中必須不能包括@和unit-address。unit-address的具體格式是和設(shè)備掛在那個bus上相關(guān)。例如對于cpu,其unit-address就是從0開始編址,以此加一。而具體的設(shè)備,例如以太網(wǎng)控制器,其unit-address就是寄存器地址。root node的node name是確定的,必須是“/”。

在一個樹狀結(jié)構(gòu)的device tree中,如何引用一個node呢?要想唯一指定一個node必須使用full path,例如/node-name-1/node-name-2/node-name-N。在上面的例子中,cpu node我們可以通過/cpus/PowerPC,970@0訪問。

屬性(property)值標(biāo)識了設(shè)備的特性,它的值(value)是多種多樣的:

1、可能是空,也就是沒有值的定義。例如上圖中的64-bit ,這個屬性沒有賦值。

2、可能是一個u32、u64的數(shù)值(值得一提的是cell這個術(shù)語,在Device Tree表示32bit的信息單位)。例如#address-cells = <1> 。當(dāng)然,可能是一個數(shù)組。例如<0x00000000 0x00000000 0x00000000 0x20000000>

3、可能是一個字符串。例如device_type = "memory" ,當(dāng)然也可能是一個string list。例如"PowerPC,970"

三、Device Tree source file語法介紹

了解了基本的device tree的結(jié)構(gòu)后,我們總要把這些結(jié)構(gòu)體現(xiàn)在device tree source code上來。在linux kernel中,擴(kuò)展名是dts的文件就是描述硬件信息的device tree source file,在dts文件中,一個node被定義成:

  1. [label:] node-name[@unit-address] {  
  2.    [properties definitions]  
  3.    [child nodes]  
  4.  

“[]”表示option,因此可以定義一個只有node name的空節(jié)點(diǎn)。label方便在dts文件中引用,具體后面會描述。child node的格式和node是完全一樣的,因此,一個dts文件中就是若干嵌套組成的node,property以及child note、child note property描述。

考慮到空泛的談比較枯燥,我們用實(shí)例來講解Device Tree Source file 的數(shù)據(jù)格式。假設(shè)蝸窩科技制作了一個S3C2416的開發(fā)板,我們把該development board命名為snail,那么需要撰寫一個s3c2416-snail.dts的文件。如果把所有的開發(fā)板的硬件信息(SOC以及外設(shè))都描述在一個文件中是不合理的,因此有可能其他公司也使用S3C2416搭建自己的開發(fā)板并命令pig、cow什么的,如果大家都用自己的dts文件描述硬件,那么其中大部分是重復(fù)的,因此我們把和S3C2416相關(guān)的硬件描述保存成一個單獨(dú)的dts文件可以供使用S3C2416的target board來引用并將文件的擴(kuò)展名變成dtsi(i表示include)。同理,三星公司的S3C24xx系列是一個SOC family,這些SOCs(2410、2416、2450等)也有相同的內(nèi)容,因此同樣的道理,我們可以將公共部分抽取出來,變成s3c24xx.dtsi,方便大家include。同樣的道理,各家ARM vendor也會共用一些硬件定義信息,這個文件就是skeleton.dtsi。我們自下而上(類似C++中的從基類到頂層的派生類)逐個進(jìn)行分析。

1、skeleton.dtsi。位于linux-3.14\arch\arm\boot\dts目錄下,具體該文件的內(nèi)容如下:

  1. / {  
  2.     #address-cells = <1>;  
  3.     #size-cells = <1>;  
  4.     chosen { };  
  5.     aliases { };  
  6.     memory { device_type = "memory"; reg = <0 0>; };  
  7. };  

device tree顧名思義是一個樹狀的結(jié)構(gòu),既然是樹,必然有根。“/”是根節(jié)點(diǎn)的node name。“{”和“}”之間的內(nèi)容是該節(jié)點(diǎn)的具體的定義,其內(nèi)容包括各種屬性的定義以及child node的定義。chosen、aliases和memory都是sub node,sub node的結(jié)構(gòu)和root node是完全一樣的,因此,sub node也有自己的屬性和它自己的sub node,最終形成了一個樹狀的device tree。屬性的定義采用property = value的形式。例如#address-cells和#size-cells就是property,而<1>就是value。value有三種情況:

1)屬性值是text string或者string list,用雙引號表示。例如device_type = "memory"

2)屬性值是32bit unsigned integers,用尖括號表示。例如#size-cells = <1>

3)屬性值是binary data,用方括號表示。例如binary-property = [0x01 0x23 0x45 0x67]

如果一個device node中包含了有尋址需求(要定義reg property)的sub node(后文也許會用child node,和sub node是一樣的意思),那么就必須要定義這兩個屬性。“#”是number的意思,#address-cells這個屬性是用來描述sub node中的reg屬性的地址域特性的,也就是說需要用多少個u32的cell來描述該地址域。同理可以推斷#size-cells的含義,下面對reg的描述中會給出更詳細(xì)的信息。

chosen node主要用來描述由系統(tǒng)firmware指定的runtime parameter。如果存在chosen這個node,其parent node必須是名字是“/”的根節(jié)點(diǎn)。原來通過tag list傳遞的一些linux kernel的運(yùn)行時參數(shù)可以通過Device Tree傳遞。例如command line可以通過bootargs這個property這個屬性傳遞;initrd的開始地址也可以通過linux,initrd-start這個property這個屬性傳遞。在本例中,chosen節(jié)點(diǎn)是空的,在實(shí)際中,建議增加一個bootargs的屬性,例如:

  1. "root=/dev/nfs nfsroot=1.1.1.1:/nfsboot ip=1.1.1.2:1.1.1.1:1.1.1.1:255.255.255.0::usbd0:off console=ttyS0,115200 mem=64M@0x30000000" 

通過該command line可以控制內(nèi)核從usbnet啟動,當(dāng)然,具體項(xiàng)目要相應(yīng)修改command line以便適應(yīng)不同的需求。我們知道,device tree用于HW platform識別,runtime parameter傳遞以及硬件設(shè)備描述。chosen節(jié)點(diǎn)并沒有描述任何硬件設(shè)備節(jié)點(diǎn)的信息,它只是傳遞了runtime parameter。

aliases 節(jié)點(diǎn)定義了一些別名。為何要定義這個node呢?因?yàn)镈evice tree是樹狀結(jié)構(gòu),當(dāng)要引用一個node的時候要指明相對于root node的full path,例如/node-name-1/node-name-2/node-name-N。如果多次引用,每次都要寫這么復(fù)雜的字符串多少是有些麻煩,因此可以在aliases 節(jié)點(diǎn)定義一些設(shè)備節(jié)點(diǎn)full path的縮寫。skeleton.dtsi中沒有定義aliases,下面的section中會進(jìn)一步用具體的例子描述之。

memory device node是所有設(shè)備樹文件的必備節(jié)點(diǎn),它定義了系統(tǒng)物理內(nèi)存的layout。device_type屬性定義了該node的設(shè)備類型,例如cpu、serial等。對于memory node,其device_type必須等于memory。reg屬性定義了訪問該device node的地址信息,該屬性的值被解析成任意長度的(address,size)數(shù)組,具體用多長的數(shù)據(jù)來表示address和size是在其parent node中定義(#address-cells和#size-cells)。對于device node,reg描述了memory-mapped IO register的offset和length。對于memory node,定義了該memory的起始地址和長度。

本例中的物理內(nèi)存的布局并沒有通過memory node傳遞,其實(shí)我們可以使用command line傳遞,我們command line中的參數(shù)“mem=64M@0x30000000”已經(jīng)給出了具體的信息。我們用另外一個例子來加深對本節(jié)描述的各個屬性以及memory node的理解。假設(shè)我們的系統(tǒng)是64bit的,physical memory分成兩段,定義如下:

RAM: starting address 0x0, length 0x80000000 (2GB)

RAM: starting address 0x100000000, length 0x100000000 (4GB)

對于這樣的系統(tǒng),我們可以將root node中的#address-cells和#size-cells這兩個屬性值設(shè)定為2,可以用下面兩種方法來描述物理內(nèi)存:

方法1:

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

方法2:

  1. memory@0 {  
  2.     device_type = "memory";  
  3.     reg = <0x000000000 0x00000000 0x00000000 0x80000000>;  
  4. }; 
  5.  
  6. memory@100000000 {  
  7.     device_type = "memory";  
  8.     reg = <0x000000001 0x00000000 0x00000001 0x00000000>;  
  9. };  

2、s3c24xx.dtsi。位于linux-3.14\arch\arm\boot\dts目錄下,具體該文件的內(nèi)容如下(有些內(nèi)容省略了,領(lǐng)會精神即可,不需要描述每一個硬件定義的細(xì)節(jié)):

  1. #include "skeleton.dtsi" 
  2.  
  3. / {  
  4.     compatible = "samsung,s3c24xx"; -------------------(A)  
  5.     interrupt-parent = <&intc>; ----------------------(B) 
  6.  
  7.     aliases {  
  8.         pinctrl0 = &pinctrl_0; ------------------------(C)  
  9.     }; 
  10.  
  11.     intc:interrupt-controller@4a000000 { ------------------(D)  
  12.         compatible = "samsung,s3c2410-irq";  
  13.         reg = <0x4a000000 0x100>;  
  14.         interrupt-controller;  
  15.         #interrupt-cells = <4>;  
  16.     }; 
  17.  
  18.     serial@50000000 { ----------------------(E)   
  19.         compatible = "samsung,s3c2410-uart";  
  20.         reg = <0x50000000 0x4000>;  
  21.         interrupts = <1 0 4 28>, <1 1 4 28>;  
  22.         status = "disabled";  
  23.     }; 
  24.  
  25.     pinctrl_0: pinctrl@56000000 {------------------(F)  
  26.         reg = <0x56000000 0x1000>; 
  27.  
  28.         wakeup-interrupt-controller {  
  29.             compatible = "samsung,s3c2410-wakeup-eint";  
  30.             interrupts = <0 0 0 3>, 
  31.                      <0 0 1 3>, 
  32.                      <0 0 2 3>, 
  33.                      <0 0 3 3>, 
  34.                      <0 0 4 4>, 
  35.                      <0 0 5 4>; 
  36.         };  
  37.     }; 
  38.  
  39. ……  
  40. };  

這個文件描述了三星公司的S3C24xx系列SOC family共同的硬件block信息。首先提出的問題就是:為何定義了兩個根節(jié)點(diǎn)?按理說Device Tree只能有一個根節(jié)點(diǎn),所有其他的節(jié)點(diǎn)都是派生于根節(jié)點(diǎn)的。我的猜測是這樣的:Device Tree Compiler會對DTS的node進(jìn)行合并,最終生成的DTB只有一個root node。OK,我們下面開始逐一分析:

(A)在描述compatible屬性之前要先描述model屬性。model屬性指明了該設(shè)備屬于哪個設(shè)備生產(chǎn)商的哪一個model。一般而言,我們會給model賦值“manufacturer,model”。例如model = "samsung,s3c24xx"。samsung是生產(chǎn)商,s3c24xx是model類型,指明了具體的是哪一個系列的SOC。OK,現(xiàn)在我們回到compatible屬性,該屬性的值是string list,定義了一系列的modle(每個string是一個model)。這些字符串列表被操作系統(tǒng)用來選擇用哪一個driver來驅(qū)動該設(shè)備。假設(shè)定義該屬性:compatible = “aaaaaa”, “bbbbb"。那么操作操作系統(tǒng)可能首先使用aaaaaa來匹配適合的driver,如果沒有匹配到,那么使用字符串bbbbb來繼續(xù)尋找適合的driver,對于本例,compatible = "samsung,s3c24xx",這里只定義了一個modle而不是一個list。對于root node,compatible屬性是用來匹配machine type的(在device tree代碼分析文章中會給出更細(xì)致的描述)。對于普通的HW block的節(jié)點(diǎn),例如interrupt-controller,compatible屬性是用來匹配適合的driver的。

(B)具體各個HW block的interrupt source是如何物理的連接到interruptcontroller的呢?在dts文件中是用interrupt-parent這個屬性來標(biāo)識的。且慢,這里定義interrupt-parent屬性的是root node,難道root node會產(chǎn)生中斷到interrupt controller嗎?當(dāng)然不會,只不過如果一個能夠產(chǎn)生中斷的device node沒有定義interrupt-parent的話,其interrupt-parent屬性就是跟隨parent node。因此,與其在所有的下游設(shè)備中定義interrupt-parent,不如統(tǒng)一在root node中定義了。

intc是一個lable,標(biāo)識了一個device node(在本例中是標(biāo)識了interrupt-controller@4a000000 這個device node)。實(shí)際上,interrupt-parent屬性值應(yīng)該是是一個u32的整數(shù)值(這個整數(shù)值在Device Tree的范圍內(nèi)唯一識別了一個device node,也就是phandle),不過,在dts文件中中,可以使用類似c語言的Labels and References機(jī)制。定義一個lable,唯一標(biāo)識一個node或者property,后續(xù)可以使用&來引用這個lable。DTC會將lable轉(zhuǎn)換成u32的整數(shù)值放入到DTB中,用戶層面就不再關(guān)心具體轉(zhuǎn)換的整數(shù)值了。

關(guān)于interrupt,我們值得進(jìn)一步描述。在Device Tree中,有一個概念叫做interrupt tree,也就是說interrupt也是一個樹狀結(jié)構(gòu)。我們以下圖為例(該圖來自Power_ePAPR_APPROVED_v1.1): 

 

 

 

系統(tǒng)中有一個interrrupt tree的根節(jié)點(diǎn),device1、device2以及PCI host bridge的interrupt line都是連接到root interrupt controller的。PCI host bridge設(shè)備中有一些下游的設(shè)備,也會產(chǎn)生中斷,但是他們的中斷都是連接到PCI host bridge上的interrupt controller(術(shù)語叫做interrupt nexus),然后報(bào)告到root interrupt controller的。每個能產(chǎn)生中斷的設(shè)備都可以產(chǎn)生一個或者多個interrupt,每個interrupt source(另外一個術(shù)語叫做interrupt specifier,描述了interrupt source的信息)都是限定在其所屬的interrupt domain中。

在了解了上述的概念后,我們可以回頭再看看interrupt-parent這個屬性。其實(shí)這個屬性是建立interrupt tree的關(guān)鍵屬性。它指明了設(shè)備樹中的各個device node如何路由interrupt event。另外,需要提醒的是interrupt controller也是可以級聯(lián)的,上圖中沒有表示出來。那么在這種情況下如何定義interrupt tree的root呢?那個沒有定義interrupt-parent的interrupt controller就是root。

(C)pinctrl0是一個縮寫,他是/pinctrl@56000000的別名。這里同樣也是使用了Labels and References機(jī)制。

(D)intc(node name是interrupt-controller@4a000000 ,我這里直接使用lable)是描述interrupt controller的device node。根據(jù)S3C24xx的datasheet,我們知道interrupt controller的寄存器地址從0x4a000000開始,長度為0x100(實(shí)際2451的interrupt的寄存器地址空間沒有那么長,0x4a000074是最后一個寄存器),也就是reg屬性定義的內(nèi)容。interrupt-controller屬性為空,只是用來標(biāo)識該node是一個interrupt controller而不是interrupt nexus(interrupt nexus需要在不同的interrupt domains之間進(jìn)行翻譯,需要定義interrupt-map的屬性,本文不涉及這部分的內(nèi)容)。#interrupt-cells 和#address-cells概念是類似的,也就是說,用多少個u32來標(biāo)識一個interrupt source。我們可以看到,在具體HW block的interrupt定義中都是用了4個u32來表示,例如串口的中斷是這樣定義的:

  1. interrupts = <1 0 4 28>, <1 1 4 28>; 

(E) 從reg屬性可以serial controller寄存器地址從0x50000000 開始,長度為0x4000。對于一個能產(chǎn)生中斷的設(shè)備,必須定義interrupts這個屬性。也可以定義interrupt-parent這個屬性,如果不定義,則繼承其parent node的interrupt-parent屬性。 對于interrupt屬性值,各個interrupt controller定義是不一樣的,有的用3個u32表示,有的用4個。具體上面的各個數(shù)字的解釋權(quán)歸相關(guān)的interrupt controller所有。對于中斷屬性的具體值的描述我們會在device tree的第三份文檔-代碼分析中描述。

(F)這個node是描述GPIO控制的。這個節(jié)點(diǎn)定義了一個wakeup-interrupt-controller 的子節(jié)點(diǎn),用來描述有喚醒功能的中斷源。

3、s3c2416.dtsi。位于linux-3.14\arch\arm\boot\dts目錄下,具體該文件的內(nèi)容如下(有些內(nèi)容省略了,領(lǐng)會精神即可,不需要描述每一個硬件定義的細(xì)節(jié)):

  1. #include "s3c24xx.dtsi"  
  2. #include "s3c2416-pinctrl.dtsi" 
  3.  
  4. / {  
  5.     model = "Samsung S3C2416 SoC";   
  6.     compatible = "samsung,s3c2416"; ---------------A 
  7.  
  8.     cpus { ----------------------------B  
  9.         #address-cells = <1>;  
  10.         #size-cells = <0>; 
  11.  
  12.         cpu {  
  13.             compatible = "arm,arm926ejs";  
  14.         };  
  15.     }; 
  16.  
  17.     interrupt-controller@4a000000 { -----------------C  
  18.         compatible = "samsung,s3c2416-irq";  
  19.     }; 
  20.  
  21. …… 
  22.  
  23. };  

(A)在s3c24xx.dtsi文件中已經(jīng)定義了compatible這個屬性,在s3c2416.dtsi中重復(fù)定義了這個屬性,一個node不可能有相同名字的屬性,具體如何處理就交給DTC了。經(jīng)過反編譯,可以看出,DTC是丟棄掉了前一個定義。因此,到目前為止,compatible = samsung,s3c2416。在s3c24xx.dtsi文件中定義了compatible的屬性值被覆蓋了。

(B)對于根節(jié)點(diǎn),必須有一個cpus的child node來描述系統(tǒng)中的CPU信息。對于CPU的編址我們用一個u32整數(shù)就可以描述了,因此,對于cpus node,#address-cells 是1,而#size-cells是0。其實(shí)CPU的node可以定義很多屬性,例如TLB,cache、頻率信息什么的,不過對于ARM,這里只是定義了compatible屬性就OK了,arm926ejs包括了所有的processor相關(guān)的信息。

(C)s3c24xx.dtsi文件和s3c2416.dtsi中都有interrupt-controller@4a000000這個node,DTC會對這兩個node進(jìn)行合并,最終編譯的結(jié)果如下:

  1. interrupt-controller@4a000000 {  
  2.         compatible = "samsung,s3c2416-irq";  
  3.         reg = <0x4a000000 0x100>;  
  4.         interrupt-controller;  
  5.         #interrupt-cells = <0x4>;  
  6.         linux,phandle = <0x1>;  
  7.         phandle = <0x1>;  
  8.     };  

4、s3c2416-pinctrl.dtsi

這個文件定義了pinctrl@56000000 這個節(jié)點(diǎn)的若干child node,主要用來描述GPIO的bank信息。

5、s3c2416-snail.dts

這個文件應(yīng)該定義一些SOC之外的peripherals的定義。

四、Device Tree binary格式

1、DTB整體結(jié)構(gòu)

經(jīng)過Device Tree Compiler編譯,Device Tree source file變成了Device Tree Blob(又稱作flattened device tree)的格式。Device Tree Blob的數(shù)據(jù)組織如下圖所示: 

 

 

 

2、DTB header。

對于DTB header,其各個成員解釋如下:

header field name description
magic 用來識別DTB的。通過這個magic,kernel可以確定bootloader傳遞的參數(shù)block是一個DTB還是tag list。
totalsize DTB的total size
off_dt_struct device tree structure block的offset
off_dt_strings device tree strings block的offset
off_mem_rsvmap offset to memory reserve map。有些系統(tǒng),我們也許會保留一些memory有特殊用途(例如DTB或者initrd image),或者在有些DSP+ARM的SOC platform上,有寫memory被保留用于ARM和DSP進(jìn)行信息交互。這些保留內(nèi)存不會進(jìn)入內(nèi)存管理系統(tǒng)。
version 該DTB的版本。
last_comp_version 兼容版本信息
boot_cpuid_phys 我們在哪一個CPU(用ID標(biāo)識)上booting
dt_strings_size device tree strings block的size。和off_dt_strings一起確定了strings block在內(nèi)存中的位置
dt_struct_size device tree structure block的size。和和off_dt_struct一起確定了device tree structure block在內(nèi)存中的位置

3、 memory reserve map的格式描述

這個區(qū)域包括了若干的reserve memory描述符。每個reserve memory描述符是由address和size組成。其中address和size都是用U64來描述。

4、device tree structure block的格式描述

device tree structure block區(qū)域是由若干的分片組成,每個分片開始位置都是保存了token,以此來描述該分片的屬性和內(nèi)容。共計(jì)有5種token:

(1)FDT_BEGIN_NODE (0x00000001)。該token描述了一個node的開始位置,緊挨著該token的就是node name(包括unit address)

(2)FDT_END_NODE (0x00000002)。該token描述了一個node的結(jié)束位置。

(3)FDT_PROP (0x00000003)。該token描述了一個property的開始位置,該token之后是兩個u32的數(shù)據(jù),分別是length和name offset。length表示該property value data的size。name offset表示該屬性字符串在device tree strings block的偏移值。length和name offset之后就是長度為length具體的屬性值數(shù)據(jù)。

(4)FDT_NOP (0x00000004)。

(5)FDT_END (0x00000009)。該token標(biāo)識了一個DTB的結(jié)束位置。

一個可能的DTB的結(jié)構(gòu)如下:

(1)若干個FDT_NOP(可選)

(2)FDT_BEGIN_NODE

node name

paddings

(3)若干屬性定義。

(4)若干子節(jié)點(diǎn)定義。(被FDT_BEGIN_NODE和FDT_END_NODE包圍)

(5)若干個FDT_NOP(可選)

(6)FDT_END_NODE

(7)FDT_END

5、device tree strings bloc的格式描述

device tree strings bloc定義了各個node中使用的屬性的字符串表。由于很多屬性會出現(xiàn)在多個node中,因此,所有的屬性字符串組成了一個string block。這樣可以壓縮DTB的size。 

責(zé)任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關(guān)推薦

2013-04-16 11:08:44

Android基本概念

2011-03-28 11:05:17

ODBC

2010-03-09 13:36:41

Linux基本概念

2010-06-29 15:58:26

Linux SNMP協(xié)

2012-09-11 14:39:03

Moosefs

2014-04-16 15:11:19

Spark

2009-03-20 11:46:10

MGCP協(xié)議網(wǎng)關(guān)

2017-04-07 10:19:22

交易支付概念

2009-12-21 10:27:52

WCF基本概念

2010-02-23 16:32:29

WCF服務(wù)

2010-06-24 13:26:53

FTP協(xié)議

2009-12-29 18:29:09

Silverlight

2012-12-03 17:12:10

HDFS

2009-08-18 10:34:31

Java入門基本概念

2010-07-07 15:17:40

LDAP協(xié)議

2011-07-19 13:44:39

JavaScript

2010-08-23 16:58:17

DHCP協(xié)議

2010-07-12 09:43:38

Symbian開發(fā)

2011-07-21 15:28:30

java

2010-06-07 19:48:30

UML
點(diǎn)贊
收藏

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

51午夜精品| 精品国产网站地址| 欧美日韩一区二区在线免费观看| 黄色av免费在线看| 九色综合国产一区二区三区| 欧美日本高清视频| 亚洲精品成人无码| 伊人亚洲精品| 岛国视频午夜一区免费在线观看| 五月婷婷一区| 蜜臀av午夜精品| 日本免费在线视频不卡一不卡二| 欧美日本中文字幕| 舐め犯し波多野结衣在线观看| 久久伊人久久| 色老汉av一区二区三区| 久久久久久久香蕉| 尤物网在线观看| 91啪亚洲精品| 999精品视频一区二区三区| 夜夜爽妓女8888视频免费观看| 午夜久久一区| 在线播放国产精品| 强迫凌虐淫辱の牝奴在线观看| 图片一区二区| 在线视频国内一区二区| 隔壁人妻偷人bd中字| 最新国产在线观看| 久久女同互慰一区二区三区| 91福利视频导航| 黄色大全在线观看| 国产伦理一区| 亚洲**2019国产| 国产高潮国产高潮久久久91| 日韩毛片视频| 亚洲天堂色网站| 国产美女视频免费观看下载软件| 国产精品日本一区二区三区在线| 欧美在线观看18| 成人综合视频在线| 韩国日本一区| 亚洲精品欧美综合四区| 亚洲一区精彩视频| 国产福利第一视频在线播放| 99国产一区二区三精品乱码| 岛国一区二区三区高清视频| 99久久亚洲精品日本无码| 日韩国产一区二| 日韩av免费在线播放| 国产真人真事毛片| 在线免费高清一区二区三区| 欧美大片在线看| 久久久久成人网站| 欧美网站在线| 欧美精品999| 久久午夜无码鲁丝片| 欧美精品一线| 欧美精品videossex88| 欧美人妻精品一区二区三区| 国产精品v亚洲精品v日韩精品| 久久在线免费观看视频| 免费在线观看a级片| 国产精品毛片久久| 日韩一区视频在线| 91高清免费观看| 中文字幕免费精品| 欧美极品xxxx| 丰满少妇乱子伦精品看片| 亚洲精选一区| 日韩av毛片网| 中文字幕一级片| 精品一区二区三区久久| 亚洲影院色无极综合| 亚洲第一视频在线播放| av网站一区二区三区| 久久精品二区| 高h视频在线| 1024成人网色www| 五月天色婷婷综合| 免费看电影在线| 精品久久久久久久久中文字幕 | 国产高清久久| 久99九色视频在线观看| 日产亚洲一区二区三区| 久久这里只有| 成人xxxx视频| 亚洲经典一区二区三区| 97成人超碰视| 亚洲国产一区二区在线| 亚洲电影视频在线| 日韩欧美一区二区三区| 久久精品影视大全| 香港久久久电影| 日韩av在线影院| 国产视频不卡在线| 国色天香一区二区| 国产精品白丝jk喷水视频一区 | 久久精品国产精品青草| 亚洲综合色av| 国产三级在线免费观看| 亚洲激情五月婷婷| 欧美成人精品欧美一级乱| 国语自产精品视频在线看抢先版结局| 日韩欧美一区在线| 人妻av无码一区二区三区| 国产电影一区二区在线观看| 69视频在线播放| 国产伦理吴梦梦伦理| 91色乱码一区二区三区| 浴室偷拍美女洗澡456在线| 热三久草你在线| 日韩一区二区免费在线电影| 欧美亚一区二区三区| 欧美一区二区三区久久精品茉莉花| 78m国产成人精品视频| 国产精品污视频| 久久精品一区四区| 日日摸日日碰夜夜爽无码| 色综合视频一区二区三区日韩| 日韩成人在线视频观看| 黑人巨大精品一区二区在线| 日本欧美韩国一区三区| 久久99国产精品99久久| 四虎影院观看视频在线观看| 欧美专区在线观看一区| 少妇饥渴放荡91麻豆| 午夜国产欧美理论在线播放| 国产欧洲精品视频| 毛片免费在线播放| 欧美日韩在线看| 69xxx免费视频| 综合一区在线| 成人黄色午夜影院| 91在线视频免费看| 色呦呦网站一区| 99久久人妻无码中文字幕系列| 在线精品小视频| 国产免费亚洲高清| 中文字幕在线播放| 91久久精品一区二区二区| 中文字幕在线播放视频| 精品电影一区| 国产精品我不卡| 色网在线观看| 欧美xxxxxxxxx| 久草视频免费在线| 成人一道本在线| 国产精品视频一二三四区| 精品一级视频| 麻豆国产精品va在线观看不卡| 中文字幕在线日亚洲9| 亚洲国产电影在线观看| 五月天婷婷激情视频| 精品免费av| 国产精品第七影院| 91电影在线播放| 欧美日韩1234| 久久人妻无码aⅴ毛片a片app| 蜜臀av性久久久久av蜜臀妖精| 日韩欧美精品一区二区三区经典| 欧美最新精品| 影音先锋日韩有码| 一道本无吗一区| 亚洲欧美激情一区二区| 中文字幕乱码在线人视频| 国产精品国码视频| 国产亚洲自拍偷拍| 国产精品一区二区av影院萌芽| 亚洲欧美一区二区三区久久 | 男人天堂亚洲天堂| 亚洲国产欧美日韩精品| 波多野结衣视频网站| 国产片一区二区三区| 天堂av在线8| 欧美激情五月| 久久久久久一区| 日本一区免费网站| 久久亚洲综合国产精品99麻豆精品福利| aaaa一级片| 亚洲aⅴ怡春院| 影音先锋制服丝袜| 国产精品亚洲一区二区三区在线| 精品少妇人欧美激情在线观看| 青青一区二区| 国产精品中文字幕久久久| 在线免费av导航| 国产视频亚洲精品| 亚洲图片视频小说| 亚洲综合激情网| 久操视频免费看| 激情久久久久久久久久久久久久久久| www.夜夜爱| 欧美丝袜一区| 国产激情一区二区三区在线观看 | 国产精品夜间视频香蕉| 色综合999| 国产亚洲视频在线| 高清一区二区三区四区| 欧美视频一区二区三区在线观看| 免费在线观看一级片| 国产亚洲精久久久久久| 男女污污视频网站| 久久久久久亚洲精品杨幂换脸| 91社在线播放| 欧美人与牛zoz0性行为| 亚洲自拍偷拍网址| 成人免费毛片嘿嘿连载视频…| 精品中文字幕在线| av在线三区| 亚洲黄页视频免费观看| 91午夜交换视频| 色综合天天综合网国产成人综合天| 999精品视频在线观看播放| 久久久一区二区| www.黄色网| 激情综合网激情| 亚洲性生活网站| 妖精视频成人观看www| 日韩视频在线观看视频| 国产精品自拍区| 国产精品日本一区二区| 99精品国产九九国产精品| 日韩美女在线播放| 精精国产xxxx视频在线野外| 中文字幕亚洲欧美日韩在线不卡 | 成人网av.com/| 国产成人综合精品| 北岛玲heyzo一区二区| 欧美精品videofree1080p| www.久久久久.com| 上原亚衣av一区二区三区| 国产在线网站| 亚洲精品一区久久久久久| 午夜激情在线视频| 精品福利av导航| 亚洲国产精品18久久久久久| 宅男在线国产精品| 亚洲在线免费观看视频| 欧美亚洲日本国产| 国产成人精品一区二区色戒| 欧美性少妇18aaaa视频| 国产三级av片| 姬川优奈aav一区二区| 亚洲男人第一av| 欧美日韩激情网| 日韩精品视频免费播放| 亚洲v中文字幕| 亚洲欧美在线观看视频| 亚洲动漫第一页| 日本一区二区三区免费视频| 亚洲午夜免费电影| 日韩伦人妻无码| 欧美日韩国产黄| 久久久久久不卡| 在线视频欧美精品| 一本色道久久综合无码人妻| 欧美日韩成人综合天天影院| 国产精品亚洲lv粉色| 91精品国产91久久久久久最新毛片| 国产精品视频一二区| 欧美一级精品大片| 国产1区在线观看| 亚洲福利视频在线| 暖暖视频在线免费观看| 亚洲视频电影图片偷拍一区| 成人h小游戏| 精品国产一区二区三区久久久狼 | 亚洲免费观看视频| 国产一级片视频| 欧美日韩综合视频网址| 国产又粗又猛又爽又| 欧美日韩dvd在线观看| www.国产欧美| 国产视频综合在线| 中文字幕日本在线| 欧美精品激情在线观看| 中文字幕在线视频网站| 国产欧美一区二区| eeuss国产一区二区三区四区| 久久精品国产精品国产精品污 | 99超碰在线观看| 欧美三级乱人伦电影| www日本高清| 亚洲精品美女在线观看| jizz亚洲| 久久久久久亚洲精品不卡| 欧美人体一区二区三区| 96国产粉嫩美女| 国产99亚洲| 国产又粗又爽又黄的视频| 99精品国产一区二区青青牛奶| 国产精品亚洲二区在线观看| 久久99精品国产.久久久久久| 成人免费看片载| 国产午夜精品福利| 久草视频精品在线| 欧美日韩一区不卡| 香蕉人妻av久久久久天天| 精品国内亚洲在观看18黄| 国产高潮在线| 亚洲一区亚洲二区亚洲三区| 中文字幕精品影院| 国产爆乳无码一区二区麻豆| 日韩黄色小视频| 在线免费观看a级片| 亚洲欧美色图小说| 神马久久久久久久| 精品国内片67194| 日本免费中文字幕在线| 98视频在线噜噜噜国产| 24小时成人在线视频| 欧美一二三四五区| 精品91在线| 中文字幕无码毛片免费看| 欧美国产精品一区| 草久久免费视频| 精品国产欧美一区二区| 日本天堂在线观看| 国产精品678| 香蕉视频一区| 日韩 欧美 视频| 国产一区欧美一区| 国产精品一区二区亚洲| 一本到高清视频免费精品| 三级网站免费观看| 欧美成年人网站| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 91精品久久久久久久久久入口 | 一本久久a久久精品vr综合| 嫩草成人www欧美| 精品人妻一区二区三区日产| 亚洲精品老司机| 国产精品一区二区av白丝下载| 国产亚洲人成a一在线v站| 偷拍精品精品一区二区三区| 国内精品久久国产| 国产精品久久| 任你躁av一区二区三区| 亚洲欧美日韩国产成人精品影院 | 麻豆av一区| 亚洲视频www| 六十路息与子猛烈交尾| 亚洲国产一区在线观看| a视频免费在线观看| www.久久撸.com| 欧美aaaaaa| 在线成人性视频| 久久精品国产网站| 中文乱码字幕高清一区二区| 欧美亚洲一区二区在线| 五月婷婷在线视频| 国产伦精品免费视频| 久久精品亚洲人成影院| 成人免费黄色av| 亚洲激情校园春色| 欧美综合视频在线| 91爱视频在线| 国产尤物久久久| 91国产精品视频在线观看| 国产精品久久久久9999吃药| 91精品国自产| 欧美理论片在线观看| 一本一道久久a久久| 韩日视频在线观看| 91视频精品在这里| 色老头在线视频| 自拍偷拍亚洲在线| 玖玖精品一区| 欧美乱大交xxxxx潮喷l头像| 久久综合九色综合97婷婷| 自拍偷拍校园春色| 久久久91精品国产一区不卡| 日本综合精品一区| 久久久久久免费看| 久久久蜜臀国产一区二区| 中文字幕视频免费观看| 欧美美女操人视频| 日韩母乳在线| 波多结衣在线观看| 一区二区三区资源| 神马亚洲视频| 国产精品一区二区三区久久久 | 九九热这里只有在线精品视| 福利片在线一区二区| 99久久国产宗和精品1上映| 中文字幕亚洲综合久久菠萝蜜| 刘亦菲久久免费一区二区| 国产91在线播放精品91| 亚洲在线久久| 六十路息与子猛烈交尾| 欧美久久免费观看| 狼人综合视频| 中文字幕一区二区三区乱码| 99久久精品99国产精品| 在线观看毛片网站| 午夜精品久久久久久久99黑人| 欧美亚洲国产精品久久| 色诱av手机版| 欧美日韩综合色| sm久久捆绑调教精品一区|