一、设备树节点的基本结构
设备树节点=一组属性的大括号集合,包含这些常用字段:
compatible:和驱动里的匹配字符串相同reg:物理编号/基地址(没有也可写<0>)status:启用状态,"okay"表示有效- 其它自定义属性,如
myparam、buffer-len等
二、添加新的设备树节点
1、找到主板 .dts 文件
泰山派3M-RK3576开发板的设备树文件在SDK中的:
TaishanPi-3-Linux/kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-3m-rk3576.dts
2、新增自定义节点
可直接放在根节点 **/ { ... }** 内部,也可以根据项目放在soc {}或合适的peripherals {}下。
c
/*-----------------------------------------------------------
* 板子基础信息配置
*----------------------------------------------------------*/
/ {
model = "LCKFB TaishanPi 3M RK3576 Board";
compatible = "lckfb,tspi-3m-rk3576", "rockchip,rk3576";
/*
* 用户LED
* 用于提示系统状态
*/
leds: leds {
status = "okay";
compatible = "gpio-leds";
work_led: work {
linux,default-trigger = "heartbeat";
gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
};
};
/*
* 自定义添加的mychardev设备节点
*/
mychardev: mychardev@0 {
compatible = "lckfb,mychardev"; // 驱动匹配字段
reg = <0x0>; // 寄存器地址,随意设定
buffer-len = <64>; // buff长度
dev-id = <0xFFA8>; // 预设设备ID
status = "okay";
};
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mychardev节点字段讲解:
mychardev:标签。被后续其他地方或 phandle 引用(可省略)。mychardev@0节点名,@0可为编号、基址等。compatible最关键,后续你的驱动将靠它与此节点自动关联。reg仅表示唯一标识,如无实际寄存器填<0x0>。buffer-len、dev-id等都可以自定义,随你需要。status = "okay"必须有,不然设备默认禁用。
三、编译验证
我们根据 Debian12内核编译 的教程,重新编译内核生成 boot.img,并单独烧录内核镜像的方式实现替换设备树。
烧录完成之后,板子开机,进行校验设备树节点:
查看解包后的设备树节点
bash
ls /sys/firmware/devicetree/base/mychardev@01
看到 buffer-len/dev-id/compatible 字段说明生效!
查看下 buffer-len 是不是我们设定的 64 大小:
bash
# 方法一:使用hexdump工具
hexdump -C /sys/firmware/devicetree/base/mychardev@0/buffer-len
# 方法二:使用python工具
python3 -c "print(int.from_bytes(open('/sys/firmware/devicetree/base/mychardev@0/buffer-len','rb').read(), 'big'))"1
2
3
4
5
2
3
4
5
说明:
buffer-len = <64>; 这个 <64> 存到 dtb 后相当于“4字节大端二进制”,而不是文本数字。
使用 python 可以解释称整数