如下,添加对应的dts即可。然后在/sys/class/leds下面,就有对应的led控制条目了
# ls /sys/class/leds
led_internet_orange led_iot led_sys_white
led_internet_white led_sys_orange
首先,pinctrl需要配置对应的pin脚,把功能配置为gpio。在内核GPIO系统中,pinctrl用来控制pin,一个gpio脚可以做多个用途,比如作为mdio引脚,在芯片内部有一个mux开关,来控制gpio引脚的用途。因此需要在pinctrl的dts里面,将引脚设置为gpio功能。
其次,对于leds,只要添加标准的leds节点:compatible = "gpio-leds"; 内核leds子系统,会自动从pinctrl里面请求gpio。并导出led的控制功能。
对于button,类似,添加标准的button节点:compatible = "gpio-keys"; ,或者"gpio-keys-polled"。前者申请中断,后者使用轮询。
openwrt的gpio-button-hotplug模块,会读取button节点。来实现按键功能,并调用hotplug脚本。
/ {
soc {
pinctrl: pinctrl@1000000 {
led_pins: led_pins {
pins = "gpio8", "gpio40", "gpio41", "gpio42", "gpio43";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
button_pins: button_pins {
pins = "gpio44";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
};
leds {
compatible = "gpio-leds";
pinctrl-0 = <&led_pins>;
pinctrl-names = "default";
led@8 {
label = "led_iot";
gpios = <&pinctrl 8 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
// 其它led类似,这里省略
};
buttons {
compatible = "gpio-keys";
pinctrl-0 = <&button_pins>;
pinctrl-names = "default";
button@44 {
label = "rest";
linux,code = <KEY_RESTART>;
gpios = <&pinctrl 44 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
debounce-interval = <60>;
};
};
};
};