在主板上设计了5个LED,其中2个绿色led用于运行指示,一个rgb灯用状态指示,分别用了5个GPIO口控制LED,均为高电平亮。
linux系统已经自带了leds-gpio的驱动,只需在内核中使能驱动即可。
一般内核中已经使能了LED Support for GPIO connected LEDs:

- leds{
- compatible = "gpio-leds";
-
- user1_led: user1 {
- label = "user1";
- gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>;
- linux,default-trigger = "heartbeat";
- default-state = "on";
- };
- user2_led: user2 {
- label = "user2";
- gpios = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>;
- default-state = "off";
- };
- blue_led: blue {
- label = "blue";
- gpios = <&gpio4 RK_PC0 GPIO_ACTIVE_HIGH>;
- default-state = "off";
- };
- green_led: green {
- label = "green";
- gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>;
- default-state = "off";
- };
- red_led: red {
- label = "red";
- gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>;
- default-state = "off";
- };
- };
此描述添加在根节点下。
修改DTS后编译内核,将boot.img烧写进主板,主板启动后,进入到/sys/class/leds/目录下查看led是否添加成功:
- [root@RK356X:/]# cd /sys/class/leds/
- [root@RK356X:/sys/class/leds]# ls
- blue green mmc0:: red user1 user2
5个led已经添加成功了。
向led灯名称下的brightness写非0或0的值,相应的led就会亮、灭。
- [root@RK356X:/sys/class/leds]# echo 1 > user1/brightness
- [root@RK356X:/sys/class/leds]# echo 0 > user1/brightness
第一次修改DTS后将boot.img烧写进主板,进入到/sys/class/leds/目录下,没有看到添加的led,查看开机日志:
- [root@RK356X:/]# dmesg | grep leds
- [ 1.318922] leds-gpio: probe of leds failed with error -16
显示leds-gpio探测失败,反复检测dts文件,没有发现错误。
查看gpio使用情况:
- gpiochip2: GPIOs 64-95, parent: platform/fe750000.gpio, gpio2:
- gpio-73 ( |xgpio-pin ) out lo
发现xgpio-pin与user1定义的gpio冲突了。
查找dts文件中关于gpio-73相关的描述:
- WORKLED {
- compatible = "9tripod,xgpio";
- pinctrl-names = "default";
- def_val=<0>;
- pinctrl-0 = <&io2_b1>;
- gpio = <&gpio2 9 GPIO_ACTIVE_HIGH>;
- };
WORKLED使用了此GPIO,将此描述删除,再次编译内核,将boot.img烧写进主板,led就添加成功了。
虽然user1配置了默认触发为heartbeat,但是user1并没有自动熄灭,可能还有一些heartbeat的一些功能没有配置好。