设备树 Device Tree
设备树是一种描述硬件信息的文件格式。
设备树实现了驱动代码与硬件设备信息的分离,驱动代码可以有很多,但是不一定每个设备都要用。在设备树中配置了启用哪些设备,和一些关于设备的配置,比如说中断号是多少、内存地址是哪里。就能与驱动代码分离开,即便是不用板子的外设,只要型号一致就能用同一份驱动。其他的尽量做成可配置的。
设备树的加载流程
Uboot将设备树的地址传给 Linux内核
bootm <uImage_addr> <initrd_addr> <dtb_addr>
start_kernel
是内核进入C环境调用的第一个函数,不久后便会调用dtb的解析。
start_kernel()
=> setup_arch(&command_line);
=> setup_machine_fdt(__fdt_pointer);
__fdt_pointer 是在汇编中赋值的,存储由Uboot传来的fdt地址。
/*
* Preserve the arguments passed by the bootloader in x0 .. x3
*/
SYM_CODE_START_LOCAL(preserve_boot_args)
mov x21, x0 // x21=FDT
adr_l x0, boot_args // record the contents of
stp x21, x1, [x0] // x0 .. x3 at kernel entry
stp x2, x3, [x0, #16]
dmb sy // needed before dc ivac with
// MMU off
mov x1, #0x20 // 4 x 8 bytes
b __inval_dcache_area // tail call
SYM_CODE_END(preserve_boot_args)
...
str_l x21, __fdt_pointer, x5 // Save FDT pointer
TBD:继续分析 setup_machine_fdt()
?
设备树调试
查看原始的dtb文件
ls /sys/firmware/fdt
hexdump -C /sys/firmware/fdt
查看设备树信息。以目录结构程现的dtb文件, 根节点对应base目录, 每一个节点对应一个目录, 每一个属性对应一个文件 /proc/device-tree 是链接文件, 指向 /sys/firmware/devicetree/base
ls /sys/firmware/devicetree
ls /proc/device-tree
查看所有硬件信息。系统中所有的platform_device, 有来自设备树的, 也有来有.c文件中注册的。
ls /sys/devices/platform