ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设备树(一)

2021-05-15 21:29:16  阅读:164  来源: 互联网

标签:node dts 总线 platform device 节点 设备


1. 概念

Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。  
 

2. 设备树存在的意义

1)内核不再包含对硬件的描述,它以二进制的形式单独存储在另外的位置:the device tree blob
2)bootloader需要加载两个二进制文件:内核镜像和DTB
3)bootloader通过r2寄存器来传递DTB地址,通过修改DTB可以修改内存信息,kernel command line,以及潜在的其它信息。

补充:uboot在启动内核的过程中会将bootargs放到设备树的chosen子节点中。

 

3. 编译

Linux 内核中提供了设备树文件的编译工具dtc(device tree compile),可以单独使用dtc编译设备树文件。

3.1 单独编译dts

./dtc -I dts -O dtb -o B.dtb A.dts        //把A.dts编译生成B.dtb

3.2 在项目工程中编译

在工程管理文件中,也是调用dtc工具来编译设备树文件,只是它会编译很多设备树文件,具体链接(使用的哪一个dtb文件)的哪一个,要看Makefile、shell等工程管理的脚本。

如果此时手中有编译好的镜像,可以烧录镜像启动,通过打印来确定:

1> 板子启动后,在串口终端使用命令:dmesg | grep "Machine:"
2> 搜索出来的内容即板子对应使用的 dts 文件根目录下的 model 属性或者 compatible 属性。
3> 在源码 arch/arm/boot/dts 目录下搜索上面得到的字符串,对应的文件即板子正在使用的 dts 文件

4. device_node

内核中使用device_node结构体来描述一个节点,驱动使用OF函数的各种API来获取device_node结构体。

对于platform驱动而言,device_node结构体的信息已经在platform_device里,具体在platform_device->dev->of_node,所以可以不使用OF函数来获取设备节点,platform和OF都提供了很多操作device_node的接口,所以使用哪一种看个人爱好。

 

5. 内核对dtb的处理

5.1 dtb转化为device_node

内核在启动过程中会扫描并解析dtb文件,将节点组织成一个由device_node结构连接而成的单向链表。

它把DTS中描述的节点(status = okay的)注册到kernel中,我们可以认为DTS中写的每一个节点在这里都被解析为一个device_node

5.2 哪些device_node会被转化为platform_device

dts文件编译成为dtb文件之后供给内核解析,设备树中的每个节点都会转化为device_node节点,其中满足某些条件的节点将会被转化为platform_device节点,只需包含下面的任意一个条件就能转化为platform_device节点:

1.根节点下的含有compatible属性的子节点;
2.如果节点中的compatible属性包含了"simple-bus"或者"simple-mdf"或者"isa"或者"arm,amba-bus",并且该节点的子节点包含compatible属性,那么该子节点就能转化为platform_device
节点(IIC、SPI节点下的子节点即使满足条件也不应被转化为platform_device节点,应该交由对应的总线驱动程序去处理,而不是platform总线)。

补充:其它bus(即除了platform bus以外的总线)上的device,其bus应该具备动态枚举设备的能力,在相应的probe函数中遍历设备节点。只有platform_device,才一开机就存在,我猜测之所以这样,是因为platform bus是为一个虚拟的总线,而其它总线是实际存在的。

5.3 platform_device的注册

在定义machine_desc结构体的时候,会定义一个回调函数:xxxx_init(大部分情况),就是这个xxxx_init把platform_device都注册起来的。

 

6. 匹配机制

6.1 kernel-单板匹配

设备树根节点下的cpmpatible属性值和 kernel 中的DT_MACHINE_START结构体里的dt_compat列表进行匹配,如果匹配上则表明kernel支持当前开发板。

6.2 驱动-设备匹配

设备节点中的cpmpatible属性值和驱动中的of_match_table列表进行匹配。

 

7. 总结

从dts文件的内容来看,系统平台上挂载了很多总线,i2c,spi,uart等等,每一个总线都被描述为一个节点,Linux启动到kernel 入口后,会执行以下操作来加载系统平台上的总线和设备:start_kernel() ==> setup_arch() ==> unflatten_device_tree(),执行完unflatten_device_tree()后,dts的节点信息被解析出来,保存到allnodes链表中。随后启动到board文件时,调用.init_machine,再调用of_platform_populate(....)接口,加载平台总线和平台设备。至此,系统平台上的所有已配置的总线和设备将被注册到系统中。(对这句话更加正确的解释是:此时所说的设备指的是platform device,此时的总线指的是i2c,spi等,因为i2c总线和spi总线可以理解为注册在platform总线上的device)

标签:node,dts,总线,platform,device,节点,设备
来源: https://blog.csdn.net/qq_41076734/article/details/116798817

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有