设备树

设备树
参考:https://www.pianshen.com/article/428276673/
基本概念:
设备数是一种描述硬件的数据结构
DTS:是一个文本形式的文件,用于描述硬件信息,包括CPU的数量和类别、内存基地址和大小、中断控制器、总线和桥、外设、时钟和GPIO控制器等。
DTSI:把soc公用的部分或者多个设备共同的部分提炼为dtsi,类似于c语言的头文件
DTB:是一个二进制形式的文件,由linux内核识别,为其中的设备匹配合适的驱动程序。
DTC:将DTS编译成DTB
bootloader:不同的设备会有不同的machine id,uboot在启动Linux内核的时候会将machine id存放到r1寄存器,Linux启动时会匹配bootloader传递的machine id和machine start声明的machine id,然后执行相应设备的一系列初始化函数。

图0

图1

linux内核启动以后,先解析并注册dts中的设备,然后再注册驱动,比较驱动中的compatible 属性和设备中的compatible 属性,或者比较两者的name属性,如果一致则匹配成功。
1、解析dtb
在start_kernel() --> setup_arch(0 --> unflatten_device_tree() --> __unflatten_device_tree()函数中扫描dtb,并转换成节点是device_node的树状结构。
2、注册dts设备
imx6q_init_machine() --> of_platform_populate()。
在of_platform_populate()中循环扫描根节点下的各节点
调用of_platform_device_create_pdata() —> of_device_add() 注册设备并添加到对应的链表中。
3、注册驱动
图2

4、匹配设备
追踪driver_register()函数,driver_register() --> bus_add_driver() --> driver_attach() --> __driver_attach
寻找匹配的设备,匹配成功则执行驱动的probe函数

根节点的兼容性
Linux内核根据根节点‘/’的兼容属性可以判断启动什么设备

图3

设备节点的兼容性
在.dts文件中的每一个设备节点都有一个兼容属性,用于驱动和设备之间的绑定。
图4

兼容性的设置都是从具体到抽象
使用设备树之后,驱动需要与.dts中描述的设备节点进行匹配,从而使驱动的probe()函数执行,对于platform_driver,需要添加一个OF匹配表(competible)
图5

而Linux内核常用如下API来判断具体设备是什么:
int of_device_is_compatible(const struct device_node *device,const char *compat);
此函数用于判断设备节点的 兼容属性是否含有compat指定的字符串,能让一个驱动至此两个以上设备。

设备树中中断的连接
要声明controller属性和cells大小

你可能感兴趣的:(设备树)