可定址的裝置在Device Tree中編碼位址資訊

2021-06-28 22:08:28 字數 3280 閱讀 9965

乙個雙核armcortex-a9 32位處理器;

arm的local bus上的記憶體對映區域分布了2個串列埠(分別位於0x101f1000 和0x101f2000)、gpio控制器(位於0x101f3000)、spi控制器(位於0x10170000)、中斷控制器(位於0x10140000)和乙個external bus橋;

external bus橋上又連線了smcsmc91111 ethernet(位於0x10100000)、i2c控制器(位於0x10160000)、64mbnor flash(位於0x30000000);

external bus橋上連線的i2c控制器所對應的i2c匯流排上又連線了maximds1338實時鐘(i2c位址為0x58)。

其對應的.dts檔案為:

[plain]

view plain

copy

1.  / ;  

14.         cpu@1 ;  

18.     };  

19.

20.     serial@101f0000 ;  

25.

26.     serial@101f2000 ;  

31.

32.     gpio@101f3000 ;  

38.

39.     intc: interrupt-controller@10140000 ;  

45.

46.     spi@10115000 ;  

51.

52.     external-bus ;  

64.

65.         i2c@1,0 ;  

76.         };  

77.

78.         flash@2,0 ;  

82.     };  

83. };  

l     reg

l     #address-cells

l     #size-cells

其中reg的組織形式為reg = ,其中的每一組address length表明了裝置使用的乙個位址範圍。

ø address為n個32位的整型所定義的乙個位址,n值由#address-cells

定義。ø length  為m個32位的整型所定義的乙個長度,m值由#size-cells

定義。address 和 length 欄位是可變長的,父結點的#address-cells和#size-cells分別決定了子結點的reg屬性的address和length欄位的長度。在本例中,父節點是root節點,

root結點的#address-cells= <1>;和#size-cells = <1>;決定了serial、gpio、spi等結點的address和length字段長度分別為1。

cpus 結點的#address-cells= <1>;和#size-cells = <0>;決定了2個cpu子結點的address為1,而length為空,於是形成了2個cpu的reg = <0>;和reg = <1>;。

external-bus結點的#address-cells = <2>和#size-cells =<1>;決定了其下的ethernet、i2c、flash的reg欄位形如reg =<0 0 0x1000>;、reg = <1 0 0x1000>;和reg = <2 0 0x4000000>;

注意:external-bus的父節點是root節點,所有external-bus本身的reg屬性還是遵守root節點的address-cells和#size-cells,而external-bus結點定義的#address-cells = <2>和#size-cells =<1>則是作用於其下的三個子節點ethernet、i2c、flash的reg欄位

其中,address字段長度為2,ethernet、i2c、flash三個裝置開始的第乙個cell(0、1、2)是對應的片選,第2個cell(0,0,0)是相對該片選的基位址,第3個cell(0x1000、0x1000、0x4000000)為length。(這個是對位址本身的解析,與語法無關,這個需要配合下面關於ranges的描述來理解。)

特別要留意的是i2c結點中定義的 #address-cells = <1>;和#size-cells = <0>;又作用到了i2c匯流排上連線的rtc,它的address欄位為0x58,是裝置的i2c位址。

root結點的子結點描述的是cpu的檢視,因此root子結點的address區域就直接位於cpu的memory區域。但是,經過匯流排橋後的address往往需要經過轉換才能對應的cpu的memory對映。external-bus的ranges屬性定義了經過external-bus橋後的位址範圍如何對映到cpu的memory區域。

[plain]

viewplain

copy

ranges = < 0 0

0x10100000

0x10000     // chipselect 1, ethernet  

1 00x10160000

0x10000     // chipselect 2, i2c controller  

2 00x30000000

0x1000000>; // chipselect 3, nor flash  

ranges

是位址轉換表,其中的每個專案是乙個子位址、父位址以及在子位址空間的大小的對映。對映表中的子位址、父位址分別採用子位址空間的#address-cells和父位址空間的#address-cells大小。對於本例而言,子位址空間的#address-cells為2,父位址空間的#address-cells值為1,因此00  0x10100000   0x10000的前2個cell為子位址external-bus後片選0上偏移0,第3個cell表示external-bus後片選0上偏移0的位址空間被對映到cpu的0x10100000位置,第4個cell表示對映的大小為0x10000。ranges的後面2個專案的含義可以類推。

intc:interrupt-controller@10140000 :  這裡intc相當於是interrupt-controller@10140000的名稱,別的裝置可以直接引用intc來替代interrupt-controller@10140000

device tree中還可以中斷連線資訊,對於中斷控制器而言,它提供如下屬性:

interrupt-controller – 這個屬性為空,中斷控制器應該加上此屬性表明自己的身份;

#interrupt-cells – 與#address-cells 和 #size-cells相似,它表明連線此中斷控制器的裝置的interrupts屬性的cell大小。

在keil中使用bdata型可位定址全域性變數

使用keil開發51微控制器下位機程式,希望使用dbata型全域性變數。首先了解一下51的片內ram.51微控制器中,片內ram分為data,bdata,和idata,data指前面0x00 0x7f 128個位元組。idata指的是0 0xff 這256個位元組儲存區。前128個位元組同data完...

Golang 可定址性 map和slice的區別

qishuai 關注 package main import fmt type person struct func main 2 person,3 person,編譯錯誤 cannot assign to struct field m 1 name in map m 1 name scrapup ...

硬碟定址的變換 硬碟大小在突破中前進

因為硬體 軟體設計上的缺陷,大容量硬碟曾在歷史上多次造成麻煩,最近一次硬碟容量問題出現在2.2tb身上,因此在開發windows 8 的時候,微軟就充分考慮了大容量硬碟的完整支援問題,以及新的4kb扇區格式。1,8g限制 硬碟定址的限制 硬碟最初使用的定址方法是柱面 磁頭 扇區chs cylinde...