设备树用于给内核中的驱动指定硬件信息。
和设备树有关的文件各式:
- 设备树文件:.dts
- 二进制的设备树文件:.dtb
- 设备树模板:.dtbi
设备树语法
首行
/文件版本/;
根节点
/
结点格式
[label: ]node_name[@unit_adress]{
[properties definitions]
[child nodes]
};
其中label可以省略。label是为了方便引用node。在根节点外可以用label或全路径引用lable,如:
方法一:
&label{
status = "new_definitions";
};
方法二:
&{/node_name[@unit_adress]}{
status = "new_definitions";
};
property可以为其赋值也可以不赋。若赋值,只能为以下三种形式或它们的组合,组合的形式用逗号隔开:
n个32位数据
带有结束符的字符串
n个字节
其各式分别为property1 = <17 0xc>;
property2 = “Hello”;
property3 = [00 aa bb 44];
property4 = <0x16>, “Bye”;
常用属性(property)
1.1 address
#address-cells = <n>;
address要用n个32位数表示
1.2 size
#size-cells = <m>;
size要用m个32位数表示
2.compatible
compatible = “A”, “B”, “C”;
兼容A、B、C驱动,驱动名常用”厂家名,模块名“这样的形式命名
3.model
model = “board1”;
当前设备的具体名称为board1。当两个设备的compatible相同时需要通过model区分设备
4.status
设备状态,有四种状态可选
“okay”:设备正常
“disabled”:设备不可操作
“fail”:设备发生了错误
“fail-message”:设备发生错误并注明了错误信息
5.reg
reg = <0x80000000 0x20000000>
寄存器地址用于描述一段空间,地址长度由根节点的的#address-cells和#size-cells决定
基本结点
1.根节点
有且仅有一个,所有结点都是根节点的子节点
2.cpus结点
CPU配置
3.memory结点
标明设备内存
4.chosen结点
向内核传入一些参数
设备树编译
make dtbs [V=1]
实例1
欲将GPIO1_IO09复用为PWM2
配置结点复用功能
确定要复用为PWM功能的引脚后,在arch/arm/boot/dts/imx6ul-pinfunc.h或imx6ull-pinfunc.h中找到其定义。有两个文件是因为两块开发板的重复内容放置在了imx6ul中,再由6ull引用。搜索得知其定义为MX6UL_PAD_GPIO1_IO09__PWM2_OUT
。定义格式为PAD NAME(可以理解为引脚的默认功能)+复用功能。
打开设备树文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts在&iomux结点下添加子节点
pinctrl_pwm2: pwm2grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO09__PWM2_OUT 0x110b0
>;
};
检查其他位置是否有GPIO1_IO09的复用,若有,将其他位置注释掉。检查时候要以PAD NAME作为搜索对象,对于GPIO1_IO09需要搜索GPIO1_IO09
和gpio1 9
两个内容。
配置PWM2的时钟
打开件arch/arm/boot/dts/imx6ull.dtsi
将PWM2结点上的clocks属性改为
clocks = <&clks IMX6UL_CLK_PWM2>, <&clks IMX6UL_CLK_PWM2>;
添加PWM2结点
在设备树文件中&pwm1结点下添加结点
&pwm2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm2>;
status = "okay";
};
编译并拷贝设备树
. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
make dtbs
scp arch/arm/boot/dts/imx6ull-elf\1-emmc.dtb root@192.168.0.232:/run/media/mmcblk1p1/
开发板测试
应用新设备树
sync
reboot
PWM功能测试
echo 0 > /sys/class/pwm/pwmchip1/export
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
echo 1000000 > /sys/class/pwm/pwmchip1/pwm0/period
echo 500000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable
实例2
复用CSI_HSYNC为PWM
找到其宏定义为MX6UL_PAD_CSI_HSYNC__PWM8_OUT