首先 menuconfig_kernel
调整内核配置, 打开 LED 支持.
位置: Device Drivers > LED Support
CONFIG_NEW_LEDS=y
# LED Support
CONFIG_LEDS_CLASS=y
# LED Support for GPIO connected LEDs
CONFIG_LEDS_GPIO=y
# 下面是一些 triggers, 根据需要选择是否打开
# LED Trigger support
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_ONESHOT=y
CONFIG_LEDS_TRIGGER_MTD=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_CPU=y
CONFIG_LEDS_TRIGGER_ACTIVITY=y
CONFIG_LEDS_TRIGGER_GPIO=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_LEDS_TRIGGER_NETDEV=y
CONFIG_LED_TRIGGER_PHY=y
然后在 dts 中添加 LED 节点:
把板载的 LED 加入, 通过电路图得知板载的蓝色 LED 连接在 XGPIOC[24]
上面, 高电平触发.
名称设置为 led_blue
, 默认的触发器选择 activity
, 此触发器根据系统负载改变 LED 的闪烁占空比.
编辑 build/boards/cv180x/cv1800b_sophpi_duo_sd/dts_riscv/cv1800b_sophpi_duo_sd.dts
/ {
leds {
compatible = "gpio-leds";
led_blue {
label = "led_blue";
gpios = <&portc 24 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "activity";
};
};
};
重新编译内核镜像并使用新 FIT Image 启动后, 就能看到效果了.
PS: 记得取消镜像里面的默认闪烁脚本的启动, 以避免冲突.
LED Class 的使用
通过 sysfs 可以方便的操作:
cd /sys/class/leds/led_blue/
# 查看活动触发器
cat trigger
# 换一个触发器
# 心跳
echo heartbeat > trigger
# 常亮
echo default-on > trigger
gpiod info
可以使用 gpioinfo 命令看到原来的 GPIO 现在已经被使用了:
gpioinfo 2
...
line 24: unnamed "led_blue" output active-high [used]
...