设备树中的LED驱动一般是这样写,LED驱动可以控制GPIO的电平变化,生成文件节点很方便
leds: leds {
compatible = "gpio-leds";
gpio_demo: gpio_demo {
label = "gpio_demo";
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "default-off";
default-state = "on";
};
}
compatible = "gpio-leds"; |
对应了驱动中 drivers/leds/leds-gpio.c这个驱动文件 |
label = "gpio_demo"; |
这个名字会在文件系统中生成对应的设备节点 /sys/class/leds/gpio_demo |
linux,default-trigger = "default-off"; |
指的是led的触发方式 default-off是默认none作为普通的功能来使用 |
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>; |
前面两个参数是设置哪个GPIO 后面一个参数是指的高低电平有效 |
default-state = "on"; |
默认状态 on或者off |
设置方式 | 默认电平 |
brightness=0 |
brightness>0 |
---|---|---|---|
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>; linux,default-trigger = "default-off"; default-state = "on" |
高 | 低 | 高 |
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>; linux,default-trigger = "default-off"; default-state = "off" |
低 | 低 | 高 |
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>; linux,default-trigger = "default-off"; default-state = "on" |
低 | 高 | 低 |
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>; linux,default-trigger = "default-off"; default-state = "off" |
高 | 高 | 低 |
触发方式linux,default-trigger = "default-off";
触发方式类型可以参考使用内核里面的支持项,源码在drivers\leds\trigger下面
drivers/leds/trigger/ledtrig-activity.c
drivers/leds/trigger/ledtrig-audio.c
drivers/leds/trigger/ledtrig-backlight.c
drivers/leds/trigger/ledtrig-camera.c
drivers/leds/trigger/ledtrig-cpu.c
drivers/leds/trigger/ledtrig-default-on.c
drivers/leds/trigger/ledtrig-disk.c
drivers/leds/trigger/ledtrig-gpio.c
drivers/leds/trigger/ledtrig-heartbeat.c
drivers/leds/trigger/ledtrig-mtd.c
drivers/leds/trigger/ledtrig-multi-control.c
drivers/leds/trigger/ledtrig-netdev.c
drivers/leds/trigger/ledtrig-oneshot.c
drivers/leds/trigger/ledtrig-panic.c
drivers/leds/trigger/ledtrig-pattern.c
drivers/leds/trigger/ledtrig-timer.c
drivers/leds/trigger/ledtrig-transient.c
常用的有timer heartbeat oneshot
使用的时候需要检测内核config中是否有开启,使用哪个就开启哪个
CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_BACKLIGHT=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_LEDS_TRIGGER_ONESHOT=y
以timer和oneshot举例
timer
leds: leds {
compatible = "gpio-leds";
gpio_demo: gpio_demo {
label = "gpio_demo";
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "timer";
default-state = "on";
};
}
echo 500 > /sys/class/leds/gpio_demo/delay_on
echo 500 > /sys/class/leds/gpio_demo/delay_off
这样操作后GPIO电平就会高500ms低500ms
oneshot
leds: leds {
compatible = "gpio-leds";
gpio_demo: gpio_demo {
label = "gpio_demo";
gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "oneshot";
default-state = "on";
};
}
echo 1000 > /sys/class/leds/gpio_demo/delay_on
echo 1 > /sys/class/leds/gpio_demo/short
这样就会让电平变高1秒后变低
如果invert设置1后那么就是变低1秒后变高