设备树dts属性介绍
DTS标准属性介绍
compatible
compatible属性是为了与驱动文件想匹配。假设某驱动的platform_driver中的compatible与设备树某节点的compatible一致,那么它们就会被关联起来。
compatible = "fsl,mpc8641", "ns16550";
属性值是字符串列表,推荐命名是"厂家,型号",像上面有多个字符串,匹配时是从左到右,假设没有"fsl,mpc8641"与之匹配,就会寻找"ns16550";假设找到"fsl,mpc8641",就相互匹配,就不会再找"ns16550"。
model
model = "fsl,MPC8349EMITX";
设备的名字,字符串类型,推荐命名规则与compatible相同;
假设有两块板子ss101和ss102,它们的compatible = “ss,10x”;那么model就可以有它的作用。
model ="ss101";
model ="ss102";
phandle
pic@10000000 {
phandle = <1>;
};
another-device-node {
interrupt-parent = <1>;//引用pic节点
};
phandle是一个标识符,u32类型,一般由编译器全局分配唯一标识,以便引用其它节点引用。
ss:ss@132{
compatible="ss";
};
<&ss>={
model="ss";
};
&ss会被转换为ss节点的phandle,以便引用ss节点。
status
my_led{
compatible="ss,led";
pinctrl-names = "default";
pinctrl-0 = <&my_pinctrl_leds>;
led-gpios= < &gpio5 3 GPIO_ACTIVE_LOW>;
status="disalbe"
};
上面例子用来指示不适用这个节点。
Value | Description |
---|---|
“okay” | 表示设备正常运行(默认) |
“disabled” | 指示设备目前不能运行,但将来可能会运行(例如,某些东西没有插入或关闭)。 |
“reserved” | 指示设备正在运行,但不应该使用。这通常用于由另一个软件组件(如平台固件)控制的设备。 |
“fail” | 设备未运行。在设备中检测到一个严重的错误,如果不进行修复,它不太可能开始运行。 |
“fail-sss” | 设备未运行。在设备中检测到一个严重的错误,如果不进行修复,它不太可能开始运行。该值的sss部分是特定于设备的,指示检测到的错误情况。 |
#address-cells and #size-cells
两者分别指示某些属性用多少个32位数字表示地址和分配的空间大小,例如"reg"。如果节点没有这个属性,则继承父节点的,以此类推。
soc {
#address-cells = <1>;
#size-cells = <1>;
serial@4600 {
compatible = "ns16550";
reg = <0x4600 0x100>;
clock-frequency = <0>;
interrupts = <0xA 0x8>;
interrupt-parent = <&ipic>;
};
上面代码中0x4600表示地址,0x100表示大小。
reg
类型:(地址,长度)组成的队的数组。
reg属性描述由其父总线定义的地址空间内设备资源的地址。这通常意味着内存映射的IO寄存器块的偏移量和长度,但在某些总线类型上可能有不同的含义。根节点定义的地址空间中的地址为CPU实地址。
假设片上系统中的设备有两个寄存器块,一个32字节块位于SOC中的偏移量0x3000,一个256字节块位于偏移量0xFE00。reg属性将编码如下(假设#address-cells和#size-cells的值1):
reg = <0x3000 0x20 0xFE00 0x100>;
virtual-reg
virtual-reg属性指定一个有效地址,该地址映射到设备节点的reg属性中指定的第一个物理地址,就是reg属性的偏移地址的真实物理地址。此属性使引导程序能够向客户端程序提供已设置的虚拟到物理映射。
例子:
mpsc@8000 {
compatible = "marvell,mv64360-mpsc";
reg = <0x8000 0x38>;
virtual-reg = <0xf1008000>;
interrupt-parent = <&PIC>;
};
UART2: serial@ef600500 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600500 0x00000008>;
virtual-reg = <0xef600500>;
clock-frequency = <0>;
current-speed = <0>;
interrupt-parent = <&UIC0>;
interrupts = <0x3 0x4>;
status = "disabled";
};
ranges
类型:或被编码为任意数目的(子总线地址, 父总线地址, 长度)三元组。
ranges是用来子总线与父总线的映射关系的。
子总线地址 | 子节点的起始的物理地址( #address-cells) |
---|---|
父总线地址 | 父总线物理地址起始( #address-cells) |
长度 | 空间大小( #address-cells) |
例子:
soc {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0x0 0xe0000000 0x00100000>;
serial@4600 {
device_type = "serial";
compatible = "ns16550";
reg = <0x4600 0x100>;
clock-frequency = <0>;
interrupts = <0xA 0x8>;
interrupt-parent = <&ipic>;
};
};
ranges = <0x0 0xe0000000 0x00100000>;此属性值指定对于1024 KB范围的地址空间,子节点在物理位置寻址。0x0映射到物理地址0xe0000000的父地址。
使用此映射,串行设备节点可以通过地址0xe0004600的加载或存储来寻址,偏移量为0x4600(在reg中指定)加上在ranges中指定的0xe0000000映射。
中断属性
#interrupt-cells
指定由多少个32位数字表示一个中断。
interrupt-controller
属性值为空,表示这是一个中断控制器。
interrupt-parent
指示该级中断的父节点中断是哪个,也可以理解为受哪个中断控制器管理。
interrupts
指定用的是哪个中断,还有触发类型,用多少位数字表示受上级中断控制器的#interrupt-cells 管理。
例子:
sii902x: sii902x@39 {
compatible = "SiI,sii902x";
interrupt-parent = <&gpio1>;
interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
};
gpio1: gpio@0209c000 {
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
interrupt-controller;
#interrupt-cells = <2>;
interrupt-parent = <&gpc>;
};
gpc: gpc@020dc000 {
compatible = "fsl,imx6ul-gpc", "fsl,imx6q-gpc";
reg = <0x020dc000 0x4000>;
interrupt-controller;
#interrupt-cells = <3>;
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
fsl,mf-mix-wakeup-irq = <0xfc00000 0x7d00 0x0 0x1400640>;
};
intc: interrupt-controller@00a01000 {
compatible = "arm,cortex-a7-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x00a01000 0x1000>,
<0x00a02000 0x100>;
};
sii902x的上级中断是gpio1,gpio1中#interrupt-cells = <2>,所以再sii902x中interrupts用2个32位数字表示,其中18表示用哪个中断,IRQ_TYPE_EDGE_FALLING表示触发方式。
gpio1的上级中断是gpc,gpc中#interrupt-cells = <3>,所以gpio1中interrupts用3个32位数字表示,其中GIC_SPI表示共享中断(在多核处理器上有些中断是某个cpu特有的),66表示用哪个中断,IRQ_TYPE_LEVEL_HIGH表示触发方式;interrupt-controller表示gpio1是个中断控制器。
剩下的依次类推。
interrupts-extended
它的功能相当于interrupt-parent和interrupts的结合;
interrupt-parent = <&gpio1>;
interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
/***********************/
interrupts-extended=<&gpio1 18 IRQ_TYPE_EDGE_FALLING>
gpio常用属性
#gpio-cells
类型:u32
指定用多少个32位的数字描述引脚。
gpio-controller
表明是gpio控制器,空类型;
< name >-gpios
< name >-gpios是用来指定用到了哪些引脚的,其中name是自己命名的,再驱动程序中可以通过name获取到gpio资源,也可以直接gpios=<&gpio1 1 GPIO_ACTIVE_LOW>,不定义名称。
例子:
my_led{
compatible="ss,led";
pinctrl-names = "default";
pinctrl-0 = <&my_pinctrl_leds>;
led-gpios= <&gpio1 1 GPIO_ACTIVE_LOW
&gpio4 3 GPIO_ACTIVE_LOW
&gpio5 3 GPIO_ACTIVE_LOW>;
};
gpio1: gpio@0209c000 {
compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
reg = <0x0209c000 0x4000>;
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
gpio1控制器中#gpio-cells = <2>,所以my_led中用2个数字表示一个引脚,&gpio1表示使用gpio1控制器,1表示gpio1_1引脚,GPIO_ACTIVE_LOW表示低电平为逻辑1。
ngpios
gpio-controller@00000000 {
compatible = "foo";
reg = <0x00000000 0x1000>;
gpio-controller;
#gpio-cells = <2>;
ngpios = <18>;
}
假设某个gpio组中只有gpio0~gpio17,就可以在设备树中使用ngpios = <18>通知驱动程序只有某gpio组前18个引脚是有效的。
gpio-line-names
一个字符串数组,用于定义从接口输出的GPIO线的名称GPIO控制器,该名称应该是最有意义的生产者名称对于系统来说.
gpio@8000e100 {
/* GPIOs 128 - 159 */
gpio-line-names = "", "", "", "", "", "", "", "",
"", "", "",
"DIPRO_INT", /* GPIO139 */
"XSHUTDOWN_SECONDARY_SENSOR",
"XSHUTDOWN_PRIMARY_SENSOR",
"NFC_RST (NFC_CTRL_",
"TOUCH_RST",
"NFC_IRQ (NFC_CTRL_1)",
"HAL_SW",
"TOUCH_RST2",
"", "",
"VAUDIO_HF_EN", /* GPIO149 */
"", "", "", "", "", "", "", "", "", "";
};
gpio-hog
锁定gpio引脚的作用,基本上 gpio-hog 属性告诉 Controller 在启动期间将引脚设置为高电平/低电平,并且没有其他驱动程序/用户空间会请求它。
如果你打算在用户空间使用 gpio,你不应该使用 gpio-hog。
可以选择input,output-low,output-high
例子:
qe_pio_a: gpio-controller@1400 {
compatible = "fsl,qe-pario-bank-a", "fsl,qe-pario-bank";
reg = <0x1400 0x18>;
gpio-controller;
#gpio-cells = <2>;
line_b {
gpio-hog;
gpios = <6 0>;
output-low;
line-name = "foo-bar-gpio";
};
};
gpio-ranges
用于gpio与pinctrl设置之间的匹配。
qe_pio_e: gpio-controller@1460 {
#gpio-cells = <2>;
compatible = "fsl,qe-pario-bank-e", "fsl,qe-pario-bank";
reg = <0x1460 0x18>;
gpio-controller;
gpio-ranges = <&pinctrl1 0 20 10>, <&pinctrl2 10 50 20>;
};
gpio0-gpio10路由至pinctrl1的20-29;
gpio-ranges-group-names
gpio-ranges后面两位为0,才可以使用gpio-ranges-group-names。
gpio-ranges = <&iomux 0 0 0>;
gpio-ranges-group-names = "gpiob";