【问题标题】:How can I access or enumerate available LEDs from kernel code (BeagleBone Black)?如何从内核代码 (BeagleBone Black) 访问或枚举可用的 LED?
【发布时间】:2019-10-23 16:43:32
【问题描述】:

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

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

【问题讨论】:

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

标签: linux linux-kernel embedded-linux beagleboneblack led


【解决方案1】:

我想出了一种从内核空间访问/控制 LED 的方法 - 通过创建自定义 LED 触发器。它没有提供枚举可用设备的方法,并且需要通过写入 /sys/class/leds/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 创建单独的触发器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2014-12-15
    • 2016-02-19
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多