




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選文檔設(shè)備樹使用手冊本文將介紹如何為一個新機器編寫設(shè)備樹。我們預(yù)備供應(yīng)一個有關(guān)設(shè)備樹概念的概述和如何使用這些設(shè)備樹來描述一個機器。完整的設(shè)備樹數(shù)據(jù)格式的技術(shù)說明書請參考 ePAPR 規(guī)范。ePAPR 規(guī)范涵蓋了比本文基本主題更豐富的細(xì)節(jié),要查閱本文沒有涉及到的高級用法請參考該規(guī)范。 名目1. 基本數(shù)據(jù)格式 2. 基本概念2.1模型機2.2初始結(jié)構(gòu)2.3 中心處理器2.4 節(jié)點名稱2.5 設(shè)備2.6 理解 compatible 屬性3. 如何編址3.1 CPU編址3.2 內(nèi)存映射設(shè)備3.3 非內(nèi)存映射設(shè)備3.4 范圍(地址轉(zhuǎn)換)4. 中斷的工作方式5. 設(shè)備特定數(shù)據(jù)6. 特殊的節(jié)點6.1 al
2、iases 節(jié)點6.2 chosen節(jié)點7. 高級主題7.1 高級模型機7.2 PCI 主橋7.2.1 PCI總線編號7.2.2 PCI地址轉(zhuǎn)換7.3 高級中斷映射8. 附注 基本數(shù)據(jù)格式設(shè)備樹是一個包含節(jié)點和屬性的簡潔樹狀結(jié)構(gòu)。屬性就是鍵值對,而節(jié)點可以同時包含屬性和子節(jié)點。例如,以下就是一個 .dts 格式的簡潔樹:/node1 a-string-property = A string; a-string-list-property = first string, second string; a-byte-data-property = 0x01 0x23 0x34 0x56; chil
3、d-node1 first-child-property; second-child-property = ; a-string-property = Hello, world; ; child-node2 ; ; node2 an-empty-property; a-cell-property = ; /* each number (cell) is a uint32 */ child-node1 ; ;這棵樹明顯是沒什么用的,由于它并沒有描述任何東西,但它的確體現(xiàn)了節(jié)點的一些屬性: 一個單獨的根節(jié)點:“/” 兩個子節(jié)點:“node1”和“node2” 兩個 node1 的子節(jié)點:“chil
4、d-node1”和“child-node2” 一堆分散在樹里的屬性。屬性是簡潔的鍵值對,它的值可以為空或者包含一個任意字節(jié)流。雖然數(shù)據(jù)類型并沒有編碼進(jìn)數(shù)據(jù)結(jié)構(gòu),但在設(shè)備樹源文件中任有幾個基本的數(shù)據(jù)表示形式。 文本字符串(無結(jié)束符)可以用雙引號表示:string-property = a string Cells是 32 位無符號整數(shù),用尖括號限定:cell-property = 二進(jìn)制數(shù)據(jù)用方括號限定:binary-property = 0x01 0x23 0x45 0x67; 不同表示形式的數(shù)據(jù)可以使用逗號連在一起:mixed-property = a string, 0x01 0x23 0
5、x45 0x67, ; 逗號也可用于創(chuàng)建字符串列表:string-list = red fish, blue fish; 基本概念我們將以一個簡潔機開頭,然后通過一步步的建立一個描述這個簡潔機的設(shè)備樹,來了解如何使用設(shè)備樹。2.1模型機考慮下面這個假想的機器(大致基于ARM Versatile),制造商為“Acme”,并命名為“Coyotes Revenge”:一個 32 位 ARM CPU 處理器本地總線連接到內(nèi)存映射的串行口、spi 總線把握器、i2c 把握器、中斷控制器和外部總線橋256MB SDRAM 起始地址為 0 兩個串口起始地址:0x101F1000 和 0x101F2000GP
6、IO 把握器起始地址:0x101F3000帶有以下設(shè)備的 SPI 把握器起始地址:0x10170000 MMC 插槽的 SS 管腳連接至 GPIO #1外部總線橋掛載以下設(shè)備 SMC SMC91111 以太網(wǎng)設(shè)備連接到外部總線,起始地址:0x10100000 i2c 把握器起始地址:0x10160000,并掛載以下設(shè)備 Maxim DS1338 實時時鐘。響應(yīng)至從地址 1101000 (0x58) 64MB NOR 閃存起始地址 0x300000002.2初始結(jié)構(gòu)第一步就是要為這個模型機構(gòu)建一個基本結(jié)構(gòu),這是一個有效的設(shè)備樹最基本的結(jié)構(gòu)。在這個階段你需要唯一的標(biāo)識該機器。/ compatibl
7、e = acme,coyotes-revenge;compatible 指定了系統(tǒng)的名稱。它包含了一個“,”形式的字符串。重要的是要指定一個精確的設(shè)備,并且包括制造商的名子,以避開命名空間沖突。由于操作系統(tǒng)會使用 compatible 的值來打算如何在機器上運行,所以正確的設(shè)置這個屬性變得格外重要。理論上講,兼容性(compatible)就是操作系統(tǒng)需要的全部數(shù)據(jù)都唯一標(biāo)識一個機器。假如機器的全部細(xì)節(jié)都是硬編碼的,那么操作系統(tǒng)則可以在頂層的 compatible 屬性中具體查看“acme,coyotes-revenge”。2.3中心處理器接下來就應(yīng)當(dāng)描述每個 CPU 了。先添加一個名為“cpu
8、s”的容器節(jié)點,然后為每個 CPU 分別添加子節(jié)點。具體到我們的狀況是一個 ARM 的 雙核 Cortex A9 系統(tǒng)。/ compatible = acme,coyotes-revenge; cpus cpu0 compatible = arm,cortex-a9; ; cpu1 compatible = arm,cortex-a9; ; ;每個 cpu 節(jié)點的 compatible 屬性是一個“,”形式的字符串,并指定了精確的 cpu,就像頂層的 compatible 屬性一樣。稍后將會有更多的屬性添加進(jìn) cpu 節(jié)點,但我們先得爭辯一些更過的基本概念。2.4節(jié)點名稱現(xiàn)在應(yīng)當(dāng)花點時間來爭辯
9、命名商定了。每個節(jié)點必需有一個“”形式的名字。 就是一個不超過31位的簡潔 ascii 字符串。通常,節(jié)點的命名應(yīng)當(dāng)依據(jù)它所體現(xiàn)的是什么樣的設(shè)備。比如一個 3com 以太網(wǎng)適配器的節(jié)點就應(yīng)當(dāng)命名為 ethernet,而不應(yīng)當(dāng)是 3com509。假如該節(jié)點描述的設(shè)備有一個地址的話就還應(yīng)當(dāng)加上設(shè)備地址(unit-address)。通常,設(shè)備地址就是用來訪問該設(shè)備的主地址,并且該地址也在節(jié)點的 reg 屬性中列出。本文檔中我們將在稍后涉及到 reg 屬性。同級節(jié)點命名必需是唯一的,但只要地址不同,多個節(jié)點也可以使用一樣的通用名稱(例如 serial101f1000 和 serial101f2000)
10、。關(guān)于節(jié)點命名的更多細(xì)節(jié)請參考 ePAPR 規(guī)范 2.2.1 節(jié)。2.5設(shè)備系統(tǒng)中每個設(shè)備都表示為一個設(shè)備樹節(jié)點。所以接下來就應(yīng)當(dāng)為這個設(shè)備樹填充設(shè)備節(jié)點?,F(xiàn)在,知道我們爭辯如何進(jìn)行尋址和中斷懇求如何處理之前這些新節(jié)點將始終為空。/ compatible = acme,coyotes-revenge; cpus cpu0 compatible = arm,cortex-a9; ; cpu1 compatible = arm,cortex-a9; ; ; serial101F0000 compatible = arm,pl011; ; serial101F2000 compatible = ar
11、m,pl011; ; gpio101F3000 compatible = arm,pl061; ; interrupt-controller10140000 compatible = arm,pl190; ; spi10115000 compatible = arm,pl022; ; external-bus ethernet0,0 compatible = smc,smc91c111; ; i2c1,0 compatible = acme,a1234-i2c-bus; rtc58 compatible = maxim,ds1338; ; ; flash2,0 compatible = sam
12、sung,k8f1315ebm, cfi-flash; ; ;在此樹中,已經(jīng)為系統(tǒng)中的每個設(shè)備添加了節(jié)點,而且這個層次結(jié)構(gòu)也反映了設(shè)備與系統(tǒng)的連接方式。例如,外部總線上的設(shè)備就是外部總線節(jié)點的子節(jié)點,i2c 設(shè)備就是 i2c 總線節(jié)點的子節(jié)點。通常,這個層次結(jié)構(gòu)表現(xiàn)的是 CPU 視角的系統(tǒng)視圖?,F(xiàn)在這棵樹還是無效的,由于它缺少關(guān)于設(shè)備之間互聯(lián)的信息。稍后將添加這些信息。在這顆樹中,應(yīng)當(dāng)留意這些事情:每個設(shè)備節(jié)點都擁有一個 compatible 屬性。閃存(flash)節(jié)點的 compatible 屬性由兩個字符串構(gòu)成。欲知為何,請閱讀下一節(jié)。正如前面所述,節(jié)點的命名應(yīng)當(dāng)反映設(shè)備的類型而不是特定
13、的型號。請查閱 ePAPR 規(guī)范第 2.2.2 節(jié)里定義的通用節(jié)點名,應(yīng)當(dāng)優(yōu)先使用這些節(jié)點名。2.6理解 compatible 屬性樹中每個表示一個設(shè)備的節(jié)點都需要一個 compatible 屬性。compatible 屬性是操作系統(tǒng)用來打算使用哪個設(shè)備驅(qū)動來綁定到一個設(shè)備上的關(guān)鍵因素。compatible 是一個字符串列表,之中第一個字符串指定了這個節(jié)點所表示的精確的設(shè)備,該字符串的格式為:,。剩下的字符串的則表示其它與之相兼容的設(shè)備。例如,F(xiàn)reescale MPC8349 片上系統(tǒng)(SoC)擁有一個實現(xiàn)了美國國家半導(dǎo)體 ns16550 的寄存器接口的串行設(shè)備,那么 MPC8349 的串行
14、設(shè)備的 compatible 屬性就應(yīng)當(dāng)是:compatible = fsl,mpc8349-uart, ns16550。在這里,mpc8349-uart 指定了精確的設(shè)備,而ns16550 則說明這是與美國國家半導(dǎo)體 ns16550UART的寄存器級兼容。注:ns16550 并沒有制造商前綴,這僅僅是歷史緣由造成的。全部的新 compatible 值都應(yīng)當(dāng)使用制造商前綴。這種做法可以使現(xiàn)有的設(shè)備驅(qū)動能夠綁定到新設(shè)備上,并仍舊唯一的指定精確的設(shè)備。警告:不要使用帶通配符的 compatible 值,比如“fsl,mpc83xx-uart”或類似狀況。芯片供應(yīng)商無不會做出一些能夠輕易打破你通配符
15、猜想的變化,這時候在修改已經(jīng)為時已晚了。相反,應(yīng)當(dāng)選擇一個特定的芯片然后是全部后續(xù)芯片都與之兼容。如何編址可編址設(shè)備使用以下屬性將地址信息編碼進(jìn)設(shè)備樹:reg#address-cells#size-cells每個可編址設(shè)備都有一個元組列表的 reg,元組的形式為:reg = 。每個元組都表示一個該設(shè)備使用的地址范圍。每個地址值是一個或多個 32 位整型數(shù)列表,稱為 cell。同樣,長度值也可以是一個 cell 列表或者為空。由于地址和長度字段都是可變大小的變量,那么父節(jié)點的 #address-cells 和 #size-cells 屬性就用來聲明各個字段的 cell 的數(shù)量。換句話說,正確解釋
16、一個 reg 屬性需要用到父節(jié)點的 #address-cells 和 #size-cells 的值。要知道這一切是如何運作的,我們將給模型機添加編址屬性,就從 CPU 開頭。3.1 CPU編址CPU 節(jié)點表示了一個關(guān)于編址的最簡潔的例子。每個 CPU 都安排了一個唯一的 ID,并且沒有 CPU id 相關(guān)的大小信息。 cpus #address-cells = ; #size-cells = ; cpu0 compatible = arm,cortex-a9; reg = ; ; cpu1 compatible = arm,cortex-a9; reg = ; ;在 cpu 節(jié)點中,#addr
17、ess-cells 設(shè)置為 1,#size-cells 設(shè)置為 0。這意味著子節(jié)點的 reg 值是一個單一的 uint32,這是一個不包含大小字段的地址,為這兩個 cpu 安排的地址是 0 和 1。cpu 節(jié)點的 #size-cells 為 0 是由于只為每個 cpu 安排一個單獨的地址。你可能還會留意到 reg 的值和節(jié)點名字是相同的。依據(jù)慣例,假如一個節(jié)點有 reg 屬性,那么該節(jié)點的名字就必需包含設(shè)備地址,這個設(shè)備地址就是 reg 屬性里第一個地址值。3.2 內(nèi)存映射設(shè)備與 cpu 節(jié)點里單一地址值不同,應(yīng)當(dāng)安排給內(nèi)存映射設(shè)備一個地址范圍。#size-cells 聲明每個子節(jié)點的 reg
18、 元組中長度字段的大小。在接下來的例子中,每個地址值是 1 cell(32 位),每個長度值也是 1 cell,這是典型的 32 位系統(tǒng)。64 位的機器則可以使用值為 2 的 #address-cells 和 #size-cells 來獲得在設(shè)備樹中的 64 位編址。/ #address-cells = ; #size-cells = ; . serial101f0000 compatible = arm,pl011; reg = ; ; serial101f2000 compatible = arm,pl011; reg = ; ; gpio101f3000 compatible = arm
19、,pl061; reg = ; ; interrupt-controller10140000 compatible = arm,pl190; reg = ; ; spi10115000 compatible = arm,pl022; reg = ; ; .;每個設(shè)備都被安排了一個基址以及該區(qū)域的大小。這個例子中為 GPIO 安排了兩個地址范圍:0x101f3000.0x101f3fff 和 0x101f4000.0x101f400f。一些掛在總線上的設(shè)備有不同的編址方案。例如一個帶獨立片選線的設(shè)備也可以連接至外部總線。由于父節(jié)點會為其子節(jié)點定義地址域,所以可以選擇不同的地址映射來最恰當(dāng)?shù)拿枋鲈?/p>
20、系統(tǒng)。下面的代碼呈現(xiàn)了設(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 = ; ; ;外部總線的地址值使用了兩個 cell
21、,一個用于片選號;另一個則用于片選基址的偏移量。而長度字段則還是單個 cell,這是由于只有地址的偏移部分才需要一個范圍量。所以,在這個例子中,每個 reg 項都有三個 cell:片選號、偏移量和長度。由于地址域是包含于一個節(jié)點及其子節(jié)點的,所以父節(jié)點可以自由的定義任何對于該總線來說有意義的編址方案。那些在直接父節(jié)點和子節(jié)點以外的節(jié)點通常不關(guān)懷本地地址域,而地址應(yīng)當(dāng)從一個域映射到另一個域。3.3 非內(nèi)存映射設(shè)備其他的設(shè)備沒有被映射處處理機總線上。雖然這些設(shè)備可以有一個地址范圍,但他們并不是由 CPU 直接訪問。取而代之的是,父設(shè)備的驅(qū)動程序會代表 CPU 執(zhí)行簡介訪問。以 i2c 設(shè)備為例,每
22、個設(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é)點的本地地址,我們還沒有描述如何將這些地址映射成 CPU 可使用的地址根節(jié)點始終描述的是 CPU 視角的地址空間。根節(jié)點的子節(jié)點已經(jīng)使用的是 CPU 的地址域,所以
23、它們不需要任何直接映射。例如,serial101f0000 設(shè)備就是直接安排的 0x101f0000 地址。那些非根節(jié)點直接子節(jié)點的節(jié)點就沒有使用 CPU 地址域。為了得到一個內(nèi)存映射地址,設(shè)備樹必需指定從一個域到另一個域地址轉(zhuǎn)換地方法,而 ranges 屬性就為此而生。下面就是一個添加了 ranges 屬性的示例設(shè)備樹。/ compatible = acme,coyotes-revenge; #address-cells = ; #size-cells = ; . external-bus #address-cells = #size-cells = ; ranges = ; / Chips
24、elect 3, NOR Flash ethernet0,0 compatible = smc,smc91c111; 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 表中的每一項都是一個包含子地址
25、、父地址和在子地址空間中區(qū)域大小的元組。每個字段的值都取決于子節(jié)點的 #address-cells 、父節(jié)點的 #address-cells 和子節(jié)點的 #size-cells。以本例中的外部總線來說,子地址是 2 cell、父地址是 1 cell、區(qū)域大小也是 1 cell。那么三個 ranges 被翻譯為:從片選 0 開頭的偏移量 0 被映射為地址范圍:0x10100000.0x1010ffff從片選 0 開頭的偏移量 1 被映射為地址范圍:0x10160000.0x1016ffff從片選 0 開頭的偏移量 2 被映射為地址范圍:0x30000000.0x10000000另外,假如父地址空
26、間和子地址空間是相同的,那么該節(jié)點可以添加一個空的 range 屬性。一個空的 range 屬性意味著子地址將被 1:1 映射到父地址空間。你有可能會問當(dāng)全都可以設(shè)計成 1:1 映射的時候為何還要使用地址轉(zhuǎn)換。答案就是,有一些具有完全不同地址空間的總線(比如 PCI),而它們的細(xì)節(jié)需要暴露給操作系統(tǒng)。另外一些帶有 DMA 引擎的設(shè)備需要知道總線上的真實地址。有時有需要將設(shè)備組合到一塊,由于他們共享相同的軟件可編程物理地址映射。是否應(yīng)當(dāng)使用 1:1 映射在很大程度上取決于來自操作系統(tǒng)的信息以及硬件設(shè)計。你還應(yīng)當(dāng)留意到在 i2c1,0 節(jié)點中并沒有 range 屬性。不同于外部總線,這里的緣由是
27、i2c 總線上的設(shè)備并沒有被內(nèi)存映射到 CPU 的地址域。相反,CPU 將通過 i2c1,0 設(shè)備間接訪問 rtc58 設(shè)備。缺少 ranges 屬性意味著這個設(shè)備將不能被出他的父設(shè)備之外的任何設(shè)備直接訪問。中斷如何工作與遵循樹的自然結(jié)構(gòu)而進(jìn)行的地址轉(zhuǎn)換不同,機器上的任何設(shè)備都可以發(fā)起和終止中斷信號。另外地址的編址也不同于中斷信號,前者是設(shè)備樹的自然表示,而后者者表現(xiàn)為獨立于設(shè)備樹結(jié)構(gòu)的節(jié)點之間的鏈接。描述中斷連接需要四個屬性: interrupt-controller - 一個空的屬性定義該節(jié)點作為一個接收中斷信號的設(shè)備。 #interrupt-cells - 這是一個中斷把握器節(jié)點的屬性。
28、它聲明白該中斷把握器的中斷指示符中 cell 的個數(shù)(類似于 #address-cells 和 #size-cells)。 interrupt-parent - 這是一個設(shè)備節(jié)點的屬性,包含一個指向該設(shè)備連接的中斷把握器的 phandle。那些沒有 interrupt-parent 的節(jié)點則從它們的父節(jié)點中繼承該屬性。interrupts - 一個設(shè)備節(jié)點屬性,包含一個中斷指示符的列表,對應(yīng)于該設(shè)備上的每個中斷輸出信號。中斷指示符是一個或多個 cell 的數(shù)據(jù)(由 #interrupt-cells 指定),這些數(shù)據(jù)指定了該設(shè)備連接至哪些輸入中斷。在以下的例子中,大部分設(shè)備都只有一個輸出中斷,但
29、也有可能在一個設(shè)備上有多個輸出中斷。一個中斷指示符的意義完全取決于與中斷把握器設(shè)備的 binding。每個中斷把握器可以打算使用幾個 cell 來唯一的定義一個輸入中斷。下面的代碼為我們 Coyotes Revenge 模型機添加了中斷連接:/ compatible = acme,coyotes-revenge; #address-cells = ; #size-cells = ; interrupt-parent = ; cpus #address-cells = ; #size-cells = ; cpu0 compatible = arm,cortex-a9; reg = ; ; cpu
30、1 compatible = arm,cortex-a9; reg = ; ; ; serial101f0000 compatible = arm,pl011; reg = ; interrupts = ; ; serial101f2000 compatible = arm,pl011; reg = ; interrupts = ; ; gpio101f3000 compatible = arm,pl061; reg = ; interrupts = ; ; intc: interrupt-controller10140000 compatible = arm,pl190; reg = ; i
31、nterrupt-controller; #interrupt-cells = ; ; spi10115000 compatible = arm,pl022; reg = ; interrupts = ; ; external-bus #address-cells = #size-cells = ; ranges = ; / Chipselect 3, NOR Flash ethernet0,0 compatible = smc,smc91c111; reg = ; interrupts = ; ; i2c1,0 compatible = acme,a1234-i2c-bus; #addres
32、s-cells = ; #size-cells = ; reg = ; interrupts = ; rtc58 compatible = maxim,ds1338; reg = ; interrupts = ; ; ; flash2,0 compatible = samsung,k8f1315ebm, cfi-flash; reg = ; ; ;需要留意的事情:這個機器只有一個中斷把握器:interrupt-controller10140000。中斷把握器節(jié)點上添加了inc:標(biāo)簽,該標(biāo)簽用于給根節(jié)點的 interrupt-parent 屬性安排一個 phandle。這個 interrupt-
33、parent 將成為本系統(tǒng)的默認(rèn)值,由于全部的子節(jié)點都將繼承它,除非顯示覆寫這個屬性。每個設(shè)備使用 interrupts 屬性來不同的中斷輸入線。#interrupt-cells 是 2,所以每個中斷指示符都有 2 個 cell。本例使用一種通用的模式,也就是用第一個 cell 來編碼中斷線號;然后用其次個 cell 編碼標(biāo)志位,比如高電平/低電平有效,或者邊緣/水平觸發(fā)。對于任何給定的中斷把握器,請參考該把握器的 binding 文檔以了解指示符如何編碼。設(shè)備特定數(shù)據(jù)除了通用屬性以外,一個節(jié)點中可以添加任何屬性和子節(jié)點。只要遵循一些規(guī)章,可以添加任何操作系統(tǒng)所需要的數(shù)據(jù)。首先,新的設(shè)備特定屬
34、性的名字都應(yīng)當(dāng)使用制造商前綴,以避開和現(xiàn)有標(biāo)準(zhǔn)屬性名相沖突。其次,屬性和子節(jié)點的含義必需存檔在 binding 文檔中,以便設(shè)備驅(qū)動程序的程序員知道如何解釋這些數(shù)據(jù)。一個 binding 記錄了一個特定 compatible 值的意義、應(yīng)當(dāng)包含什么樣的屬性、有可能包含那些子節(jié)點、以及它代表了什么樣的設(shè)備。每個特殊的 compatible 值都應(yīng)當(dāng)有一個它自己的 binding(或者要求與其他 compatible 值兼容)。新設(shè)備的 binding 存檔在本 wiki 中。請查看主頁上的文檔格式描述和審核流程。第三,使用郵件列表 devicetree-discusslists.ozlabs.o
35、rg 發(fā)送新的 binding 以進(jìn)行審核。新 binding 的審核可以捕獲很多可能在以后導(dǎo)致問題的常見錯誤。特殊節(jié)點6.1 aliases 節(jié)點引用一個特定的節(jié)點通常使用全路徑,如 /external-bus/ethernet0,0,但當(dāng)用戶真真想知道的只是“那個設(shè)備是 eth0?”時,這樣的全路徑就變得很冗長。這時,aliases 節(jié)點就可以用于指定一個設(shè)備全路徑的別名。例如: aliases ethernet0 = ð0; serial0 = &serial0; ;當(dāng)給一個設(shè)備安排一個識別符是操作系統(tǒng)將格外樂意使用別名。在這里你會發(fā)覺一個新語法。property = &label
36、;,將作為字符串屬性并通過引用標(biāo)簽來指定一個節(jié)點的全路徑。這與之前的 phandle = ; 形式不同,這是把一個 phandle 值插入進(jìn)一個 cell。6.2 chosen節(jié)點chosen 節(jié)點并不代表一個真正的設(shè)備,只是作為一個為固件和操作系統(tǒng)之間傳遞數(shù)據(jù)的地方,比如引導(dǎo)參數(shù)。chosen 節(jié)點里的數(shù)據(jù)也不代表硬件。通常,chosen 節(jié)點在 .dts 源文件中為空,并在啟動時填充。在我們的示例系統(tǒng)中,固件可以往 chosen 節(jié)點添加以下信息: chosen bootargs = root=/dev/nfs rw nfsroot= console=ttyS0,11
37、5200; ;高級主題7.1 高級模型機現(xiàn)在,我們已經(jīng)把握了基本的定義,接下來讓我們往模型機里添加一些硬件,以爭辯一些更簡單的用例。高級模型機添加了一個 PCI 主橋,其把握寄存器映射到內(nèi)存 0x10180000,并且 BARs 編程至以地址 0x80000000 為起始。既然關(guān)于設(shè)備樹我們已經(jīng)有所了解了,那么我們就從以下所示新增加的節(jié)點來介紹 PCI 主橋。 pci10180000 compatible = arm,versatile-pci-hostbridge, pci; reg = ; interrupts = ; ;7.2 PCI 主橋本節(jié)介紹 Host/PCI 橋節(jié)點。注,本節(jié)將假
38、定讀者了解 PCI 的一些基本學(xué)問。本文并不是 PCI 教程,想要了解更深化的信息,請閱讀 1。你也可以參考 ePAPR 或 PCI Bus Binding to Open Firmware(/MPC5200:PCI,這里可以找到 Freescale MPC5200 的一個完整工作的例子。7.2.1 PCI總線編號每個 PCI 總線段都是唯一編號的,并且總線的編號是通過使用 bus-ranges 屬性在 pci 節(jié)點中暴露出來的,這個屬性有兩個 cell。第一個 cell 給出安排給該節(jié)點的總線號;其次個 cell 給出任何次級 PCI 總線最大總線號。
39、模型機只有一個 pci 總線,所以兩個 cell 都是 0。 pci0x10180000 compatible = arm,versatile-pci-hostbridge, pci; reg = ; interrupts = ; bus-ranges = ; ;7.2.2 PCI地址轉(zhuǎn)換類似于前面所描述的本地總線,PCI 地址空間和 CPU 地址空間是完全分別的,所以需要一個從 PCI 地址到 CPU 地址的轉(zhuǎn)換。同樣,完成這樣的轉(zhuǎn)換將使用 ranges、#address-cells 和 #size-cells 屬性 pci0x10180000 compatible = arm,versat
40、ile-pci-hostbridge, pci; reg = ; interrupts = ; bus-ranges = ; #address-cells = #size-cells = ; ranges = ; ;正如你所看到的,子地址(PCI 地址)使用 3 個 cell,同時 PCI rangs 被編碼為 2 個 cell。那么第一個問題就可能是,為什么我們要用三個 32 位 cell 去指定一個 PCI 地址?這三個 cell 分別標(biāo)記了 phys.hi、phys.mid 和 phys.low2。phys.hi cell: npt000ss bbbbbbbb dddddfff rrrr
41、rrrrphys.mid cell: hhhhhhhh hhhhhhhh hhhhhhhh hhhhhhhh phys.low cell: llllllll llllllll llllllll llllllllPCI 地址是 64 位的,并編碼進(jìn)了 phys.mid 和 phys.low。然而真正有意思的是在 phys.high 里棉面,這是一個位域。n:重定位區(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 地址空間。因此,通
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨床路徑管理實施方案及實施細(xì)則
- 健康飲食與運動作業(yè)指導(dǎo)書
- 商鋪裝修糾紛起訴書模板
- 服裝店裝修免租期協(xié)議樣本
- 雨水收集回用系統(tǒng)的組成部分
- 變壓器項目可行性研究報告
- 三農(nóng)企業(yè)戰(zhàn)略規(guī)劃與實施方案
- 制藥行業(yè)新醫(yī)藥技術(shù)與臨床應(yīng)用方案
- 新項目股權(quán)分配與權(quán)責(zé)分配計劃書
- 道路工程建設(shè)項目可行性研究報告
- 探究反應(yīng)后溶液中的溶質(zhì)
- 景觀照明燈具技術(shù)規(guī)格標(biāo)準(zhǔn)附詳圖參考
- 《簡·愛》外國小說閱讀,初中語文下冊名著閱讀精講課件(部編版)
- 滬教版高一英語上冊(牛津版)全冊課件【完整版】
- 疾控中心考試試題
- 2023門球競賽規(guī)則電子版圖文并茂
- DB13T 2801-2018 水利工程質(zhì)量監(jiān)督規(guī)程
- Q∕SY 05262-2019 機械清管器技術(shù)條件
- 耳鼻咽喉頭頸外科學(xué)耳鼻咽喉應(yīng)用解剖
- DBJ51 014-2021 四川省建筑地基基礎(chǔ)檢測技術(shù)規(guī)程
- 科學(xué)研究方法與學(xué)術(shù)論文寫作
評論
0/150
提交評論