/dts-v1/;
/ {
model = "MyDevice";
compatible = "mycompany, mydevice-1.0";
gpio-controller;
#gpio-cells = <2>;
leds {
compatible = "gpio-leds";
led1 {
label = "My LED 1";
gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
};
led2 {
label = "My LED 2";
gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
};
};
gpio-keys {
#address-cells = <1>;
#size-cells = <0>;
compatible = "gpio-keys";
button1 {
label = "My Button 1";
gpios = <&gpio2 3 GPIO_ACTIVE_LOW>;
debounce-interval = <20>;
};
button2 {
label = "My Button 2";
gpios = <&gpio3 4 GPIO_ACTIVE_LOW>;
debounce-interval = <20>;
};
};
};
这个设备树描述了一个包含 2 个 LED 和 2 个按钮的设备,其中每个 LED 和按钮都使用一个 GPIO 引脚。在这个设备树中,我们定义了两个节点:leds
和gpio-keys
。在leds
节点中,我们定义了两个LED节点:led1
和led2
,它们分别连接到GPIO0.0和GPIO1.1引脚。在gpio-keys
节点中,我们定义了两个按钮节点:button1
和button2
,它们分别连接到GPIO2.3和GPIO3.4引脚,并设置了消抖时间为20毫秒。
注意,在这个设备树中,我们通过 gpio-controller
标记来告诉Linux内核这是一个GPIO控制器节点,并通过#gpio-cells
属性告诉内核每个GPIO的描述需要2个整数值(一个用于标识GPIO控制器,另一个用于标识GPIO编号)。
在Linux设备树中,GPIO节点通常包含以下信息:
compatible
:指定GPIO控制器的兼容性字符串,用于匹配驱动程序。gpio-controller
:指定该节点为GPIO控制器。#gpio-cells
:指定GPIO单元的数量。通常是2个或3个。如果有3个,则第一个单元表示GPIO的偏移量,第二个单元表示标志(如输入、输出、上拉等),第三个单元表示中断处理程序所需的GPIO号码。reg
:指定GPIO控制器的地址范围。gpio: gpio@e000a000 { compatible = "xlnx,xps-gpio-1.00.a"; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; reg = <0xe000a000 0x1000>; gpio-leds { compatible = "gpio-leds"; led0 { gpios = <&gpio 0 0>; label = "led0"; }; led1 { gpios = <&gpio 0 1>; label = "led1"; }; }; button { compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; button@0 { label = "button0"; gpios = <&gpio 0 4 GPIO_ACTIVE_LOW>; linux,code = <64>; }; }; };
在这个例子中,
gpio
节点定义了一个GPIO控制器,具有xlnx,xps-gpio-1.00.a
的兼容性字符串。该节点还指定了2个GPIO单元,用于表示GPIO的偏移量和标志。此外,这个GPIO控制器还被设置为中断控制器,并指定了2个中断单元。在该节点下,还定义了两个子节点:
gpio-leds
和button
。其中,gpio-leds
节点使用 “gpio-leds” 驱动来支持LED灯输出控制,它定义了两个子节点(led0和led1),每个子节点都连接到特定的GPIO引脚上。另一个子节点button
使用“gpio-keys”驱动程序来支持按钮输入,并定义了一个名为button0
的子节点,连接到特定的GPIO引脚上。此外,linux,code
属性指定了当按下此按钮时应发送到用户空间的键码值。