device tree

观看视频了解更多
参考文档

devicetree 描述linux 系统设备资源,将数据与逻辑分离。

  • DTS: device tree source 设备树源文件,dts 或 dtsi 后缀文件
  • DTB: dtc 工具将dts 文件编译后生成的dtb 文件,内核启动时用
  • dtc: 是一个c 语言写的工具,源码目录 linux_source/scripts/dtc/

uboot 在引导linux 启动时,将dtb文件导入内存,并将地址传给linux 内核。

dtb转换dts

查看最终生成的dts 设计

1
kernel_source/scripts/dtc/dtc -O dts -o vexp.dts arch/arm/boot/dts/vexpress-v2p-ca9.dtb 

调试接口

  • sysfs 节点: /sys/firmware/devicetree ,内核解析后的设备数据
  • dtb 文件:/sys/firmware/fdt , 原始dtb 内容

内核解析流程

  1. 内核启动解析dtb 流程

    1
    2
    3
    4
    5
    6
    7
    start_kernel()    //init/main.c
    {
    setup_arch () //init/main.c
    {
    unflatten_device_tree() //driver/of/fdt.c
    }
    }
  2. sys/firmware/devicetree 节点生成

1
2
3
4
5
6
7
8
9
10
do_basic_setup()  //  init/main.c
{
driver_init() // driver/base/init.c
{
of_core_init() // driver/of/base.c
{
kset_create_and_add("devicetree", NULL, firmware_kobj);
}
}
}

devicetree 练习

针对dts 设计有单元测试,可以采用这里的内容练习devicetree 的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// driver/of/unittest.c
static int __init of_unittest(void)
{
struct device_node *np;
int res;
/*
...
...
...
...
*/

np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a");
if (!np) {
pr_info("No testcase data in device tree; not running tests\n");
return 0;
}
of_node_put(np);

of_unittest_check_tree_linkage();
of_unittest_check_phandles();
of_unittest_find_node_by_name();

late_initcall(of_unittest);