Linux 如何从内核代码(BeagleBone Black)访问或枚举可用的LED?

Linux 如何从内核代码(BeagleBone Black)访问或枚举可用的LED?,linux,linux-kernel,embedded-linux,beagleboneblack,led,Linux,Linux Kernel,Embedded Linux,Beagleboneblack,Led,我正在尝试编写一个定制的系统调用处理程序,用于处理BeagleBone黑板上的LED。我已经浏览了内核LED API(include/leds.h),但是我找不到任何东西可以给我一个可用LED设备的句柄或者其他一些机制来操纵(开/关/切换)它们。大多数函数似乎都需要一个led_classdev对象,但我找不到一种方法来获得它 我可以在用户空间中使用/sys/class/leds/。。。接口。但是我想从内核空间做一些类似的事情。我愿意硬编码任何特定于BeagleBone Black的设备名称,因为

我正在尝试编写一个定制的系统调用处理程序,用于处理BeagleBone黑板上的LED。我已经浏览了内核LED API(include/leds.h),但是我找不到任何东西可以给我一个可用LED设备的句柄或者其他一些机制来操纵(开/关/切换)它们。大多数函数似乎都需要一个led_classdev对象,但我找不到一种方法来获得它


我可以在用户空间中使用/sys/class/leds/。。。接口。但是我想从内核空间做一些类似的事情。我愿意硬编码任何特定于BeagleBone Black的设备名称,因为可移植性不是问题。

我找到了一种从内核空间访问/控制LED的方法-通过创建自定义LED触发器。它没有提供枚举可用设备的方法,它要求通过写入/sys/class/LED/foo/trigger为用户空间中的LED分配自定义触发器。但是,一旦指定了触发器,它就允许您操作内核代码中的LED

struct led_trigger *trigger;
...
led_trigger_register_simple("myled", &trigger); //create and register the trigger
...
//assign the trigger "myled" to the desired LED(s) from user-space
//by writing to the corresponding trigger files in /sys/class/leds/foo/
...
led_trigger_event(trigger, LED_FULL); //turn-on the LED(s) connected to the trigger
led_trigger_event(trigger, LED_OFF);  //turn-off

例如,触发器的创建和注册可以在模块init中完成。此外,如果需要独立操作多个LED,那么据我所知,需要为每个LED创建单独的触发器。

您试图解决什么问题?为什么不能在用户空间中使用gpio接口来实现这一点?这主要是一个学术练习。我需要操作LED作为进行自定义系统调用的结果。因此,内核空间中的syscall处理程序函数需要访问指示灯。此指示灯是否已连接gpio?是。内核已经配置了gpio/LED(不是由我配置的),因此它们可以在/sys/class/LED/beaglebone\:green\:usr[0-3]/下使用。实例化LED的驱动程序是它们的所有者。如果您想成为所有者,您必须实例化LED。肮脏的黑客是在内核中打开sysfs文件(永远不要这样做!)。