/{ //根节点
node1{ //node1是节点名,是/的子节点
key=value; //node1的属性
...
node2{ //node2是node1的子节点
key=value; //node2的属性
...
};
}; //node1的描述到此为止
node3{
key=value;
...
};
};
实际使用过程中:
/{ //根节点
node1{ //node1是节点名,是/的子节点
key=value; //node1的属性
...
node2{ //node2是node1的子节点
key=value; //node2的属性
...
};
}; //node1的描述到此为止
node3{
key=value;
...
};
};
&node1{
};
设备树里面字符串表示
compatible = "comen,printer";
compatible = "comen,printer", "test1","test2";
32bit无符号整形数
test = <123>;
test = <0x123>;
test = <0x123 0x147 0x222>;
二进制数
test = [1a];
test = [1a 00 1b 1c];
节点名:
理论上节点名只要是长度不超过31个字符的ASCII字符串即可(一般按照C语言变量命令的方式就行),
此外Linux内核还约定节点名应写成形如<name>[@<unit_address>]的形式,其中name就是节点名,最长可以是31个字符长度。
unit_address一般是节点地址,用来唯一标识一个节点,下面就是典型节点名的写法:
rtc@6f {
compatible = "rtc,rtc-isl1208"; //这个是属性 包含等号的,都可以理解为节点里面的属性
reg = <0x6f>;
interrupt-parent = <&gpio5>;
interrupts = <30 3>;
};
注:Linux设备数存在一些特殊节点,如:
chosen:主要用来描述由系统指定的运行时的参数
aliases:定义别名
memory:描述内存。该节点里面的device_type 属性必须为 "memory"
memory {
device_type = "memory";
reg = <0x10000000 0x40000000>;
};
中断节点:
rtc@6f {
compatible = "rtc,rtc-isl1208"; //这个是属性 包含等号的,都可以理解为节点里面的属性
reg = <0x6f>; //寄存器
interrupt-parent = <&gpio5>; //中断属于哪一个中断控制器。如果没有这个,那么中断衣服改子节点的父节点
interrupts = <30 3>; //30中断标识符,对应具体的中断号。 3表示边沿触发。触发类型如下。
//int-gpios = <&gpio1 13 GPIO_ACTIVE_LOW>; //这种方式,也可以实现中断。这种是通过gpio_to_irq进行操作
};
#define IRQF_TRIGGER_NONE 0x00000000
#define IRQF_TRIGGER_RISING 0x00000001
#define IRQF_TRIGGER_FALLING 0x00000002
#define IRQF_TRIGGER_HIGH 0x00000004
#define IRQF_TRIGGER_LOW 0x00000008
&ecspi3 {
fsl,spi-num-chipselects = <1>; //SPI片选引脚
pinctrl-names = "default"; //这个属性,其一个注释的作用,在实际功能里面,不起左右
pinctrl-0 = <&pinctrl_ecspi3>; //配置SPI对应GPIO的功能,复用,上拉/下拉等
pinctrl-1 = <&pinctrl_pwm1>; //配置PWM对应GPIO的功能,复用,上拉/下拉等
status = "okay";
spi-max-frequency = <5000000>; //SPI的速度
motorenable-gpios = <&gpio4 30 0>; //GPIO口设置
motorpwm-id = <0>; //这里对应PWM1,代码里面从0开始计数,手册里面从1开始计数
// motorpwm-gpios = <&gpio4 29 0>; //GPIO口设置
latch-gpios = <&gpio4 24 0>; //GPIO口设置
paperover-gpios = <&gpio4 25 0>; //GPIO口设置
storageerr-gpios = <&gpio4 26 0>; //GPIO口设置
printheat-gpios = <&gpio4 27 0>; //GPIO口设置
motorsleep-gpios = <&gpio4 31 0>; //GPIO口设置
strobe1-gpios = <&gpio4 23 0>; //GPIO口设置
strobe2-gpios = <&gpio4 28 0>; //GPIO口设置
};
上面的 &ecspi3 的&地址符号,类似C++里面引用的意思。
&weim {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_weim_fpga_1 &pinctrl_weim_cs0_1>;
#address-cells = <2>; //表示地址用多少个32无符号位数来表示
#size-cells = <1>; //表示大小空间。用1个32位无符号整数来表示
ranges = <0 0 0x08000000 0x08000000>; //local_address(2) parent_address(1) address_size(1)
status = "okay";
fsl,weim-cs-gpr = <&gpr>;
comen-fpga@0,0 {
compatible = "comen-fpga";
reg = <0 0 0x08000000>; //地址是0,大小是0x08000000
#address-cells = <1>;
#size-cells = <1>;
bank-width = <2>;
// CSxGCR1 CSxGCR2 CSxRCR1 CSxRCR2 CSxWCR1 CSxWCR2
fsl,weim-cs-timing = <0x60123081 0x00000001 0x14015700 0x00000010 0x05640640 0x00000000>;
};
};
设备树里面正确描述gpio的方式及使用:
设备树里面描述gpio:gpios1 = <&gpio4 28 GPIO_ACTIVE_HIGH>; //gpio4_28引脚当作普通IO口使用,硬件上面,高有效
gpios1 = <&gpio4 28 GPIO_ACTIVE_LOW>; //gpio4_28引脚当作普通IO口使用,硬件上面,低有效
gpios1 = <&gpio4 28 GPIO_ACTIVE_HIGH>,<&gpio4 29 GPIO_ACTIVE_HIGH>; //两个GPIO一起描述
驱动里面获取GPIO的相关信息:
enable_gpio = of_get_named_gpio_flags(node, "gpios1", 0, &flags);
解释: node-设备树节点对应的句柄
gpios1-设备树节点GPIO对应的属性
0-对应GPIO属性里面的第0个描述
flags-保存对应IO口的GPIO_ACTIVE_HIGH/GPIO_ACTIVE_LOW属性