我正在尝试编写一个自定义的syscall处理程序来操作BeagleBone黑板上的led。我已经浏览了内核LED API(include/leds.h),但是我找不到任何东西能给我一个可用LED设备的句柄,或者一些其他操作(开/关/切换)它们的机制。大多数函数似乎需要一个led_classdev对象,但我找不到获得它的方法。
我可以在用户空间中使用/sys/class/led/。。。接口。但是我想从内核空间做一些类似的事情。我愿意硬编码任何特定于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创建单独的触发器。
关于linux - 如何从内核代码(BeagleBone Black)访问或枚举可用的LED?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58527538/