1 Linux設備樹(shù)概述1.1 Linux設備樹(shù)概述 Linux設備樹(shù)是一個(gè)包含節點(diǎn)和屬性的簡(jiǎn)單樹(shù)狀結構。屬性是基于key-value對的,而節點(diǎn)可以同時(shí)包含屬性和子節點(diǎn)。下面這個(gè)樹(shù)就是一個(gè)典型結構: / { node1 { a-string-property = "A string"; a-string-list-property = "first string", "second string"; a-byte-data-property = [0x01 0x23 0x34 0x56]; child-node1 { first-child-property; second-child-property = <1>; a-string-property = "Hello, world"; }; child-node2 { }; }; node2 { an-empty-property; a-cell-property = <1 >; /* each number (cell) is a uint32 */ child-node1 { }; }; }; 這棵樹(shù)沒(méi)有描述任何東西,但是它體現了節點(diǎn)的一些屬性: l 一個(gè)單獨的根節點(diǎn):“/” l 兩個(gè)子節點(diǎn):“node1”和“node2” l 兩個(gè) node1 的子節點(diǎn):“child-node1”和“child-node2” l 一堆分散在樹(shù)里的屬性 可以這么簡(jiǎn)單理解:節點(diǎn)就是樹(shù)枝,屬性就是樹(shù)葉;樹(shù)枝上可以有再長(cháng)樹(shù)枝也可以長(cháng)樹(shù)葉,而樹(shù)葉上則不會(huì )再長(cháng)樹(shù)枝。 屬性是基于key-value結構的,value可以為空或者特定格式的字符串內容。由于數據類(lèi)型并不被編碼到最終的數據結構中,設備樹(shù)源代碼中僅能支持有限的幾種基本數據類(lèi)型,如下: l 文本字符串(無(wú)結束符)可以用雙引號表示: string-property = "a string" l 'Cells'是 32 位無(wú)符號整數,用尖括號表示: cell-property = <0xbeef xabcd> l 二進(jìn)制數據用方括號表示: binary-property = [0x01 0x23 0x45 0x67]; l 不同表示形式的數據可以使用逗號連在一起: mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>; l 逗號也可用于創(chuàng )建字符串列表: string-list = "red fish", "blue fish"; 1.2 基本概念1.2.1 初始結構第一步就是構建一個(gè)基本結構,這是一個(gè)設備樹(shù)最基本的結構。在這個(gè)階段,需要一個(gè)唯一的標識該機器。 / { compatible = "gpio-leds"; }; compatible指定了系統的名稱(chēng)。它包含了一個(gè)“<>,<>”形式的字符串。重要的是要指定一個(gè)確切的設備,并且包括制造商的名字,以避免命名空間沖突。由于操作系統會(huì )使用 compatible的值來(lái)決定如何在機器上運行,所以正確的設置這個(gè)屬性十分重要。 1.2.2 中央處理器 第二步就是描述CPU。先添加一個(gè)名為“cpus”的容器節點(diǎn),然后為每個(gè)CPU分別添加子節點(diǎn),以TI AM437x平臺為例: / { compatible = "ti,am437x-gp-evm"; cpus { cpu@0 { compatible = "ti,am4372"; }; cpu@1 { compatible = "ti,am4372"; }; }; }; 每個(gè)cpu節點(diǎn)compatible屬性是一個(gè)“<>,<>”形式的字符串,并指定了確切的cpu,就像頂層的compatible屬性一樣。 1.2.3 節點(diǎn)名稱(chēng) 每個(gè)節點(diǎn)必須有一個(gè)“<>[@<>]”形式的名字。 l << span>名稱(chēng)>就是一個(gè)不超過(guò)31位的簡(jiǎn)單ascii字符串。通常,節點(diǎn)的命名應該根據它所體現的是什么樣的設備。比如一個(gè)3com以太網(wǎng)適配器的節點(diǎn)就應該命名為 ethernet,而不應該是3com509。 l 如果該節點(diǎn)描述的設備有一個(gè)地址的話(huà),還應該加上設備地址(unit-address)。通常,設備地址就是用來(lái)訪(fǎng)問(wèn)該設備的主地址,并且該地址也在節點(diǎn)的reg屬性中列出。 l 同級節點(diǎn)命名必須是唯一的,但只要地址不同,多個(gè)節點(diǎn)也可以使用一樣的通用名,例如serial@101f1000和serial@101f2000。 1.2.4 設備系統中每個(gè)設備都表示為一個(gè)設備樹(shù)節點(diǎn)。所以接下來(lái)就應該為這個(gè)設備樹(shù)填充設備節點(diǎn)。 / { compatible = "ti,am437x-gp-evm"; cpus { cpu@0 { compatible = "ti,am4372"; }; cpu@1{ compatible = "ti,am4372"; }; }; serial@101F0000 { compatible = "ti,omap2-uart"; }; serial@101F2000 { compatible = "ti,am4372-uart"; }; gpio@101F3000 { compatible = "ti,pl061"; }; spi@10115000 { compatible = "ti,ads7846"; }; external-bus { ethernet@0,0 { compatible = "ti,smc91c111"; }; i2c@1,0 { compatible = "ti,tps65218"; rtc@58 { compatible = "ti,ds1338"; }; }; flash@2,0 { compatible = "ti,omap2-nand", "omap3-nand"; } 在此樹(shù)中,已經(jīng)為系統中的每個(gè)設備添加了節點(diǎn),而且這個(gè)層次結構也反映了設備與系統的連接方式。例如,外部總線(xiàn)上的設備就是外部總線(xiàn)節點(diǎn)的子節點(diǎn),i2c 設備就是i2c 總線(xiàn)節點(diǎn)的子節點(diǎn)。通常,這個(gè)層次結構表現的是CPU視角的系統視圖。 在這顆樹(shù)中,應該注意這些事情: l 每個(gè)設備節點(diǎn)都擁有一個(gè)compatible 屬性。 l flash閃存節點(diǎn)的compatible屬性由兩個(gè)字符串構成。 l 正如前面所述,節點(diǎn)的命名應當反映設備的類(lèi)型而不是特定的型號。 1.2.5 理解compatible屬性設備樹(shù)中每個(gè)節點(diǎn)都需要一個(gè)compatible屬性。compatible屬性是操作系統用來(lái)決定使用哪個(gè)設備驅動(dòng)來(lái)綁定到一個(gè)設備上的關(guān)鍵因素。 compatible是一個(gè)字符串列表,其中第一個(gè)字符串指定了這個(gè)節點(diǎn)所表示的確切的設備,該字符串的格式為:"<>,<>"。剩下的字符串的則表示其它與之相兼容的設備。 1.3 如何編址 可編址設備使用以下屬性將地址信息編碼進(jìn)設備樹(shù): reg #address-cells #size-cells 每個(gè)可編址設備都有一個(gè)元組列表的reg,元組的形式為:reg = <>。每個(gè)元組都表示一個(gè)該設備使用的地址范圍。每個(gè)地址值是一個(gè)或多個(gè)32位整型數列表,稱(chēng)為cell。同樣,長(cháng)度值也可以是一個(gè) cell 列表或者為空。 由于地址和長(cháng)度字段都是可變大小的變量,那么父節點(diǎn)的#address-cells和#size-cells 屬性就用來(lái)聲明各個(gè)字段的cell的數量。換句話(huà)說(shuō),正確解釋一個(gè)reg屬性需要用到父節點(diǎn)的#address-cells和#size-cells的值。
更多幫助銷(xiāo)售郵箱:www.tronlong.com 技術(shù)論壇:www.51ele.net 線(xiàn)上商城:https://tronlong.taobao.com |