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