我正在尝试为 Linux 构建一个内核模块,以尝试控制 LED 设备列表,从而按顺序打开/关闭它们。例如,绿色-->红色-->绿色-->橙色,然后重复。
我知道这可以简单地在用户空间中完成,但是当 CPU 密集使用时,这个 LED 序列需要发生,此时序列会显着减慢,所以我需要通过硬件来控制它。我使用了delay_on/delay_off和usleep(),但就是无法在3个LED之间获得正确的时序。
我知道如何触发每个 LED 并单独为它们分配模式,但我无法集体执行。
谁能告诉我如何获取 LED 设备列表?
列出内核代码中可用的 LED:
extern struct rw_semaphore leds_list_lock;
extern struct list_head leds_list;
...
struct led_classdev *led_cdev;
...
down_write(&leds_list_lock);
list_for_each_entry(led_cdev, &leds_list, node) {
printk(KERN_INFO "LED %s\n", led_cdev->name);
}
up_write(&leds_list_lock);
在内核代码中,您可以使用以下函数来检索与给定 LED 名称匹配的“struct led_classdev”:
struct led_classdev *led_get_by_name(const char *name)
{
struct led_classdev *led_cdev0 = NULL;
struct led_classdev *led_cdev;
if (name == NULL) {
return NULL;
}
down_write(&leds_list_lock);
list_for_each_entry(led_cdev, &leds_list, node) {
if ((led_cdev->name != NULL) && (strcmp(led_cdev->name, name) == 0)) {
led_cdev0 = led_cdev;
break;
}
}
up_write(&leds_list_lock);
return led_cdev0;
}
一旦检索到“struct led_classdev”,就可以使用所有内核 LED API。
注意,当 LED 名称出现在 /sys/class/leds 下时,注册的 struct led_classdev 中的 LED 名称可能为空。例如,Debian 12 下我的 Raspberry PI 4 上的 ACT 和 PWR LED 就是这种情况。