ILD

button和led适配
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2022-6-23 站点:Inside Linux Development


如下,添加对应的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>;

                        };

                };

        };

};


Copyright © insidelinuxdev.net 2017-2021. Some Rights Reserved.