内核设备树简介-1

设备树:用于实现驱动代码与设备信息相分离。引入设备树之后,驱动代码只负责处理驱动的逻辑,关于设备的具体信息存放到设备树文件中。
如果只是发生硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者是需要修改设备树文件信息,不需要改写驱动代码。
一:设备树框架
  1. 每个设备树文件都有一个根节点,每个设备都是一个节点;
  2. 节点间可以嵌套,形成父子关系,这样就可以方便的描述设备间的关系;
  3. 每个设备的属性都是用一组 key-value对(键值对)来描述,并以;结束。
基本框架如下:
/{ //根节点
node1{ //node1是节点名,是 / 的子节点
key=value; //node1 的属性
...
node2{ //node2是node1的子节点
key=value; //node2的属性
...
}
} //node1结束
node3{ // node3是 根节点/ 的子节点
key=value;
...
}
}
一般来说,/表示板子,它的子节点node1表示soc上的某个控制器,控制器的子节点node2表示挂接在这个控制器上的设备。
设备树中结点的命名,遵循形式为:                                              
<name> [@unit-address]
    <name>描述结点对应的设备类型,是必选项
    [@unit-address]是可选项,如果一个结点描述的设备有地址,则应该给出 @unit-address;
二:设备树常用属性
1.Compatible属性:
compatible属性定义了系统的名称,组织形式为 “<manufacturer>,<model>” (制造厂商,模型);
在.dts文件中的每个设备,都有一个compatible属性,compatible属性是驱动与设备的绑定;
compatible属性是一个字符串列表,列表中的第一个字符串表征了结点代表的确切设备,形式为“<manufacturer>,<model>,后面的字符串表征了可兼容的其它设备,可以说第一个是特指,后面的是泛指,涵盖更广的范围;
2.可寻址设备在设备树中的编码地址信息-----在设备树中,cell表示32位的整型
reg
#address-cells
#size-cells
reg的组织形式为 reg=<address 1 length 1 [address 2 length 2] [address 3 length 3]......>,其中,address为 一个或多个 32位的整形,即cell,length则为cell的列表或者为空,当#size-cell=0时,length 就为空;
父节点的#address-cell和#size-cell分别决定了子节点的reg属性的address和length字段的长度;
3.ranges属性
ranges--有些设备是有片选的,所以需要描述片选和片选的偏移量,在地址说明的时候还要说明地址映射范围;
ranges是地址转换表,其中每个项目是--子地址,父地址,以及子地址空间的大小的映射;
映射表中的子地址与父地址分别采用 子地址空间的#address-cells和父地址空间的#address-cells大小。
举例:
子地址#address-cells=2
父地址#address-cells=1
ranges =<  0  0   0x10100000  0x1000
  1  0   0x10160000  0x1000
    2  0   0x30000000  0x10000000>;
由子地址 #address-cells=2,其中,
第一列 : 0 1 2表示对应的 片选;
第二列 : 0 0 0表示相对该片选的 基地址;
父地址 #address-cells=1,
第三列 :片选0上偏移地址0的地址空间被映射到父地址的0x10100000位置;
  片选1上偏移地址0的地址空间被映射到父地址的0x10160000位置;
 片选2上偏移地址0的地址空间被映射到父地址的0x30000000位置;
第四列:表示映射的大小为0x1000;
4.中断
interrupt-controller属性--表明该设备是不是作为中断控制器,此属性为空,中断控制器应该加上此属性来表明自己的身份;
#interrupt-cells属性---表明连接此中断控制器的设备的中断属性的cell大小;
interrupt-parent属性---设备结点通过此属性来指定所依附的中断控制器的处理方式,当结点没有指定interrupt-parent属性时,则从父节点继承;
interrupts属性-----------用到了中断的设备结点,透过此属性指定中断号,触发方法等,具体interrupt属性有多少个cell值,由它所依附的中断控制器结点的  #interrupt-cells 属性决定;
  具体每个cell是什么含义,一般由驱动实现决定,也会在device tree的binding文档中说明。
例如:ARM GIC控制器而言, #interrupt-cells为3,具体每个cell的含义参见 Document/devicetree/bingings/arm/gic.txt文档
#interrupt-cells=3,第一个cell表示  “中断类型”---0是SPI中断,1是PPI中断;
        第二个cell表示  “ 中断类型的中断号”,SPI中断是[0-987],PPI中断是[0-15];
        第三个cell表示  “中断标志;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值