设备树
.c文件中定义资源的缺陷在于,每次我们去修改资源,修改引脚的时候,都需要去重新编译驱动程序,重新安装驱动程序,后来引入了设备树
对应的程序中的结构,/为Root(根节点)
CPU、I2C控制器等都是设备树的子节点,AT24C02是I2C的子节点
使用设备树的原因:每款芯片都会有很多不同的单板使用它,这样子每个单板都有自己的资源.c文件,引脚不相同,需要重新编译和包含了大量无用的代码,所以采用配置文件的方式加入内核(DTS)
芯片厂家一般会提供一个基础的设备树xxx.dtsi,其他的单板A或单板B只需要include该文件,然后程序中可以引用相关设备的标签,来选择开启 或者关闭一些设备(如这里的uart0),只需要修改它们的状态就好,很多代码就都不用编写啦
设备树引入后的变化
(1)引入设备树后platform_device中 多了device_node结构体成员,用来描述设备树的节点
(2)platform_driver中多了 of_match_table,用来和设备树节点配对
(3)总线中的配对方式由三个增加为四个,增加了设备树的配对
(4)配对顺序:
1、非他不嫁
2、比较设备树信息
(1)of_match_table中含有compatible值,就跟dev(设备树中的节点)的compatile 属性比较,若一致则成功,否则返回失败;
(2)如果of_match_table中含有type值,就跟dev的device_type属性 比较,若一致则成功,否则返回失败
(3)如果of_match_table中含有name值,就跟dev的name属性比 较,若一致则成功,否则返回失败。
3、比较platform_device_id
4、最后比较名字
(5)内核对设备树的处理:
1、dts在PC机上被编译为dtb文件
2、u-boot把dtb文件传给内核
3、内核解析dtb文件,把每一个节点都转换为device_node节点
4、对于某些device_node结构体,会被转换为platform_device结构体
并不是所有的device_node都会被转换成platform_device
编译成dtb文件时,要分两部,先要用gcc编译成.o(包含了#include等C语言语法)
(6)哪些设备树节点会被转换为platform_device
1、根节点下含有compatile属性的子节点
2、含有特定compatile属性的节点的子节点 :"simple bus","simple-mfd","isa","arm,amba-bus"
3、总线I2C、SPI节点下的子节点:不转换为platform_device