日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux设备树翻译计划

發(fā)布時(shí)間:2023/12/10 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux设备树翻译计划 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文翻譯自Device Tree Usage主頁: http://devicetree.org/Device_Tree_Usage 此譯文為本人原創(chuàng),若要轉(zhuǎn)載請(qǐng)注明!
Linux device tree的背景(引用自宋寶華博客): ? ? ? ? Linus Torvalds在2011年3月17日的ARM Linux郵件列表宣稱“this whole ARM thing is a f*cking pain in the ass”,引發(fā)ARM Linux社區(qū)的地震,隨后ARM社區(qū)進(jìn)行了一系列的重大修正。在過去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥著大量的垃圾代碼,相當(dāng)多數(shù)的代碼只是在描述板級(jí)細(xì)節(jié),而這些板級(jí)細(xì)節(jié)對(duì)于內(nèi)核來講,不過是垃圾,如板上的platform設(shè)備、resource、i2c_board_info、spi_board_info以及各種硬件的platform_data。讀者有興趣可以統(tǒng)計(jì)下常見的s3c2410、s3c6410等板級(jí)目錄,代碼量在數(shù)萬行。 ? ? ? ? 社區(qū)必須改變這種局面,于是PowerPC等其他體系架構(gòu)下已經(jīng)使用的Flattened Device Tree(FDT)進(jìn)入ARM社區(qū)的視野。Device Tree是一種描述硬件的數(shù)據(jù)結(jié)構(gòu),它起源于 OpenFirmware (OF)。在Linux 2.6中,ARM架構(gòu)的板極硬件細(xì)節(jié)過多地被硬編碼在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,許多硬件的細(xì)節(jié)可以直接透過它傳遞給Linux,而不再需要在kernel中進(jìn)行大量的冗余編碼。
設(shè)備樹使用 ________________________________________________ 本頁演示怎樣為一個(gè)新的機(jī)器編寫設(shè)備樹。這主要為了給出設(shè)備樹的整體概念以及他們是怎樣被用來描述機(jī)器的。 如果需要設(shè)備樹數(shù)據(jù)格式的完整描述,請(qǐng)參考ePAPR規(guī)范。本本主頁只是講述了一些基本主題,而ePAPR規(guī)范講述了很多這些主題的細(xì)節(jié),對(duì)于本頁中沒有講述的高級(jí)用法,請(qǐng)參考ePAPR。 基本數(shù)據(jù)格式 ________________________________________________ 設(shè)備樹是具有簡(jiǎn)單樹形結(jié)構(gòu)的節(jié)點(diǎn)和屬性。屬性是成對(duì)的鍵值,節(jié)點(diǎn)可能包含屬性和子節(jié)點(diǎn)。舉個(gè)例子來說,下面是一個(gè)簡(jiǎn)單的.dts格式的樹:

/ {? ? 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 2 3 4>; /* each number (cell) is a uint32 */? ? ? ? child-node1 {? ? ? ? };? ? };};

這棵樹很明顯是沒用的,因?yàn)樗鼪]用描述任何東西,但是它確實(shí)展示出了節(jié)點(diǎn)屬性。即:
  • 單個(gè)根節(jié)點(diǎn):"/"
  • 一對(duì)子節(jié)點(diǎn):"node1", "node2"
  • 一對(duì)node1的子節(jié)點(diǎn):"child-node1", "child-node2"
  • 樹上散布的一堆屬性
屬性是簡(jiǎn)單的鍵值對(duì),其中鍵值既可以是空也可以包含任何字節(jié)流。雖然數(shù)據(jù)類型沒用被編碼在數(shù)據(jù)結(jié)構(gòu)中,但是在設(shè)備樹源文件中有一些基本的數(shù)據(jù)表示方法。
  • 文本字符串(以null作為終止)以雙引號(hào)的形式表示:
    • string-property = "a string'
  • 'Cells'是32位無符號(hào)整數(shù),并且使用尖括號(hào)分隔:
    • cell-property = <0xbeef 123 0xabcd1234>
  • 二進(jìn)制數(shù)據(jù)使用方括號(hào)分隔:
    • binary-perperty = [0x01 0x23 0x45 0x67]
  • 不同表示類型的數(shù)據(jù)可以通過逗號(hào)級(jí)聯(lián)在一起:
    • mixed-perperty = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
  • 逗號(hào)也可以用來創(chuàng)建字符串列表:
    • string-list = "red fish", "blue fish";

基本概念 ________________________________________________ 為了理解怎樣使用設(shè)備樹,我們從一個(gè)樣品機(jī)開始并且搭建設(shè)備樹來一步步描述它 樣品機(jī) 考慮下面的假想機(jī)器(粗略地基于ARM Versatile),"Acme"制造,命名 “Coyote's Revenge":
  • 32位 ARM CPU單核
  • PLB粘附在內(nèi)存映射串口上,spi總線控制器,i2c控制器,中斷控制器以及外部總線橋
  • 256MB SDRAM基址從0開始
  • 2個(gè)串口,基址從0x101F1000,0X101F2000開始
  • GPIO控制器,基址從0x101F3000開始
  • SPI控制器,基址從0x10170000并且總線上掛載著下列設(shè)備:
    • MMC卡槽并且SS引腳連接在GPIO #1上
  • 外部總線橋并且總線上掛載著下列設(shè)備:
    • SMC SMC91111以太網(wǎng)設(shè)備連接在基址從0x10100000開始的外部總線上
    • i2c控制器,基址從0x10160000開始并且總線上掛載著如下設(shè)備:
      • Maxim DS1338實(shí)時(shí)時(shí)鐘。該器件響應(yīng)0x58的從機(jī)地址。
    • 64MB NOR flash,基址從0x30000000開始
初始結(jié)構(gòu) 第一步是為機(jī)器制定框架結(jié)構(gòu)。下面是一個(gè)合法的設(shè)備樹所需的最小結(jié)構(gòu)。在這個(gè)節(jié)點(diǎn),你想想要能夠唯一地識(shí)別該機(jī)器

/ {? ? compatible = "acme,coyotes-revenge";};

compatible制定系統(tǒng)的名稱。它包含"<manufacture>,<model>"格式的字符串。準(zhǔn)確地確定器件型號(hào)是非常重要的,并且我們需要包含廠商的名字來避免名字空間沖突。因?yàn)椴僮飨到y(tǒng)會(huì)使用compatible這個(gè)值來決定怎樣在這個(gè)機(jī)器上運(yùn)行,所以在這個(gè)屬性中放入正確的值是非常重要的。 理論上來說,compatible是一個(gè)OS需要唯一地識(shí)別機(jī)器所需要的唯一數(shù)據(jù)。如果所有機(jī)器的細(xì)節(jié)都是寫死的,那么OS可以在頂層compatible屬性中專門查找"acme,coyotes-revenge"。 CPUs 下一步是描述每個(gè)CPU。一個(gè)命名為"cpus"的容器節(jié)點(diǎn)跟有對(duì)應(yīng)每個(gè)CPU的子節(jié)點(diǎn)。在這個(gè)例子中,系統(tǒng)是一個(gè)雙核ARM Cortex A9的系統(tǒng)。

/ {? ? compatible = "acme,coyotes-revenge";? ? cpus {? ? ? ? cpu@0 {? ? ? ? ? ? compatible = "arm,cortex-a9";? ? ? ? };? ? ? ? cpu@1 {? ? ? ? ? ? compatible = "arm,cortex-a9";? ? ? ? };? ? };};

每個(gè)CPU節(jié)點(diǎn)中的compatible屬性是以<manufacturer>,<model>的格式確定CPU型號(hào)的字符串,就像頂層的compatible屬性那樣。 更多的屬性會(huì)在稍后添加到cpu節(jié)點(diǎn)中,但是我們首先需要討論更多基本的概念。 節(jié)點(diǎn)名字 我們值得花一段時(shí)間討論命名習(xí)慣。每一個(gè)幾點(diǎn)必須要有一個(gè)以<name>[@<unit-address>]形式的名字。 <name>是簡(jiǎn)單的ascii字符串并且長度最大可以到31個(gè)字符。通常來說,節(jié)點(diǎn)是根據(jù)它所代表的設(shè)備類型來命名的。舉個(gè)例子,3com公司的以太網(wǎng)適配器節(jié)點(diǎn)可能會(huì)使用ethernet作為它的名字,而不是3com509。 unit-address只有在節(jié)點(diǎn)描述含有地址的設(shè)備時(shí)會(huì)被包含進(jìn)來。通常來說,unit address是用來訪問設(shè)備的基址,并且在節(jié)點(diǎn)的reg屬性中被羅列出來。我們稍后會(huì)在本文檔中介紹reg屬性。 兄弟節(jié)點(diǎn)必須被唯一地命名,不過對(duì)于不只一個(gè)節(jié)點(diǎn)的情況,我們通常會(huì)使用通用的名字,只要它們的地址不一樣就可以。(比如:seriali@101f1000 和serial@101f2000)。 如果需要更多節(jié)點(diǎn)命名方面的詳細(xì)情況,請(qǐng)參考ePAPR規(guī)范的第2.21部分 設(shè)備 系統(tǒng)中的每一個(gè)設(shè)備都由一個(gè)設(shè)備樹節(jié)點(diǎn)來代表。下一步就是用每一個(gè)設(shè)備對(duì)應(yīng)的節(jié)點(diǎn)來填充樹。現(xiàn)在來說,新節(jié)點(diǎn)將會(huì)被置空知道我們可以討論地址范圍以及終端是怎樣安排的。

/ {? ? compatible = "acme,coyotes-revenge";? ? cpus {? ? ? ? cpu@0 {? ? ? ? ? ? compatible = "arm,cortex-a9";? ? ? ? };? ? ? ? cpu@1 {? ? ? ? ? ? compatible = "arm,cortex-a9";? ? ? ? };? ? };? ? serial@101F0000 {? ? ? ? compatible = "arm,pl011";? ? }; ? ? serial@101F2000 {? ? ? ? compatible = "arm,pl011";? ? }; ? ? gpio@101F3000 {? ? ? ? compatible = "arm,pl061";? ? }; ? ? interrupt-controller@10140000 {? ? ? ? compatible = "arm,pl190";? ? }; ? ? spi@10115000 {? ? ? ? compatible = "arm,pl022";? ? }; ? ? external-bus {? ? ? ? ethernet@0,0 {? ? ? ? ? ? compatible = "smc,smc91c111";? ? ? ? }; ? ? ? ? i2c@1,0 {? ? ? ? ? ? compatible = "acme,a1234-i2c-bus";? ? ? ? ? ? rtc@58 {? ? ? ? ? ? ? ? compatible = "maxim,ds1338";? ? ? ? ? ? };? ? ? ? }; ? ? ? ? flash@2,0 {? ? ? ? ? ? compatible = "samsung,k8f1315ebm", "cfi-flash";? ? ? ? };? ? };};

在這棵樹中,系統(tǒng)中的每個(gè)設(shè)備都被添加了響應(yīng)的節(jié)點(diǎn),并且層次結(jié)構(gòu)反映了設(shè)備時(shí)怎樣連接到系統(tǒng)的。舉個(gè)例子來說,外部總線上的設(shè)備是外部總線的子節(jié)點(diǎn),并且i2c設(shè)備是i2c總線控制器的子節(jié)點(diǎn)。通常來說,層次結(jié)構(gòu)代表了從CPU角度看到的系統(tǒng)視圖。 在這里這棵樹并不是合法的。它缺少了設(shè)備之間連接的信息。那部分?jǐn)?shù)據(jù)會(huì)在稍后添加。 這棵樹中有一些需要注意的地方:
  • 每一個(gè)設(shè)備節(jié)點(diǎn)都有一個(gè)compatible屬性
  • flash節(jié)點(diǎn)的compatible屬性中有兩個(gè)字符串。閱讀下一部分來了解為什么會(huì)這樣。
  • 之前提到過,節(jié)點(diǎn)的名字反映了設(shè)備的類型,而不是特定的型號(hào)。情況ePAPR規(guī)范的2.2.2部分,規(guī)范中提到了一系列已經(jīng)定義好了隨處可能用到的通用節(jié)點(diǎn)名字
理解compatible屬性 設(shè)備樹中代表設(shè)備的每一個(gè)節(jié)點(diǎn)必須要有compatible屬性。compatible是操作系統(tǒng)用來決定哪個(gè)設(shè)備驅(qū)動(dòng)綁定哪個(gè)設(shè)備的關(guān)鍵字。 compatible是字符串列表。列表中的第一個(gè)字符串以"<manufacturer>,<model>"的形式確定了節(jié)點(diǎn)代表的設(shè)備。接下來的字符串表示該設(shè)備可以兼容的其他設(shè)備。 舉個(gè)例子來說,Freescale MPC8349 片上系統(tǒng)(SoC)有一個(gè)串行設(shè)備實(shí)現(xiàn)了國家半導(dǎo)體 ns16550寄存器接口。MPC8349穿行設(shè)備的compatible屬性因此應(yīng)該是:compatible = "fsl,mpc8349-uart","ns16550"。在這個(gè)例子中,fsl,mpc8349-uart確定了設(shè)備并且ns16550表示它在寄存器級(jí)別兼容國家半導(dǎo)體16550 UART。 注意:ns16550沒有廠商前綴純粹是因?yàn)闅v史原因(IBM-PC/AT吧..)。所有新的compatible值應(yīng)該使用廠商前綴。 該操作允許現(xiàn)存的設(shè)備驅(qū)動(dòng)綁定到更新的設(shè)備上,不過它仍然唯一地識(shí)別確切的硬件。 警告:不要在compatible值中使用通配符,比如"fsl,mpc83xx-uart"或者類似地。硅片廠商總是會(huì)做一些打破你通配符假設(shè)的變化,到那時(shí)再改變就為時(shí)已晚了。相反,選擇一個(gè)特定的硅片實(shí)現(xiàn)并且使所有隨后的硅片與之兼容。 尋址是如何工作的 ________________________________________________ 可尋址的設(shè)備使用下面的屬性來將地址信息編碼進(jìn)入設(shè)備樹:
  • reg
  • #address-cells
  • #size-cells
? ? ? ??每一個(gè)可尋址的設(shè)備獲取的reg,是以reg = <address1 length1 [address2 length2] [address3 length3] ...>形式的表格元組。每一個(gè)元組代表設(shè)備所使用的地址范圍。每一個(gè)地址值是被稱為cells的一個(gè)或者多個(gè)32位整數(shù)的列表。相似地,長度值既可以是cells的列表,也可以是空的。 因?yàn)榈刂泛烷L度域都是長度可變的,所以父節(jié)點(diǎn)中的#address-cells和#size-cells屬性是用來說明每一個(gè)域中有多少個(gè)cells。換句話說,正確地翻譯一個(gè)reg屬性需要父節(jié)點(diǎn)的#address-cells和#size-cells值。為了看到這一切是怎樣工作的,讓我們將尋址屬性添加到樣例設(shè)備樹中,首先從CPU開始 CPU尋址 討論到尋址時(shí),CPU節(jié)點(diǎn)代表最簡(jiǎn)單的情況。每一個(gè)CPU被賦予了一個(gè)唯一的ID并且CPU的ID沒有關(guān)聯(lián)的尺寸。

? ? cpus {? ? ? ? #address-cells = <1>;? ? ? ? #size-cells = <0>;? ? ? ? cpu@0 {? ? ? ? ? ? compatible = "arm,cortex-a9";? ? ? ? ? ? reg = <0>;? ? ? ? };? ? ? ? cpu@1 {? ? ? ? ? ? compatible = "arm,cortex-a9";? ? ? ? ? ? reg = <1>;? ? ? ? };? ? };

cpu節(jié)點(diǎn)中,#address-cells被設(shè)置為1,#size-cells被設(shè)置為0.這意味著子節(jié)點(diǎn)的reg值是代表地址且沒有size域的單個(gè)32位無符號(hào)整數(shù)。在這個(gè)例子中,2個(gè)cpu被賦予了地址0和1。cpu節(jié)點(diǎn)的#size-cells是0,因?yàn)閏pu僅僅被賦予了單個(gè)地址。 你能注意到reg值匹配節(jié)點(diǎn)名字中的值。按照慣例,如果一個(gè)節(jié)點(diǎn)具有reg屬性,這個(gè)節(jié)點(diǎn)必須包含單元地址,也就是reg屬性中的第一個(gè)地址值。 內(nèi)存映射設(shè)備 不同于cpu節(jié)點(diǎn)中找到的單地址值,內(nèi)存映射設(shè)備被分配了它會(huì)響應(yīng)的一個(gè)地址范圍。#size-cells用來說明每一個(gè)子節(jié)點(diǎn)中的reg元組有多長。接下來的例子中,每一個(gè)地址值都是一個(gè)單元的(32位),每一個(gè)長度值也是一個(gè)單元,即典型的32位系統(tǒng)。64位系統(tǒng)可以把#address-cells和#size-cells賦值為2從而在設(shè)備設(shè)備樹中得到64位尋址。

/ {? ? #address-cells = <1>;? ? #size-cells = <1>;? ? ...? ? serial@101f0000 {? ? ? ? compatible = "arm,pl011";? ? ? ? reg = <0x101f0000 0x1000 >;? ? };? ? serial@101f2000 {? ? ? ? compatible = "arm,pl011";? ? ? ? reg = <0x101f2000 0x1000 >;? ? };? ? gpio@101f3000 {? ? ? ? compatible = "arm,pl061";? ? ? ? reg = <0x101f3000 0x1000? ? ? ? ? ? ? ?0x101f4000 0x0010>;? ? };? ? interrupt-controller@10140000 {? ? ? ? compatible = "arm,pl190";? ? ? ? reg = <0x10140000 0x1000 >;? ? };? ? spi@10115000 {? ? ? ? compatible = "arm,pl022";? ? ? ? reg = <0x10115000 0x1000 >;? ? };? ? ...};

每一個(gè)設(shè)備都被分配了一個(gè)基地址,以及它被分配的區(qū)域的尺寸。本例中的GPIO設(shè)備地址被分配了兩個(gè)地址范圍:0x101f3000...0x101f3fff 和0x101f4000..0x101f400f。 有一些設(shè)備掛載在具有不同尋址策略的總線上。舉個(gè)例子來說,一個(gè)設(shè)備可以被連接到具有獨(dú)立片選信號(hào)的外部總線上。因?yàn)槊恳粋€(gè)父節(jié)點(diǎn)定義了它子節(jié)點(diǎn)的尋址域,所以我們可以從最佳描述系統(tǒng)的角度來選擇地址映射方案。下面的代碼顯示了連接到外部總線上的設(shè)備的地址分配情況,并且這些外部總線具有編碼如地址的片選數(shù)字。

? ? external-bus {? ? ? ? #address-cells = <2>? ? ? ? #size-cells = <1>;? ? ? ? ethernet@0,0 {? ? ? ? ? ? compatible = "smc,smc91c111";? ? ? ? ? ? reg = <0 0 0x1000>;? ? ? ? };? ? ? ? i2c@1,0 {? ? ? ? ? ? compatible = "acme,a1234-i2c-bus";? ? ? ? ? ? reg = <1 0 0x1000>;? ? ? ? ? ? rtc@58 {? ? ? ? ? ? ? ? compatible = "maxim,ds1338";? ? ? ? ? ? };? ? ? ? };? ? ? ? flash@2,0 {? ? ? ? ? ? compatible = "samsung,k8f1315ebm", "cfi-flash";? ? ? ? ? ? reg = <2 0 0x4000000>;? ? ? ? };? ? };

外部總線使用了2個(gè)單元的地址值。一個(gè)是片選數(shù)字,另一個(gè)是片選基地址的偏移。長度域仍舊是單個(gè)單元,因?yàn)橹挥械刂返钠撇糠中枰粋€(gè)范圍。因此在本例中,每一個(gè)reg入口都包含了3個(gè)單元:片選數(shù)字,偏移以及長度。 因?yàn)榈刂酚虮话诠?jié)點(diǎn)以及它的子節(jié)點(diǎn)中,所以父節(jié)點(diǎn)可以自由定義任何總線上可行的尋址方案。直接父節(jié)點(diǎn)之外的節(jié)點(diǎn)通常不需要考慮本地尋址域,并且為了從一個(gè)域到另一個(gè)域,地址必須被映射。 非內(nèi)存映射設(shè)備 其他設(shè)備并沒有內(nèi)存映射在處理器總線上。它們可以有尋址范圍,但是它們并不能直接被CPU訪問。相反,父節(jié)點(diǎn)設(shè)備的驅(qū)動(dòng)會(huì)代表CPU間接地訪問。 現(xiàn)在來看i2c設(shè)備的例子,每一個(gè)設(shè)備被分配了一個(gè)地址,但是它沒有關(guān)聯(lián)的長度或者范圍。這看上去與CPU地址分配時(shí)一樣的。

? ? ? ? i2c@1,0 {? ? ? ? ? ? compatible = "acme,a1234-i2c-bus";? ? ? ? ? ? #address-cells = <1>;? ? ? ? ? ? #size-cells = <0>;? ? ? ? ? ? reg = <1 0 0x1000>;? ? ? ? ? ? rtc@58 {? ? ? ? ? ? ? ? compatible = "maxim,ds1338";? ? ? ? ? ? ? ? reg = <58>;? ? ? ? ? ? };? ? ? ? }; 范圍(地址轉(zhuǎn)換) 我們已經(jīng)討論過了怎樣為設(shè)備分配地址,但是這里的這些地址只是本地的設(shè)備節(jié)點(diǎn)地址。它缺并沒有描述怎樣從那些地址映射到CPU可以使用的地址。 根節(jié)點(diǎn)總是描述從CPU的視角看到的地址空間。根節(jié)點(diǎn)的子節(jié)點(diǎn)已經(jīng)使用了CPU的地址域,是、因此不需要任何顯示地映射。舉個(gè)例子來說,serial@101f0000設(shè)備是直接被分配了0x101f0000地址。 那些不是根節(jié)點(diǎn)的直接子節(jié)點(diǎn)的節(jié)點(diǎn)不能使用CPU的地址域。為了得到一個(gè)內(nèi)存映射的地址,設(shè)備樹必須制定如何從一個(gè)域地址轉(zhuǎn)換到另一個(gè)域。ranges屬性就是用于這個(gè)目的的。 這里是添加了ranges屬性的設(shè)備樹例子。

/ {? ? compatible = "acme,coyotes-revenge";? ? #address-cells = <1>;? ? #size-cells = <1>;? ? ...? ? external-bus {? ? ? ? #address-cells = <2>? ? ? ? #size-cells = <1>;? ? ? ? ranges = <0 0 ?0x10100000 ? 0x10000 ? ? // Chipselect 1, Ethernet? ? ? ? ? ? ? ? ? 1 0 ?0x10160000 ? 0x10000 ? ? // Chipselect 2, i2c controller? ? ? ? ? ? ? ? ? 2 0 ?0x30000000 ? 0x1000000>; // Chipselect 3, NOR Flash? ? ? ? ethernet@0,0 {? ? ? ? ? ? compatible = "smc,smc91c111";? ? ? ? ? ? reg = <0 0 0x1000>;? ? ? ? };? ? ? ? i2c@1,0 {? ? ? ? ? ? compatible = "acme,a1234-i2c-bus";? ? ? ? ? ? #address-cells = <1>;? ? ? ? ? ? #size-cells = <0>;? ? ? ? ? ? reg = <1 0 0x1000>;? ? ? ? ? ? rtc@58 {? ? ? ? ? ? ? ? compatible = "maxim,ds1338";? ? ? ? ? ? ? ? reg = <58>;? ? ? ? ? ? };? ? ? ? };? ? ? ? flash@2,0 {? ? ? ? ? ? compatible = "samsung,k8f1315ebm", "cfi-flash";? ? ? ? ? ? reg = <2 0 0x4000000>;? ? ? ? };? ? };};

ranges是地址轉(zhuǎn)換清單。ranges表中的每一個(gè)條目是包含子節(jié)點(diǎn)地址,父節(jié)點(diǎn)地址以及子節(jié)點(diǎn)地址空間區(qū)域大小的元組。每一個(gè)域的大小分別由子節(jié)點(diǎn)的#address-cells值,父節(jié)點(diǎn)的#address-cells值以及子節(jié)點(diǎn)的#size-cells值決定。對(duì)于本例子中的外部總線,子節(jié)點(diǎn)地址是2個(gè)單元,父節(jié)點(diǎn)地址是1個(gè)單元,大小也是一個(gè)單元的。三個(gè)ranges是這樣被轉(zhuǎn)換的:
  • 從片選0處偏移0開始的地方被映射到地址范圍0x10100000...0x1010ffff
  • 從片選1處偏移0開始的地方被映射到地址范圍0x10160000...0x1016ffff
  • 從片選2處偏移0開始的地方被映射到地址范圍0x30000000...0x10000000
或者,如果父節(jié)點(diǎn)和子節(jié)點(diǎn)的地址空間是相同的,那么節(jié)點(diǎn)也可以添加空的ranges屬性。空的ranges屬性意味著子節(jié)點(diǎn)地址空間中的地址被1:1地映射到父節(jié)點(diǎn)地址空間。 你可能會(huì)問為什么地址轉(zhuǎn)換總是用在所有1:1映射的情況下。一些總線(比如PCI)具有完全不同的地址空間,而這些細(xì)節(jié)必須暴露給操作系統(tǒng)。其他總線具有DMA引擎,這些引擎需要知道總線上的實(shí)際滴孩子。有時(shí)候設(shè)備需要被組合在一起,因?yàn)樗鼈兌脊蚕碛型瑯拥能浖删幊涛锢淼刂酚成浞椒āT摬辉撚?:1映射更大程度上取決于操作系統(tǒng)所需的信息以及硬件設(shè)計(jì)。 你應(yīng)該也注意到,i2c@1,0節(jié)點(diǎn)中沒有ranges屬性,原因是不像外部總線,i2c總線上的設(shè)備沒有內(nèi)存映射到CPU的地址域。相反地,CPU通過i2c@1,0設(shè)備間接地訪問rtc@58設(shè)備。缺少ranges屬性意味著,設(shè)備不能直接被除了其父節(jié)點(diǎn)之外的任何設(shè)備訪問 中斷是怎樣工作的 ________________________________________________ 中斷不同于遵循樹自然結(jié)構(gòu)的地址范圍轉(zhuǎn)換,中斷信號(hào)可能來自以及終止在機(jī)器的任何設(shè)備。不像設(shè)備樹中自然表示的設(shè)備尋址,中斷信號(hào)是以獨(dú)立于設(shè)備樹的節(jié)點(diǎn)之間的鏈接表示的。四個(gè)屬性用來描述中斷的聯(lián)系:
  • interrupt-controller ?—— ?一個(gè)空的屬性聲明接收中斷信號(hào)的設(shè)備為節(jié)點(diǎn)
  • #interrupt-cells ?—— 這是中斷控制器節(jié)點(diǎn)的屬性。它表明這個(gè)中斷控制器的中斷描述符符中有多少單元。(類似于#adderss-cells以及#size-cells)
  • interrupt-parent —— 包含phandle的設(shè)備節(jié)點(diǎn)的一個(gè)屬性,這個(gè)phandle指向它所連接到的中斷控制器
  • interrupts —— 包含中斷描述符列表的設(shè)備節(jié)點(diǎn)的一個(gè)屬性,每一個(gè)設(shè)備上的中斷輸出信號(hào)都有一個(gè)
? ? ? ??中斷描述符是一個(gè)或多個(gè)單元的數(shù)據(jù)(由#interrupt-cells指定),它們指定設(shè)備連接到哪個(gè)中斷輸入。大部分設(shè)備只有單個(gè)中斷輸出,如下面的例子所示,不過設(shè)備上也有可能有多個(gè)中斷輸出。中斷描述符的意義完全取決于中斷控制器設(shè)備的綁定。每一個(gè)中斷控制器可以決定需要多少個(gè)單元才能唯一地定義一個(gè)中斷輸入。 下面的代碼添加了連接到我們的Coyote's Revenge樣例機(jī)器的中斷。

/ {? ? compatible = "acme,coyotes-revenge";? ? #address-cells = <1>;? ? #size-cells = <1>;? ? interrupt-parent = <&intc>;? ? cpus {? ? ? ? #address-cells = <1>;? ? ? ? #size-cells = <0>;? ? ? ? cpu@0 {? ? ? ? ? ? compatible = "arm,cortex-a9";? ? ? ? ? ? reg = <0>;? ? ? ? };? ? ? ? cpu@1 {? ? ? ? ? ? compatible = "arm,cortex-a9";? ? ? ? ? ? reg = <1>;? ? ? ? };? ? };? ? serial@101f0000 {? ? ? ? compatible = "arm,pl011";? ? ? ? reg = <0x101f0000 0x1000 >;? ? ? ? interrupts = < 1 0 >;? ? };? ? serial@101f2000 {? ? ? ? compatible = "arm,pl011";? ? ? ? reg = <0x101f2000 0x1000 >;? ? ? ? interrupts = < 2 0 >;? ? };? ? gpio@101f3000 {? ? ? ? compatible = "arm,pl061";? ? ? ? reg = <0x101f3000 0x1000? ? ? ? ? ? ? ?0x101f4000 0x0010>;? ? ? ? interrupts = < 3 0 >;? ? };? ? intc: interrupt-controller@10140000 {? ? ? ? compatible = "arm,pl190";? ? ? ? reg = <0x10140000 0x1000 >;? ? ? ? interrupt-controller;? ? ? ? #interrupt-cells = <2>;? ? };? ? spi@10115000 {? ? ? ? compatible = "arm,pl022";? ? ? ? reg = <0x10115000 0x1000 >;? ? ? ? interrupts = < 4 0 >;? ? };? ? external-bus {? ? ? ? #address-cells = <2>? ? ? ? #size-cells = <1>;? ? ? ? ranges = <0 0 ?0x10100000 ? 0x10000 ? ? // Chipselect 1, Ethernet? ? ? ? ? ? ? ? ? 1 0 ?0x10160000 ? 0x10000 ? ? // Chipselect 2, i2c controller? ? ? ? ? ? ? ? ? 2 0 ?0x30000000 ? 0x1000000>; // Chipselect 3, NOR Flash? ? ? ? ethernet@0,0 {? ? ? ? ? ? compatible = "smc,smc91c111";? ? ? ? ? ? reg = <0 0 0x1000>;? ? ? ? ? ? interrupts = < 5 2 >;? ? ? ? };? ? ? ? i2c@1,0 {? ? ? ? ? ? compatible = "acme,a1234-i2c-bus";? ? ? ? ? ? #address-cells = <1>;? ? ? ? ? ? #size-cells = <0>;? ? ? ? ? ? reg = <1 0 0x1000>;? ? ? ? ? ? interrupts = < 6 2 >;? ? ? ? ? ? rtc@58 {? ? ? ? ? ? ? ? compatible = "maxim,ds1338";? ? ? ? ? ? ? ? reg = <58>;? ? ? ? ? ? ? ? interrupts = < 7 3 >;? ? ? ? ? ? };? ? ? ? };? ? ? ? flash@2,0 {? ? ? ? ? ? compatible = "samsung,k8f1315ebm", "cfi-flash";? ? ? ? ? ? reg = <2 0 0x4000000>;? ? ? ? };? ? };};

有一些事情需要注意:
  • 這個(gè)機(jī)器只有一個(gè)中斷控制器,interrupt-controller@10140000
  • 標(biāo)簽'intc:'已經(jīng)被添加到中斷控制器節(jié)點(diǎn),并且標(biāo)簽被用來分配指向根節(jié)點(diǎn)的interrupt-parent屬性的phandle。這個(gè)interrupt-parent值變成了系統(tǒng)的默認(rèn)值,因?yàn)樗械淖庸?jié)點(diǎn)都繼承了它,除非它被顯示地覆蓋。
  • 每一個(gè)設(shè)備都使用一個(gè)interrupt屬性來制定一個(gè)不同的中斷輸入信號(hào)。
  • #interrupt-cells是2,因此每一個(gè)中斷描述符有2個(gè)單元。這個(gè)例子采用了使用了常見的模式,用第一個(gè)單元來編碼中斷線號(hào),用第二個(gè)單元來編碼標(biāo)志,比如高有效還是低有效又或者是邊緣觸發(fā)還是電平觸發(fā)。對(duì)于任何給定的中斷控制器,請(qǐng)參考控制器綁定文檔來了解描述符是怎樣編碼的。
設(shè)備特定數(shù)據(jù) 除了公共的屬性之外,我們可以添加任何屬性以及子節(jié)點(diǎn)到節(jié)點(diǎn)。我們可以添加操作系統(tǒng)需要的任何數(shù)據(jù),只要遵守一些規(guī)則即可。 首先,新的設(shè)備特定的屬性名字應(yīng)該使用生產(chǎn)廠商的前綴從而它們不會(huì)與現(xiàn)存的標(biāo)準(zhǔn)屬性名稱沖突。 其次,屬性以及子節(jié)點(diǎn)的意義必須以綁定的形式記錄下來從而設(shè)備驅(qū)動(dòng)作者了解怎樣翻譯數(shù)據(jù)。綁定記錄一個(gè)特定的compatible值意味著什么,它應(yīng)該要有什么屬性,它可能會(huì)有什么樣的子節(jié)點(diǎn)以及設(shè)備表示什么。每一個(gè)唯一的compatible值應(yīng)該有它自己的綁定(或者聲明與其他compatible值得兼容性)。新設(shè)備的綁定在這個(gè)wiki中被記錄。請(qǐng)看主頁描述文檔格和審查過程。 第三,請(qǐng)將新的綁定提交到devicetree-discuss@lists.ozlabs.org郵件列表進(jìn)行審查。審查新的綁定會(huì)抓住許多將來可能導(dǎo)致問題常見錯(cuò)誤。 特殊節(jié)點(diǎn) ________________________________________________ aliases節(jié)點(diǎn) 一個(gè)特定的節(jié)點(diǎn)通常是以完整的路徑來引用,比如/external-bus/ethernet@0,0,不過當(dāng)一個(gè)用戶真的想知道“哪個(gè)設(shè)備是eth0”時(shí),這將會(huì)很繁瑣。aliases節(jié)點(diǎn)可以用來為一個(gè)完整的設(shè)備路徑分配一個(gè)短的別名。比如:

? ? aliases {? ? ? ? ethernet0 = &eth0;? ? ? ? serial0 = &serial0;? ? };

當(dāng)需要為設(shè)備指定一個(gè)標(biāo)示符時(shí),操作系統(tǒng)歡迎大家使用別名。 你將會(huì)注意到這里使用了一個(gè)新的語法。propert = &label; 語法分配由標(biāo)簽引用并作為字符串屬性的的完整節(jié)點(diǎn)路徑。這與早前使用的phandle = <&label>;不同,它在單元中嵌入了phandle值。 chosen節(jié)點(diǎn) chosen節(jié)點(diǎn)并不代表真實(shí)的設(shè)備,不過充當(dāng)為在固件和操作系統(tǒng)之間傳遞數(shù)據(jù)的地方,比如啟動(dòng)參數(shù)。在chosen節(jié)點(diǎn)中的數(shù)據(jù)不代表硬件。典型情況下,chosen節(jié)點(diǎn)在.dts源文件中留空并在啟動(dòng)時(shí)填充。 在我們的系統(tǒng)中,固件可能會(huì)添加下面的內(nèi)容到chosen節(jié)點(diǎn):

? ? chosen {? ? ? ? bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";? ? }; 高級(jí)主題 ________________________________________________ 高級(jí)的樣例機(jī)器 現(xiàn)在我們已經(jīng)理解了基本定義,讓我們添加一些硬件到樣例機(jī)器中來討論一些更復(fù)雜的使用案例。 高級(jí)的樣例機(jī)器添加了一個(gè)PCI主橋配有內(nèi)存映射到0x10180000的控制寄存器和編程至從0x80000000地址以上開始的BARs。 假設(shè)我們已經(jīng)知道關(guān)于設(shè)備樹以上內(nèi)容,我們可以從添加如下節(jié)點(diǎn)描述PCI主橋開始。 ? ? ? ? pci@10180000 { ? ? ? ? ? ? compatible = "arm,versatile-pci-hostbridge", "pci"; ? ? ? ? ? ? reg = <0x10180000 0x1000>; ? ? ? ? ? ? interrupts = <8 0>; ? ? ? ? };
(接下來的內(nèi)容大部分為PCI設(shè)備相關(guān),不太常用,由于本人精力有限,留著以后再翻譯了)




參考鏈接: http://blog.csdn.net/21cnbao/article/details/8457546

總結(jié)

以上是生活随笔為你收集整理的Linux设备树翻译计划的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。