設(shè)備樹使用手冊_第1頁
設(shè)備樹使用手冊_第2頁
設(shè)備樹使用手冊_第3頁
設(shè)備樹使用手冊_第4頁
設(shè)備樹使用手冊_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、設(shè)備樹使用手冊本文將介紹如何為一個新機(jī)器編寫設(shè)備樹。我們準(zhǔn)備提供一個有關(guān)設(shè)備樹概 念的概述和如何使用這些設(shè)備樹來描述一個機(jī)器。完整的設(shè)備樹數(shù)據(jù)格式的技術(shù) 說明書請參考ePAPR規(guī)范。ePAPR規(guī)范涵蓋了比本文基本主題更豐富的細(xì)節(jié), 要查閱本文沒有涉及到的高級用法請參考該規(guī)范。目錄基本數(shù)據(jù)格式基本概念模型機(jī)初始結(jié)構(gòu)中央處理器節(jié)點(diǎn)名稱設(shè)備理解 compatible 屬性如何編址CPU 編址內(nèi)存映射設(shè)備非內(nèi)存映射設(shè)備范圍(地址轉(zhuǎn)換)中斷的工作方式設(shè)備特定數(shù)據(jù)特殊的節(jié)點(diǎn)aliases 節(jié)點(diǎn)chosen 節(jié)點(diǎn)高級主題高級模型機(jī)PCI 主橋PCI總線編號PCI 地址轉(zhuǎn)換高級中斷映射附注基本數(shù)據(jù)格式設(shè)備樹是

2、一個包含節(jié)點(diǎn)和屬性的簡單樹狀結(jié)構(gòu)。屬性就是鍵一值對,而 節(jié)點(diǎn)可以同時包含屬性和子節(jié)點(diǎn)。例如,以下就是一個.dts格式的簡單樹:/(nodel a-string-property = A string;a-string-list-property = first string, second string;a-byte-data-property = 0 x01 0 x23 0 x34 0 x56;child-node1 first-child-property; second-child-property = ; a-string-property = Hello, world;child-n

3、ode2 ;node2 an-empty-property;a-cell-property = ; /* each number (cell) is a uint32 */ child-nodel ;這棵樹顯然是沒什么用的,因?yàn)樗]有描述任何東西,但它確實(shí)體現(xiàn) 了節(jié)點(diǎn)的一些屬性:一個單獨(dú)的根節(jié)點(diǎn):“/”兩個子節(jié)點(diǎn):“nodel”和“node2”兩個 nodel 的子節(jié)點(diǎn):“child-nodel”和“child-node2”一堆分散在樹里的屬性。屬性是簡單的鍵一值對,它的值可以為空或者包含一個任意字節(jié)流。雖 然數(shù)據(jù)類型并沒有編碼進(jìn)數(shù)據(jù)結(jié)構(gòu),但在設(shè)備樹源文件中任有幾個基本的數(shù) 據(jù)表示形式。文本

4、字符串(無結(jié)束符)可以用雙引號表示:string-property = a string Cells是32位無符號整數(shù),用尖括號限定:cell-property = 二進(jìn)制數(shù)據(jù)用方括號限定:binary-property = 0 x01 0 x23 0 x45 0 x67;不同表示形式的數(shù)據(jù)可以使用逗號連在一起:mixed-property = a string, 0 x01 0 x23 0 x45 0 x67, ;逗號也可用于創(chuàng)建字符串列表:string-list = red fish, blue fish;基本概念我們將以一個簡單機(jī)開始,然后通過一步步的建立一個描述這個簡單機(jī) 的設(shè)備樹,來

5、了解如何使用設(shè)備樹。2.1模型機(jī)考慮下面這個假想的機(jī)器(大致基于ARM Versatile),制造商為“Acme”,并命名為 “Coyotes Revenge”:一個 32 位 ARM CPU處理器本地總線連接到內(nèi)存映射的串行口、spi總線控制器、i2c控制器、中斷 控制器和外部總線橋256MB SDRAM起始地址為0兩個串口起始地址:0X101F1000和0X101F2000GPIO控制器起始地址:0X101F3000帶有以下設(shè)備的SPI控制器起始地址:0 x10170000MMC插槽的SS管腳連接至GPIO #1外部總線橋掛載以下設(shè)備SMC SMC91111以太網(wǎng)設(shè)備連接到外部總線,起始地

6、址:0 x10100000i2c控制器起始地址:0 x10160000,并掛載以下設(shè)備 Maxim DS1338實(shí)時時鐘。響應(yīng)至從地址1101000 (0 x58)64MB NOR閃存起始地址0 x300000002.2初始結(jié)構(gòu)第一步就是要為這個模型機(jī)構(gòu)建一個基本結(jié)構(gòu),這是一個有效的設(shè)備樹 最基本的結(jié)構(gòu)。在這個階段你需要唯一的標(biāo)識該機(jī)器。/ (compatible = acme,coyotes-revenge;;compatible指定了系統(tǒng)的名稱。它包含了一個“制造商,型號”形式的字符串。重要的是要指定一個確切的設(shè)備,并且包括制造商的名子,以避 免命名空間沖突。由于操作系統(tǒng)會使用compat

7、ible的值來決定如何在機(jī)器上 運(yùn)行,所以正確的設(shè)置這個屬性變得非常重要。理論上講,兼容性(compatible) 就是操作系統(tǒng)需要的所有數(shù)據(jù)都唯一標(biāo)識一個機(jī)器。如果機(jī)器的所有細(xì)節(jié)都 是硬編碼的,那么操作系統(tǒng)則可以在頂層的 compatible屬性中具體查看“ acme,coyotes-revenge”。2.3中央處理器接下來就應(yīng)該描述每個CPU 了。先添加一個名為“cpus”的容器節(jié)點(diǎn), 然后為每個CPU分別添加子節(jié)點(diǎn)。具體到我們的情況是一個ARM的雙核 Cortex A9 系統(tǒng)。/ compatible = acme,coyotes-revenge”;cpus cpu0 compatibl

8、e = arm,cortex-a9;cpu1 ; f=每個cpu節(jié)點(diǎn)的compatible屬性是一個“制造商,型號”形式的字 符串,并指定了確切的cpu,就像頂層的compatible屬性一樣。稍后將會 有更多的屬性添加進(jìn)cpu節(jié)點(diǎn),但我們先得討論一些更過的基本概念。2.4節(jié)點(diǎn)名稱現(xiàn)在應(yīng)該花點(diǎn)時間來討論命名約定了。每個節(jié)點(diǎn)必須有一個“名稱 設(shè)備地址”形式的名字。名稱就是一個不超過31位的簡單ascii字 符串。通常,節(jié)點(diǎn)的命名應(yīng)該根據(jù)它所體現(xiàn)的是什么樣的設(shè)備。比如一個3com 以太網(wǎng)適配器的節(jié)點(diǎn)就應(yīng)該命名為ethernet,而不應(yīng)該是3com509。如果該節(jié)點(diǎn)描述的設(shè)備有一個地址的話就還應(yīng)該加

9、上設(shè)備地址(unit-address)。通常,設(shè)備地址就是用來訪問該設(shè)備的主地址,并且該地 址也在節(jié)點(diǎn)的reg屬性中列出。本文檔中我們將在稍后涉及到reg屬性。 同級節(jié)點(diǎn)命名必須是唯一的,但只要地址不同,多個節(jié)點(diǎn)也可以使用一樣的 通用名稱(例如serial101f1000和serial101f2000)。關(guān)于節(jié)點(diǎn)命名的 更多細(xì)節(jié)請參考ePAPR規(guī)范2.2.1節(jié)。2.5設(shè)備系統(tǒng)中每個設(shè)備都表示為一個設(shè)備樹節(jié)點(diǎn)。所以接下來就應(yīng)該為這個設(shè) 備樹填充設(shè)備節(jié)點(diǎn)?,F(xiàn)在,知道我們討論如何進(jìn)行尋址和中斷請求如何處理 之前這些新節(jié)點(diǎn)將一直為空。/ compatible = acme,coyotes-reveng

10、e”;cpus cpu0 compatible = arm,cortex-a9;cpu1 compatible = arm,cortex-a9;serial101F0000 compatible = arm,pl011;serial101F2000 compatible = arm,pl011;gpio101F3000 compatible = arm,pl061;interrupt-controller10140000 compatible = arm,pl190;spi10115000 compatible = arm,pl022”;;external-bus ethernet0,0 co

11、mpatible = smc,smc91c111;i2c1,0 compatible = acme,a1234-i2c-bus;rtc58 compatible = maxim,ds1338;flash2,0 compatible = samsung,k8f1315ebm, cfi-flash;在此樹中,已經(jīng)為系統(tǒng)中的每個設(shè)備添加了節(jié)點(diǎn),而且這個層次結(jié)構(gòu) 也反映了設(shè)備與系統(tǒng)的連接方式。例如,外部總線上的設(shè)備就是外部總線節(jié) 點(diǎn)的子節(jié)點(diǎn),i2c設(shè)備就是i2c總線節(jié)點(diǎn)的子節(jié)點(diǎn)。通常,這個層次結(jié)構(gòu)表 現(xiàn)的是CPU視角的系統(tǒng)視圖?,F(xiàn)在這棵樹還是無效的,因?yàn)樗鄙訇P(guān)于設(shè)備之間互聯(lián)的信息。稍后將 添加這些信

12、息。在這顆樹中,應(yīng)該注意這些事情:每個設(shè)備節(jié)點(diǎn)都擁有一個compatible屬性。閃存(flash)節(jié)點(diǎn)的compatible屬性由兩個字符串構(gòu)成。欲知為何,請閱讀 下一節(jié)。正如前面所述,節(jié)點(diǎn)的命名應(yīng)當(dāng)反映設(shè)備的類型而不是特定的型號。請查閱 ePAPR規(guī)范第2.2.2節(jié)里定義的通用節(jié)點(diǎn)名,應(yīng)當(dāng)優(yōu)先使用這些節(jié)點(diǎn)名。2.6理解 compatible 屬性樹中每個表示一個設(shè)備的節(jié)點(diǎn)都需要一個compatible屬性。 compatible屬性是操作系統(tǒng)用來決定使用哪個設(shè)備驅(qū)動來綁定到一個設(shè)備 上的關(guān)鍵因素。compatible是一個字符串列表,之中第一個字符串指定了這個節(jié)點(diǎn)所表 示的確切的設(shè)備,該字

13、符串的格式為:制造商,型號。剩下的字符串的 則表示其它與之相兼容的設(shè)備。例如,F(xiàn)reescale MPC8349片上系統(tǒng)(SoC)擁有一個實(shí)現(xiàn)了美國國家半 導(dǎo)體ns16550的寄存器接口的串行設(shè)備,那么 MPC8349的串行設(shè)備的 compatible 屬性就應(yīng)該是:compatible = fsl,mpc8349-uart, ns16550。 在這里,mpc8349-uart指定了確切的設(shè)備,而ns16550則說明這是與美國 國家半導(dǎo)體ns16550 UART的寄存器級兼容。注:ns16550并沒有制造商前綴,這僅僅是歷史原因造成的。所有的新 compatible值都應(yīng)該使用制造商前綴。這種

14、做法可以使現(xiàn)有的設(shè)備驅(qū)動能夠綁定到新設(shè)備上,并仍然唯一的指 定確切的設(shè)備。警告:不要使用帶通配符的compatible值,比如“fsl,mpc83xx-uart” 或類似情況。芯片提供商無不會做出一些能夠輕易打破你通配符猜想的變化, 這時候在修改已經(jīng)為時已晚了。相反,應(yīng)該選擇一個特定的芯片然后是所有 后續(xù)芯片都與之兼容。如何編址可編址設(shè)備使用以下屬性將地址信息編碼進(jìn)設(shè)備樹:reg#address-cells#size-cells每個可編址設(shè)備都有一個元組列表的reg,元組的形式為:reg = 。每個元組都表示一個該設(shè)備使用 的地址范圍。每個地址值是一個或多個32位整型數(shù)列表,稱為cell。同樣

15、, 長度值也可以是一個cell列表或者為空。由于地址和長度字段都是可變大小的變量,那么父節(jié)點(diǎn)的#address-cells 和#size-cells屬性就用來聲明各個字段的cell的數(shù)量。換句話說,正確解釋 一個reg屬性需要用到父節(jié)點(diǎn)的#address-cells和#size-cells的值。要知道 這一切是如何運(yùn)作的,我們將給模型機(jī)添加編址屬性,就從CPU開始。3.1 CPU編址CPU節(jié)點(diǎn)表示了一個關(guān)于編址的最簡單的例子。每個CPU都分配了一個 唯一的ID,并且沒有CPU id相關(guān)的大小信息。cpus #address-cells = ;#size-cells = ;cpu0 compat

16、ible = arm,cortex-a9;reg = ;cpu1 compatible = arm,cortex-a9;reg = ;在 cpu 節(jié)點(diǎn)中,#address-cells 設(shè)置為 1, #size-cells 設(shè)置為 0。 這意味著子節(jié)點(diǎn)的reg值是一個單一的uint32,這是一個不包含大小字段 的地址,為這兩個cpu分配的地址是0和1。cpu節(jié)點(diǎn)的#size-cells為 0是因?yàn)橹粸槊總€cpu分配一個單獨(dú)的地址。你可能還會注意到reg的值和節(jié)點(diǎn)名字是相同的。按照慣例,如果一個 節(jié)點(diǎn)有reg屬性,那么該節(jié)點(diǎn)的名字就必須包含設(shè)備地址,這個設(shè)備地址就 是reg屬性里第一個地址值3.2

17、內(nèi)存映射設(shè)備與cpu節(jié)點(diǎn)里單一地址值不同,應(yīng)該分配給內(nèi)存映射設(shè)備一個地址范 圍。#size-cells聲明每個子節(jié)點(diǎn)的reg元組中長度字段的大小。在接下來 的例子中,每個地址值是1 cell(32位),每個長度值也是1 cell,這是 典型的32位系統(tǒng)。64位的機(jī)器則可以使用值為2的#address-cells和 #size-cells來獲得在設(shè)備樹中的64位編址。/ #address-cells = ;#size-cells = ;serial101f0000 compatible = arm,pl011”;reg = ; ;serial101f2000 compatible = arm,p

18、l011;reg = ; ;即io101f3000 compatible = arm,pl061;reg = ;interrupt-controller10140000 compatible = arm,pl190;reg = ;;spi10115000 compatible = arm,pl022;reg = ;每個設(shè)備都被分配了一個基址以及該區(qū)域的大小。這個例子中為GPIO 分配了兩個地址范圍:0 x101f3000.0 x101f3fff和 0 x101f4000.0 x101f400f。一些掛在總線上的設(shè)備有不同的編址方案。例如一個帶獨(dú)立片選線的設(shè) 備也可以連接至外部總線。由于父節(jié)點(diǎn)會

19、為其子節(jié)點(diǎn)定義地址域,所以可以 選擇不同的地址映射來最恰當(dāng)?shù)拿枋鲈撓到y(tǒng)。下面的代碼展示了設(shè)備連接至 外部總線并將其片選號編碼進(jìn)地址的地址分配。external-bus #address-cells = #size-cells = ;ethernet0,0 compatible = smc,smc91c111;reg = ;i2c1,0 compatible = acme,a1234-i2c-bus;reg = ;rtc58 compatible = maxim,ds1338;flash2,0 compatible = samsung,k8f1315ebm, cfi-flash;reg = ;外

20、部總線的地址值使用了兩個cell, 一個用于片選號;另一個則用于片 選基址的偏移量。而長度字段則還是單個cell,這是因?yàn)橹挥械刂返钠撇?分才需要一個范圍量。所以,在這個例子中,每個reg項(xiàng)都有三個cell: 片選號、偏移量和長度。由于地址域是包含于一個節(jié)點(diǎn)及其子節(jié)點(diǎn)的,所以父節(jié)點(diǎn)可以自由的定 義任何對于該總線來說有意義的編址方案。那些在直接父節(jié)點(diǎn)和子節(jié)點(diǎn)以外 的節(jié)點(diǎn)通常不關(guān)心本地地址域,而地址應(yīng)該從一個域映射到另一個域。3.3非內(nèi)存映射設(shè)備其他的設(shè)備沒有被映射到處理機(jī)總線上。雖然這些設(shè)備可以有一個地址 范圍,但他們并不是由CPU直接訪問。取而代之的是,父設(shè)備的驅(qū)動程序會 代表CPU執(zhí)行簡介

21、訪問。以i2c設(shè)備為例,每個設(shè)備都分配了一個地址,但并沒有與之關(guān)聯(lián)的長 度或范圍信息。這看起來和CPU的地址分配很像i2c1,0 compatible = acme,a1234-i2c-bus”;#address-cells = ;#size-cells = ;reg = ;rtc58 compatible = maxim,ds1338;reg = ;3.4范圍(地址轉(zhuǎn)換)我們已經(jīng)討論了如何給設(shè)備分配地址,但目前來說這些地址還只是設(shè)備 節(jié)點(diǎn)的本地地址,我們還沒有描述如何將這些地址映射成CPU可使用的地址根節(jié)點(diǎn)始終描述的是CPU視角的地址空間。根節(jié)點(diǎn)的子節(jié)點(diǎn)已經(jīng)使用的 是CPU的地址域,所以它們

22、不需要任何直接映射。例如,serial101f0000設(shè) 備就是直接分配的0 x101f0000地址。那些非根節(jié)點(diǎn)直接子節(jié)點(diǎn)的節(jié)點(diǎn)就沒有使用CPU地址域。為了得到一個內(nèi)存映射地址,設(shè)備樹必須指定從一個域到另一個域地址轉(zhuǎn)換地方法,而 ranges屬性就為此而生。下面就是一個添加了 ranges屬性的示例設(shè)備樹。compatible = acme,coyotes-revenge”;#address-cells = ;#size-cells = ;external-bus #address-cells = #size-cells = ;ranges = ; / Chipselect 3, NOR F

23、lashethernet0,0 compatible = smc,smc91c111;reg = ;reg = ;i2c1,0 compatible = acme,a1234-i2c-bus;#address-cells = ;#size-cells = ;reg = ;rtc58 compatible = maxim,ds1338;reg = ;flash2,0 compatible = samsung,k8f1315ebm, cfi-flash;reg = ;ranges是一個地址轉(zhuǎn)換列表。ranges表中的每一項(xiàng)都是一個包含子地址、父地址和在子地址空間中區(qū)域大小的元組。每個字段的值都取決

24、于子節(jié) 點(diǎn) 的 #address-cells、父 節(jié)點(diǎn)的 #address-cells 和 子節(jié)點(diǎn) 的 #size-cells。以本例中的外部總線來說,子地址是2 cell、父地址是1 cell、 區(qū)域大小也是1 cello那么三個ranges被翻譯為:從片選0開始的偏移量0被映射為地址范圍:0 x10100000.0 x1010ffff從片選0開始的偏移量1被映射為地址范圍:0 x10160000.0 x1016ffff從片選0開始的偏移量2被映射為地址范圍:0 x30000000.0 x10000000另外,如果父地址空間和子地址空間是相同的,那么該節(jié)點(diǎn)可以添加一 個空的range屬性。一

25、個空的range屬性意味著子地址將被1:1映射到父 地址空間。你有可能會問當(dāng)全都可以設(shè)計(jì)成1:1映射的時候?yàn)楹芜€要使用地址轉(zhuǎn) 換。答案就是,有一些具有完全不同地址空間的總線(比如PCI),而它們的 細(xì)節(jié)需要暴露給操作系統(tǒng)。另外一些帶有DMA引擎的設(shè)備需要知道總線上的 真實(shí)地址。有時有需要將設(shè)備組合到一塊,因?yàn)樗麄児蚕硐嗤能浖删幊?物理地址映射。是否應(yīng)該使用1:1映射在很大程度上取決于來自操作系統(tǒng)的 信息以及硬件設(shè)計(jì)。你還應(yīng)該注意到在i2c1,0節(jié)點(diǎn)中并沒有range屬性。不同于外部總 線,這里的原因是i2c總線上的設(shè)備并沒有被內(nèi)存映射到CPU的地址域。 相反,CPU將通過i2c1,0設(shè)備間

26、接訪問rtc58設(shè)備。缺少ranges屬性 意味著這個設(shè)備將不能被出他的父設(shè)備之外的任何設(shè)備直接訪問。中斷如何工作與遵循樹的自然結(jié)構(gòu)而進(jìn)行的地址轉(zhuǎn)換不同,機(jī)器上的任何設(shè)備都可以 發(fā)起和終止中斷信號。另外地址的編址也不同于中斷信號,前者是設(shè)備樹的 自然表示,而后者者表現(xiàn)為獨(dú)立于設(shè)備樹結(jié)構(gòu)的節(jié)點(diǎn)之間的鏈接。描述中斷 連接需要四個屬性:interrupt-controller - 一個空的屬性定義該節(jié)點(diǎn)作為一個接收中斷信號的設(shè) 備。#interrupt-cells -這是一個中斷控制器節(jié)點(diǎn)的屬性。它聲明了該中斷控制器的 中斷指示符中cell的個數(shù)(類似于#address-cells和#size-ce

27、lls)。 interrupt-parent -這是一個設(shè)備節(jié)點(diǎn)的屬性,包含一個指向該設(shè)備連接的中斷控 制器的phandle。那些沒有interrupt-parent的節(jié)點(diǎn)則從它們的父節(jié)點(diǎn)中繼承該屬性。interrupts - 一個設(shè)備節(jié)點(diǎn)屬性,包含一個中斷指示符的列表,對應(yīng)于該設(shè)備上 的每個中斷輸出信號。中斷指示符是一個或多個cell的數(shù)據(jù)(由#interrupt-cells指定), 這些數(shù)據(jù)指定了該設(shè)備連接至哪些輸入中斷。在以下的例子中,大部分設(shè)備 都只有一個輸出中斷,但也有可能在一個設(shè)備上有多個輸出中斷。一個中斷 指示符的意義完全取決于與中斷控制器設(shè)備的binding。每個中斷控制器可

28、以決定使用幾個cell來唯一的定義一個輸入中斷。下面的代碼為我們Coyotes Revenge模型機(jī)添加了中斷連接:/ compatible = acme,coyotes-revenge”;#address-cells = ;#size-cells = ;interrupt-parent = ;cpus #address-cells = ;#size-cells = ;cpu0 compatible = arm,cortex-a9;reg = ;cpu1 compatible = arm,cortex-a9; reg = ;;;serial101f0000 compatible = arm,p

29、l011;reg = ;interrupts = ;serial101f2000 compatible = arm,pl011;reg = ;interrupts = ;即io101f3000 compatible = arm,pl061;reg = ;interrupts = ;intc: interrupt-controller10140000 compatible = arm,pl190;reg = ;interrupt-controller;#interrupt-cells = ;spi10115000 compatible = arm,pl022;reg = ;interrupts

30、= ;external-bus #address-cells = #size-cells=;ranges = ;/Chipselect3,NOR Flashethernet0,0 compatible = smc,smc91c111; reg = ; interrupts = ;;i2c1,0 compatible = acme,a1234-i2c-bus”; #address-cells = ; #size-cells = ; reg = ; interrupts = ; rtc58 compatible = maxim,ds1338; reg = ; interrupts = ; ;fla

31、sh2,0 compatible = samsung,k8f1315ebm, cfi-flash; reg = ;需要注意的事情:這個機(jī)器只有一個中斷控制器:interrupt-controller10140000。中斷控制器節(jié)點(diǎn)上添加了 inc:標(biāo)簽,該標(biāo)簽用于給根節(jié)點(diǎn)的interrupt-parent 屬性分配一個phandle。這個interrupt-parent將成為本系統(tǒng)的默認(rèn)值,因?yàn)樗械?子節(jié)點(diǎn)都將繼承它,除非顯示覆寫這個屬性。每個設(shè)備使用interrupts屬性來不同的中斷輸入線。#interrupt-cells是2,所以每個中斷指示符都有2個cell。本例使用一種通 用的模式

32、,也就是用第一個cell來編碼中斷線號;然后用第二個cell編碼標(biāo)志位, 比如高電平/低電平有效,或者邊緣/水平觸發(fā)。對于任何給定的中斷控制器,請參考該 控制器的binding文檔以了解指示符如何編碼。設(shè)備特定數(shù)據(jù)除了通用屬性以外,一個節(jié)點(diǎn)中可以添加任何屬性和子節(jié)點(diǎn)。只要遵循 一些規(guī)則,可以添加任何操作系統(tǒng)所需要的數(shù)據(jù)。首先,新的設(shè)備特定屬性的名字都應(yīng)該使用制造商前綴,以避免和現(xiàn)有 標(biāo)準(zhǔn)屬性名相沖突。其次,屬性和子節(jié)點(diǎn)的含義必須存檔在binding文檔中,以便設(shè)備驅(qū)動 程序的程序員知道如何解釋這些數(shù)據(jù)。一個binding記錄了一個特定compatible值的意義、應(yīng)該包含什么樣的屬性、有可能包

33、含那些子節(jié)點(diǎn)、以 及它代表了什么樣的設(shè)備。每個特別的compatible值都應(yīng)該有一個它自己 的binding (或者要求與其他compatible值兼容)。新設(shè)備的binding存 檔在本wiki中。請查看主頁上的文檔格式描述和審核流程。第三,使用郵件列表.org發(fā)送新的 binding以進(jìn)行審核。新binding的審核可以捕獲很多可能在以后導(dǎo)致問題 的常見錯誤。特殊節(jié)點(diǎn)aliases 節(jié)點(diǎn)引用一個特定的節(jié)點(diǎn)通常使用全路徑,如/external-bus/ethernet0,0,但當(dāng)用戶真真想知道的只是“那個設(shè) 備是eth0? ”時,這樣的全路徑就變得很冗長。這時,aliases節(jié)點(diǎn)就可以 用

34、于指定一個設(shè)備全路徑的別名。例如:aliases ethernetO = ð0;serialO = &serial0;;當(dāng)給一個設(shè)備分配一個識別符是操作系統(tǒng)將非常樂意使用別名。在這里你會發(fā)現(xiàn)一個新語法。property = &label;,將作為字符串屬性 并通過引用標(biāo)簽來指定一個節(jié)點(diǎn)的全路徑。這與之前的phandle = ; 形式不同,這是把一個phandle值插入進(jìn)一個cellochosen 節(jié)點(diǎn)chosen節(jié)點(diǎn)并不代表一個真正的設(shè)備,只是作為一個為固件和操作系統(tǒng) 之間傳遞數(shù)據(jù)的地方,比如引導(dǎo)參數(shù)。chosen節(jié)點(diǎn)里的數(shù)據(jù)也不代表硬件。 通常,chosen節(jié)點(diǎn)在.dts源文件中為空,

35、并在啟動時填充。在我們的示例系統(tǒng)中,固件可以往chosen節(jié)點(diǎn)添加以下信息:chosen bootargs = root=/dev/nfs rw nfsroot= console=ttyS0,115200”;;高級主題7.1高級模型機(jī)現(xiàn)在,我們已經(jīng)掌握了基本的定義,接下來讓我們往模型機(jī)里添加一些 硬件,以討論一些更復(fù)雜的用例。高級模型機(jī)添加了一個PCI主橋,其控制寄存器映射到內(nèi)存 0 x10180000,并且BARs編程至以地址0 x80000000為起始。既然關(guān)于設(shè)備樹我們已經(jīng)有所了解了,那么我們就從以下所示新增加的 節(jié)點(diǎn)來介紹PCI主橋。pci10180000 compatible = a

36、rm,versatile-pci-hostbridge”, pci”; reg = ; interrupts = ;;7.2 PCI 主橋本節(jié)介紹Host/PCI橋節(jié)點(diǎn)。注,本節(jié)將假定讀者了解PCI的一些基本知識。本文并不是PCI教程, 想要了解更深入的信息,請閱讀1。你也可以參考 ePAPR 或 PCI Bus Binding to Open Firmware ( HYPERLINK /1275/bindings/pci/pci2_1.pdf /1275/bindings/pci/pci2 1.pdf)。還可以訪 問 HYPERLINK /MPC5200:PCI /MPC5200:PCI,這

37、里 可以找 到 Freescale MPC5200的一個完整工作的例子。7.2.1 PCI總線編號每個PCI總線段都是唯一編號的,并且總線的編號是通過使用 bus-ranges屬性在pci節(jié)點(diǎn)中暴露出來的,這個屬性有兩個cello第一個 cell給出分配給該節(jié)點(diǎn)的總線號;第二個cell給出任何次級PCI總線最 大總線號。模型機(jī)只有一個pci總線,所以兩個cell都是0opci0 x10180000 compatible = arm,versatile-pci-hostbridge”, pci;reg = ;interrupts = ;bus-ranges = ;7.2.2 PCI 地址轉(zhuǎn)換類似

38、于前面所描述的本地總線,PCI地址空間和CPU地址空間是完全分 離的,所以需要一個從PCI地址到CPU地址的轉(zhuǎn)換。同樣,完成這樣的轉(zhuǎn) 換將使用 ranges、#address-cells 和 #size-cells 屬性pci0 x10180000 compatible = arm,versatile-pci-hostbridge”, pci”;reg = ;interrupts = ;bus-ranges = ;#address-cells = #size-cells = ;ranges = ;正如你所看到的,子地址(PCI地址)使用3個cell,同時PCI rangs 被編碼為2個cell

39、o那么第一個問題就可能是,為什么我們要用三個32位 cell去指定一個PCI地址?這三個cell分別標(biāo)記了 phys.hi、phys.mid 和 phys.low2。phys.hi cell: npt000ss bbbbbbbb dddddfff rrrrrrrrphys.mid cell: hhhhhhhh hhhhhhhh hhhhhhhh hhhhhhhh phys.low cell: llllllll llllllll llllllll llllllllPCI地址是64位的,并編碼進(jìn)了 phys.mid和phys.low。然而真正有 意思的是在phys.high里棉面,這是一個位域。n

40、:重定位區(qū)域標(biāo)志(在這里不起作用)p:預(yù)?。删彺妫﹨^(qū)標(biāo)志t:地址別名標(biāo)志(在這里不起作用)ss:空間代碼00:配置空間01: I/O 空間10: 32位內(nèi)存空間11: 64位內(nèi)存空間bbbbbbbb:PCI總線號PCI可以是分層結(jié)構(gòu),所以我們可能有PCI/PCI 橋,這可以定義子總線。ddddd:設(shè)備號,通常與IDSEL型號相關(guān)聯(lián)。fff:功能號。用于多功能PCI設(shè)備。rrrrrrrr:寄存器號,用于配置周期。對于PCI地址轉(zhuǎn)換來說,p和ss是最重要的字段。在phys.hi里的p和 ss的值決定了訪問哪個PCI地址空間。因此,通過查找ranges屬性,我 們將得到三個區(qū)域。以PCI地址0 x

41、80000000開始的一個512 MByte 32位預(yù)取存儲區(qū),該 區(qū)域?qū)⒂成涞街鳈C(jī)CPU地址0 x80000000。以PCI地址 0 xa0000000 開始的一個265 MByte 32位非預(yù)取存儲 區(qū),該區(qū)域?qū)⒂成涞街鳈C(jī)CPU地址0 xa0000000。以PCI地址 0 x00000000 開始的一個16 MByte I/O區(qū),該區(qū)域?qū)⒂成涞街鳈C(jī)CPU地址 0 xb0000000。為阻止這些工作,phys.hi位域的存在就意味著操作系統(tǒng)必須知道該節(jié) 點(diǎn)代表了一個PCI橋,這樣操作系統(tǒng)才能為了地址轉(zhuǎn)換而忽略那些不相關(guān)的 字段。為了判斷應(yīng)該掩碼哪些額外的字段,操作系統(tǒng)需要在PCI總線節(jié)點(diǎn)中

42、尋找“pci”字符串。7.3高級中斷映射現(xiàn)在我們來到了最有趣的部分,PCI中斷映射。一個PCI設(shè)備可以使用 引線#INTA、#INTB、#INTC和#INTD來觸發(fā)中斷。如果我們沒有多功能PCI 設(shè)備,那么設(shè)備中斷必須使用#INTA。然而,每個PCI插槽或設(shè)備通常會連 接到中斷控制器上不同的輸入端。所以設(shè)備樹需要一種能將各個PCI中斷信 號映射到 中斷控制器的途徑。#interrupt-cells、interrupt-map和 interrupt-map-mask屬性就被用來描述這個中斷映射。這里所描述的中斷映射并不僅僅局限于PCI總線,事實(shí)上,任何節(jié)點(diǎn)都 可以指定復(fù)雜的中斷映射,但PCI是最

43、常見的情況。 compatible = arm,versatile-pci-hostbridge”, pci”; reg = ;interrupts = ;bus-ranges = ;#address-cells = #size-cells = ;ranges =;#interrupt-cells = ;interrupt-map-mask = ;interrupt-map = ;首先你會發(fā)現(xiàn),PCI中斷號只使用了一個cell,不像系統(tǒng)中斷控制器, 它使用兩個cell,一個用于中斷號,另一個用于標(biāo)志。PCI中斷只使用了一 個cell,因?yàn)镻CI中斷確定為始終是低電平觸發(fā)。在這個示例板上,我們有2個分別包含4個中斷線的PCI插槽,所以 我們需要映射8個中斷線到中斷控制器上。這已經(jīng)在interrupt-map屬性 中完成了。關(guān)于中斷映射的具體步驟請參考3。因?yàn)橐獏^(qū)分單一 PCI總線上的若干PCI設(shè)備中斷號(#INA等)是不夠 用的,所以我們還需要指出是哪個PCI設(shè)備觸發(fā)了中斷線。幸運(yùn)的是我們還 可以使用每個設(shè)備所擁有的唯一設(shè)備號。為了區(qū)分這些PCI設(shè)備,我們需要 一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論