换一种方式点灯:通过 LED Class

首先 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]
...