可寻址的设备在Device Tree中编码地址信息

一个双核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 plaincopy

1.  / {  

2.      compatible = "acme,coyotes-revenge";  

3.      #address-cells = <1>;  

4.      #size-cells = <1>;  

5.      interrupt-parent = <&intc>;  

6.    

7.      cpus {  

8.          #address-cells = <1>;  

9.          #size-cells = <0>;  

10.         cpu@0 {  

11.             compatible = "arm,cortex-a9";  

12.             reg = <0>;  

13.         };  

14.         cpu@1 {  

15.             compatible = "arm,cortex-a9";  

16.             reg = <1>;  

17.         };  

18.     };  

19.   

20.     serial@101f0000 {  

21.         compatible = "arm,pl011";  

22.         reg = <0x101f0000 0x1000 >;  

23.         interrupts = < 1 0 >;  

24.     };  

25.   

26.     serial@101f2000 {  

27.         compatible = "arm,pl011";  

28.         reg = <0x101f2000 0x1000 >;  

29.         interrupts = < 2 0 >;  

30.     };  

31.   

32.     gpio@101f3000 {  

33.         compatible = "arm,pl061";  

34.         reg = <0x101f3000 0x1000  

35.                0x101f4000 0x0010>;  

36.         interrupts = < 3 0 >;  

37.     };  

38.   

39.     intc: interrupt-controller@10140000 {  

40.         compatible = "arm,pl190";  

41.         reg = <0x10140000 0x1000 >;  

42.         interrupt-controller;  

43.         #interrupt-cells = <2>;  

44.     };  

45.   

46.     spi@10115000 {  

47.         compatible = "arm,pl022";  

48.         reg = <0x10115000 0x1000 >;  

49.         interrupts = < 4 0 >;  

50.     };  

51.   

52.     external-bus {  

53.         #address-cells = <2>  

54.         #size-cells = <1>;  

55.         ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet  

56.                   1 0  0x10160000   0x10000     // Chipselect 2, i2c controller  

57.                   2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash  

58.   

59.         ethernet@0,0 {  

60.             compatible = "smc,smc91c111";  

61.             reg = <0 0 0x1000>;  

62.             interrupts = < 5 2 >;  

63.         };  

64.   

65.         i2c@1,0 {  

66.             compatible = "acme,a1234-i2c-bus";  

67.             #address-cells = <1>;  

68.             #size-cells = <0>;  

69.             reg = <1 0 0x1000>;  

70.             interrupts = < 6 2 >;  

71.             rtc@58 {  

72.                 compatible = "maxim,ds1338";  

73.                 reg = <58>;  

74.                 interrupts = < 7 3 >;  

75.             };  

76.         };  

77.   

78.         flash@2,0 {  

79.             compatible = "samsung,k8f1315ebm", "cfi-flash";  

80.             reg = <2 0 0x4000000>;  

81.         };  

82.     };  

83. };  

 

 

可寻址的设备使用如下信息来在DeviceTree中编码地址信息:

l     reg

l     #address-cells

l     #size-cells

           其中reg的组织形式为reg = <address1 length1 [address2 length2] [address3 length3] ...>,其中的每一组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] viewplaincopy

  1. ranges = < 0 0  0x10100000   0x10000     // Chipselect 1, Ethernet  
  2.                 1 0  0x10160000   0x10000     // Chipselect 2, i2c controller  
  3.                 2 0  0x30000000   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大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值