echarts树状图点击展开子节点_CPU眼里的结构设备树节点及属性详解
2 設備樹基本模型
DTS基本模型,圖2-1展示了一個設備樹的基本結構。其中“/”為該設備樹文件中唯一的根節點,其后的節點以此根節點發散展開,形成樹狀結構。
圖2-1設備樹基本結構
3? 設備樹編寫規則
3.1 節點
3.1.1節點命名
設備樹除根節點“/”外,其他節點命名根據以下規范:
Label:node-name@unit-address
其中:unit-address : 指定該節點在父節點地址空間中的地址。Lable是該節點的標號,可以省略。節點命名 node-name保證長度在1-31個字符之間,且僅能由表2-1中給出的字符組成。節點名必須以小寫或者大寫字母開頭,并應盡量能夠表明設備的類型。Unit-address必須和該節點屬性中的一個 “reg” 的地址相匹配,如果該節點下沒有”reg”屬性,@unit-address則必須省略掉,node-name須保證在同一級下能夠與其它節點區分。
表2-1有效的節點命名字符
Character | Description |
0-9 | digit |
a-z | lowercase letter |
A-Z | uppercase letter |
, | comma |
. | period |
_ | underscore |
+ | plus sign |
–????? ? | dash |
圖2-2給出了設備樹節點命名的例子,圖中i2c通過A0895000和A0896000兩個單元地址進行區分。
圖2-2設備樹節點命名
節點命名應該通用、可以反應出設備的設備的功能,以下是一些推薦的節點名稱:
? adc
? accelerometer
? atm
? audio-codec
? audio-controller
? backlight
? Bluetooth
? bus
? cache-controller
? camera
? can
? charger
? clock
? clock-controller
? compact-?ash
? cpu
? cpus
? crypto
? disk
? display
? dma-controller
? dsp ?eeprom
? efuse?endpoint
? ethernet
? ethernet-phy
? fdc
? flash
? gnss
? gpio
? gpu
? gyrometer
? hdmi
? i2c
? i2c-mux
? ide
? interrupt-controller
? isa
? keyboard
? key
? keys
? lcd-controller
? led
? leds
? led-controller
? light-sensor
? magnetometer
? mailbox
? mdio
? memory
? memory-controller
? mmc
? mmc-slot
? mouse
? nand-controller
? nvram
? oscillator
? parallel
? pc-card
? pci
? pcie
? phy
? pinctrl
? pmic
? pmu
? port
? ports
? power-monitor
? pwm ? regulator
? reset-controller
? rtc
? sata
? scsi
? serial
? sound
? spi
? sram-controller
? ssi-controller
? syscon
? temperature-sensor
? timer
? touchscreen
? usb
? usb-hub
? usb-phy
? video-codec
? vme
? watchdog
? wiifi
3.1.2節點路徑
設備樹中的節點可由從根節點開始的完整路徑區分,使用方法如上,如果到節點的完整路徑是明確的,則可以省略單元地址。如果客戶端程序遇到不確的路徑,它的行為將不確定。例如:/node-name-1/node-name-2
3.2 屬性
屬性賦值格式:“name=value”
3.2.1屬性命名
設備樹中每一個節點都有一些屬性來描述該節點的特征,屬性通常以“名稱和值”的方式組成。屬性命名字符組成如表3-2所示。非標準的屬性名稱應該賦予名稱有特定具體的意義,如pin, function,tx_use_dma等。
表2-1有效的屬性命名字符
Character | Description |
0-9 | digit |
a-z | lowercase letter |
A-Z | uppercase letter |
, | comma |
. | period |
_ | underscore |
+ | plus sign |
? | question mark |
# | hash |
–????? ? | dash |
3.2.2屬性值
屬性的值是由包含針對該屬性相關的零或者多個字節組成的數組。當屬性表征true-false信息的時候,屬性值為空。
Value | Description |
值為空,如用來表征true-false屬性 | |
32位整形數,以大端形式, 一個cell ?如0x1234567 | |
字符串,如“hello” | |
< ?string list> | 字符串數組,如:“hello”,“world” |
編碼對,具體格式參見個屬性規定 | |
一個的值,可以代表設備樹中任何一個節點。 |
3.2.3標準屬性
設備樹節點有一些標準的屬性,可以統一描述該節點具有的一些特征。
compatible屬性
compatible屬性由一個或多個字符串組成。這些字符串定義了特定的設備模型。該屬性允許一個設備表達它與一系列類似設備的兼容性,允許一個設備驅動程序與多個設備匹配。推薦的屬性值賦值方式為“"manufacturer,model”。其中manufacturer為芯片制造商的名字,model指定了該設備的型號。
例如:
compatible= "leadcore,comip-powerkey";
在此例中,操作系統會先去找支持"leadcore,comip-powerkey"設備的驅動,如果沒有,則驅動與設備匹配失敗,該設備無法正常運行。
phandle屬性
屬性名稱:phandle 屬性值
phandle使用一個u32的數值來表征設備樹中唯一的節點。其他節點應用該節點時,可以引用該節點定義的phandle屬性定義的值。
例如:
pic@10000000{ phandle = <1>; interrupt-controller;該節點中phandle 被定義了,其他設備節點可以使用值1來引用pic這個節點,如:
another_node@10909009{??????interrupt-patrent?=<1>;注:大多數設備樹中不會顯示包含phandle屬性,DTC編譯工具在編譯設備樹源碼時會自動的插入調用phandle屬性。
model屬性
屬性名稱:model屬性值類型
Model屬性描述了設備生產商以及該設備的型號,格式為字符串形式。model用來準確地定義這個硬件是什么
例如:
model= "lc1860c evb2w board on LC1860";
status屬性
???? ? 屬性名稱:status 屬性值類型
status屬性表明了設備的運行狀態。有效值為以下幾個:“okay” : 表明設備是可以操作的“disabled”:表明設備當前不可用,但是可能在以后成為可用設備,例如該設備依賴的某些開關或者設備沒有打開或者接入到系統中。
? “reserved”:通常表示設備已經運行但是不可以備操作,例如總線固件部分。
? “fail” :設備不可被操作,發生了錯誤,在未修復之前無法操作。
? “fail-sss” :表明設備無法被操作,sss是設備特有的,表明探測到了設備的錯誤。
#address-cell和 #size_sells屬性
屬性名稱:#address-cell 和 #size-cells 屬性值:
#address-cell 和 #size-cells通常用在具有子節點繼承的節點中,并且指出子設備節點應該如何寫地址。其中#address-cell的值若為1,其子設備reg中用1個數來表示地址,表示為一個32位地址,若為2則用兩個數來表示地址,表示為一個63位的地址;size-cells為1,所以reg中用1個數來表示大小。
例如:
soc?{?????#address-cells?=?<1>;?????#size-cells?=?<1>;?????…}uart0:serial@a0882000 { compatible = "leadcore,comip-uart"; reg = <0xa0882000 0x400>;????????…??????????????};
節點serial是soc的子節點,注意到soc中,定義了#address-cells = <1>和#size-cells = <1>,因此所有以soc為父節點的節點在配置屬性時,其reg中應使用1個cell表示地址,1個cell表示范圍。上例中,0xa0882000為該子節點設備起始地址,0x400為子節點設備地址空間的大小。
Reg屬性
屬性名稱:reg屬性值: 編碼任意數量的(地址長度)對。
reg屬性表征了該節點設備資源在其父節點地址空間內的地址。最常見的是說給出映射IO寄存器塊的內存的偏移量和長度。reg值是由一系列的 組成的,每一個“地址”、“長度”是一個u32的cell,而這兩者是否被賦值依賴于其父節點的#address-cell 和#size-cells屬性。當#size-cells為0時,reg中的長度值應該被省略。
例如:
uart2:?serial@a0884000?{ compatible = "leadcore,comip-uart";???????reg?=?<0xa0884000?0x400>;????????… }Serial是soc的子節點,soc節點中#address-cells = <1>和#size-cells = <1>,因此serial節點中reg屬性的值須包含地址(u32)以及長度(u32)值。以上reg表明該節點設備在其父節點地址的偏移量為0x0884000,長度1024字節的內存塊(soc的地址從0開始)。該設備起始地址為0x0884000,結束地址為0x0884400。圖2-1lc1860手冊中串口的基地址
Virtual-reg
屬性名稱:virtual-reg 屬性值:
virtual-reg定義了一個有效地址,這個地址映射到設備節點中reg中的第一個地址值,此屬性使引導程序可以為客戶端程序提供已經設置的“虛擬-實體”的內存映射。
Ranges
屬性名稱:ranges 屬性值:或者編碼任意數量的(子節點地址,父節點地址,長度)對。當ranges屬性值為empty時,表明子節點地址空間與父節點地址空間為1:1映射。
ranges屬性提供了一種子節點地址空間以及父節點地址空間的映射關系或轉換關系,該屬性值是任意的三元數組對。其中子節點地址是父節點地址空間中的實際的物理地址。該節點的地址cell(u32)個數取決于當前節點中的#address-cells,該節點中的長度cell(u32)取決于當前節點中的#size-cells屬性。
例如:
soc { #address-cells= <1>;?????#size-cells=?<1>; ranges= <0x0 0x10000000 0xd0000000>; uart2: serial@a0884000 { compatible ="leadcore,comip-uart";???????????reg?=?<0xa08840000x400>;????????????…??????} …}ranges =<0x0 0xe0000000 0x00100000>表示子地址空間從0開始,其長度為0x00100000的范圍,該地址映射到其父總線地址空間的起始地址為0xe0000000,長度為0x00100000,具體地址范圍如表2所示。
表2 ranges屬性表示的地址范圍
ranges | 子總線空間 | 父總線空間 |
0x0 0xe0000000 0xd0000000 | 0x0 ~0x0+0xd0000000 | 0x10000000~0x10000000+0xd0000000 |
明確該節點下的設備serial節點地址在serial子空間地址范圍為:
0xa0884000~0xa0884000+0x400,其在父節點地址空間的映射范圍為:
0x10000000+0xa0884000~0x10000000+0xa0884000+0x400
Dma-ranges
屬性名稱:dma-ramges 屬性值:或者編碼任意數量的(子節點地址,父節點地址,長度)對。
dma-ranges用來描述dma子設備節點與其dma父設備節點的地址空間的映射或者轉換關系。其屬性值也是一個任意數量的三元數組對,表征了DMA子節點在其父DMA節點中的映射關系。該節點的地址cell(u32)個數取決于當前節點中的#address-cells,該節點中的長度cell(u32)取決于當前節點中的#size-cells屬性。
Interrupts屬性
屬性名稱:interrupts屬性值任意數量的數值對,表征中斷說明。中斷說明的格式由綁定的中斷域定義。
?????? 三個數 interrupts = ;
?????? X指的是:
PPI:per processor?interrupts ? ???私有中斷,?中斷必須綁定一個固定CPU核,當處理該中斷時,必須由綁定的CPU核處理,中斷號16~31
SPI:shared processor interrupts ??共享中斷,中斷的處理可被任意的CPU核處理,中斷號 32 ~32+224
在arm-gic.h文件中定義的只有SPI和PPI,如下:#define GIC_SPI 0#define GIC_PPI 1?Y指的是:物理中斷號
?Z指的是:觸發方式
#defineIRQ_TYPE_NONE 0x00000000 \\ 未指明類型#defineIRQ_TYPE_EDGE_RISING 0x00000001 \\ 上升沿觸發#defineIRQ_TYPE_EDGE_FALLING 0x00000002 \\下降沿觸發 #defineIRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING |IRQ_TYPE_EDGE_RISING) \\ 邊沿觸發#define IRQ_TYPE_LEVEL_HIGH0x00000004 \\ 高電平觸發#define IRQ_TYPE_LEVEL_LOW 0x00000008 \\ 低電平觸發#defineIRQ_TYPE_SENSE_MASK 0x0000000f例如:
interrupts = <0 61 0>;?? ? 表明此節點中斷類型為GIC_SPI,物理中斷號為61+32=93,觸發方式未指定。
四個數:<主|子中斷(0:主,1:子)主中斷號子中斷號觸發方式>
兩個數:<中斷號,中斷等級>
一個數:<中斷號>
Interrupt-parent
屬性名稱:interrupt-parent屬性值:表明父中斷節點。
由于中斷樹的層級和設備樹層級有差異,具有中斷功能的設備節點必須明確通過該屬性其父中斷。若該設備無interrupt-parent屬性,則默認其interrupt-parent屬性為其父中斷具有的該屬性,如果遍歷其中斷樹后,中斷設備中沒有該屬性,則默認其父中斷為設備樹。
例如:soc { interrupt-parent =<&gic>; …}?????? 節點soc的中斷父節點是gic。
Interrupts-extended
屬性名稱:interrupts-extended,屬性值phandle或者
該屬性指明所屬的中斷控制器,又描述中斷,當一個設備連接到多個中斷控制器時,使用該屬性來進行中斷定義。例如:interrupts-extended =<&pic 0xA 8>, <&gic 0xda>;該節點既能響應pic控制器的中斷,又能響應gic控制器的中斷,但二者不能同時響應。中斷控制器的屬性:
#interrupt-cells
timer的父中斷為gic中斷控制器,gic節點中#interrupt-cells屬性為 <3>,因此,timer中interrupts屬性為3個cell。
Interrupt-controller
例如:
gic:interrupt-controller@a0118000 { interrupt-controller;?????????????????????????????????????#interrupt-cells?=?<3>;?????????????????????????????????????… };4 基本設備節點與屬性
4.1基本設備節點
所有的設備樹必須擁有一個根節點 “/”,并且以下的節點是一個系統必須的,且必須為根節點的子節點:必須要有cpus 節點
至少一個 memory 節點
根節點
設備樹只有一個根節點,其它所有的節點都是它的子節點,根節點的完整路徑是 “/”
根節點必須具有的屬性:???
model????? ? ? ? 字符串,唯一表明系統板的型號,建議“廠家,型號”
compatible??? 字符串數組,表明可以兼容的平臺,建議“廠家,型號”
#size-cells??? ???? 說明其子節點reg屬性中地址參數的個數
#address-cells ? 說明其子節點reg屬性中長度的參數個數
其它標準屬性位可選屬性
4.1.2 cpus節點
所有設備樹都需要/CPU節點。它不代表系統中的真實設備,而是充當表示系統cpus的子cpu節點的容器。Cpus節點必須包含#address-cells和#size-cells節點,并且該節點包含的屬性,其子節點都應該遵守。
例如:cpus{ #address-cells= <1>; #size-cells= <0>; cpu1:cpu@1 { device_type= "cpu"; compatible= "arm,cortex-a7"; reg= <0x101>; clock-frequency= <1495000000>; }; cpu2:cpu@2 { device_type= "cpu"; compatible= "arm,cortex-a7"; reg= <0x102>; clock-frequency= <1495000000>; }; …}cpu節點表示一個硬件執行塊,該硬件執行塊具有足夠的獨立性,能夠運行一個操作系統,而不會干擾其他可能運行其他操作系統的cpu。CPU和線程通過統一的編號空間進行編號,該空間應盡可能與中斷控制器的CPU/線程編號相匹配。CPU節點的地址用法是最簡單的。每個CPU被分配了唯一的ID號,而且這個沒有size。在上面的cpus節點中,#address-cells被設為了1,#size-cells則被設為了0,這就表示它的子節點中的reg屬性是一個32位整數的address,而且沒有size部分。在cpu節點中,必須具有的幾個屬性:
屬性名稱:device_type,屬性值 值必須是 “cpu”屬性名稱:"reg" 屬性值 數組它定義了由CPU節點表示的CPU/線程的唯一CPU/線程id。屬性名稱:clock-frequency屬性值< prop-encoded-array>數組說明了當前節點的CPU工作的時鐘頻率(Hz)4.1.3 Aliases 節點
???? 一個設備樹僅能有一個aliases節點,該節點為其它節點定義一個“別名”。該節點必須為設備樹根節點的子節點。該節點中其屬性名稱為屬性值節點的別名,屬性值為節點在設備樹中的全路徑。
例如:
/{ … aliases { serial0 = &uart0; … }}?????? 為uart0定義了一個別名為 “serial0”。別名的命名只能選取數字“0-9”,小寫字母“a-z”以及短橫線“-”組合形成的字符串。
4.1.4 Memory節點
Memory節點是所有設備樹所必須的節點,其位于根節點之下。該節點描述了系統物理內存分配,如果一個系統有多塊內存,可以創建多個memory節點或者一個memoery節點在使用時用reg屬性進行說明。例如:
memory { reg= <0 0x6400000 0 0x39000000>; };表明該系統起始地址是0x6400000,長度為0x39000000 (912MB),以上在一個64位的機器中,假設#address-cells= <2>,#size-cells = <2>
4.1.5 Chosen節點
choosen節點不代表系統中的實際設備,但描述了系統軟件在運行時選擇或指定的參數。它必須是根節點的子節點。對于Linux內核,該節點下最有用的屬性是bootargs,該屬性的類型是字符串,用來向Linux內核傳遞cmdline。規范中還定義了stdout-path和stdin-path兩個可選的、字符串類型的屬性,這兩個屬性的目的是用來指定標準輸入輸出設備的,在linux中,這兩個屬性基本不用。
屬性bootargs,屬性值,指定客戶端程序啟動參數的字符串。如果不需要啟動參數,則該值是空字符串。通常,chosen 節點在 .dts 源文件中為空,并在啟動時填充。?????? 例如:
chosen { bootargs ="root=/dev/nfs rw nfsroot=192.168.1.1 ?????????????????console=ttyS0,115200";};4.2特殊屬性
4.2.1 simple-bus compatible 屬性值
系統會將該node下所有的child nodes都作為platform device注冊進kernel。
例如:
soc { #address-cells= <1>;????????#size-cells=?<1>;????????ranges=?<0?0?0?0xffffffff>;????????compatible=?"simple-bus"; interrupt-parent= ;}Soc下的設備節點都將作為platformdevice被注冊進kenel
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的echarts树状图点击展开子节点_CPU眼里的结构设备树节点及属性详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逾期怎么处理_招商信用卡逾期三个月银行起
- 下一篇: 哈希表的画法_智慧树知到_机械制图A_答