Arm Linux设备树学习笔记1


一开始初学设备树,碰到问题如下:
第一:什么是设备树
第二:设备树的语法
第三:设备驱动是怎样和设备树进行交互的

什么是设备树

设备树概念百度都有,这里不BB了。我没有经历过ARM Linux从平台文件到设备树的变迁,作为一个初学者,我对设备树的理解不深,我个人的理解就是:设备树是一个描述文件,设备模型中说了,device是"有什么用"的存在,"driver"是“怎么用”,我们把设备信息写进设备树,Linux就可以自动对设备树进行解析,把"有什么用"的信息提取出来作为一个device,这就是设备树。
一开始我觉得很奇怪,设备树不是脱了裤子放屁吗,device Linux已经有详细的标准的,即使没有设备树也能正常挂载device和driver,何必这么复杂又弄出来个设备树。
后面我慢慢理解了一点,之所以使用设备树的原因是:方便,代码量少。

设备树的语法

一个节点的结构体为

[label:] node-name[@unit-address] {
   [properties definitions]
   [child nodes]
}

分为设备树自带的属性,和自定义属性。
属性值是text string或者string list,用双引号表示。例如device_type = “memory”
属性值是32bit unsigned integers,用尖括号表示。例如#size-cells = <1>
属性值是binary data,用方括号表示。例如binary-property = [0x01 0x23 0x45 0x67]

设备驱动是怎样和设备树进行交互的

这里分享三篇我认为讲的非常好的,从源码上分析设备树的转换过程。

https://www.cnblogs.com/downey-blog/p/10485596.html
https://www.cnblogs.com/downey-blog/p/10486568.html
https://www.cnblogs.com/downey-blog/p/10519317.html

大概意思我概括以下,设备树下所有节点,设备树下所有节点,设备树下所有节点都被转换(解析)为device_node,各节点的信息被保存在device_node里(也有特殊情况,我没遇到过这里不讲了)。其实如果你对设备模型的源码有一定的了解的话,讲到device_node就已经懂了。

device下有一成员变量device_node *of_node,解析完后,of_node会被指向device_node,然后在driver里就可以调用各种of函数进行解析。所以在驱动的匹配函数源码中都有一句获取of_node的语句,为的就是获取设备树子节点的指针,从而提取出信息。

platform_device也是如此,通过获取platform_device里的device指针里的device_node指针,同样可以完成解析。

另外引出一个问题,在某些老的驱动中,会在平台或者板级文件中给添加resource信息,接着用在驱动中用platform_get_resource(pdev, IORESOURCE_MEM, 0),获取resource信息。

但是在新的驱动中,并没有上面平台或者板级文件添加resource信息,而只有platform_get_resource(pdev, IORESOURCE_MEM, 0),当然驱动也能成功获取到resource信息。
这样因为设备树最后被转化成platform_device,而在生成platform_device的函数里,对device_nodereg,irq等属性直接生成了resource信息。

通过上面那三篇博客,我的疑惑大部分被解决了,不需要对源码过度的深究,只需要了解工作机制即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值