如何控制内核空间中的 LED 列表

问题描述 投票:0回答:1

我正在尝试为 Linux 构建一个内核模块,以尝试控制 LED 设备列表,从而按顺序打开/关闭它们。例如,绿色-->红色-->绿色-->橙色,然后重复。

我知道这可以简单地在用户空间中完成,但是当 CPU 密集使用时,这个 LED 序列需要发生,此时序列会显着减慢,所以我需要通过硬件来控制它。我使用了delay_on/delay_off和usleep(),但就是无法在3个LED之间获得正确的时序。

我知道如何触发每个 LED 并单独为它们分配模式,但我无法集体执行。

谁能告诉我如何获取 LED 设备列表?

linux linux-kernel linux-device-driver kernel-module led
1个回答
0
投票

列出内核代码中可用的 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 就是这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.