Linux 下的闪光 LED 处理

一些 LED 设备提供两种模式 - 手电筒和闪光灯。在 LED 子系统中,这些模式分别由 LED 类(请参阅 Linux 下的 LED 处理)和 LED 闪光类支持。手电筒模式相关的功能默认启用,只有当驱动程序通过设置 LED_DEV_CAP_FLASH 标志声明时,才会启用闪光灯功能。

为了启用对闪光 LED 的支持,必须在内核配置中定义 CONFIG_LEDS_CLASS_FLASH 符号。LED 闪光类驱动程序必须使用 led_classdev_flash_register 函数在 LED 子系统中注册。

以下 sysfs 属性被公开以控制闪光 LED 设备:(请参阅 Documentation/ABI/testing/sysfs-class-led-flash)

  • flash_brightness

  • max_flash_brightness

  • flash_timeout

  • max_flash_timeout

  • flash_strobe

  • flash_fault

用于闪光 LED 的 V4L2 闪光封装器

LED 子系统驱动程序也可以从 VideoForLinux2 子系统的级别进行控制。为了启用此功能,必须在内核配置中定义 CONFIG_V4L2_FLASH_LED_CLASS 符号。

驱动程序必须调用 v4l2_flash_init 函数才能在 V4L2 子系统中注册。该函数接受六个参数

  • dev

    闪光设备,例如 I2C 设备

  • of_node

    LED 的 of_node,如果与设备的 of_node 相同,则可以为 NULL

  • fled_cdev

    要封装的 LED 闪光类设备

  • iled_cdev

    代表与 fled_cdev 关联的指示灯 LED 的 LED 闪光类设备,可以为 NULL

  • ops

    V4L2 特定的操作

    • external_strobe_set

      定义闪光 LED 频闪的来源 - V4L2_CID_FLASH_STROBE 控制或外部来源,通常是传感器,这使得可以将闪光频闪的开始与曝光开始同步。

    • intensity_to_led_brightness 和 led_brightness_to_intensity

      以设备特定的方式执行枚举 led_brightness <-> V4L2 强度转换 - 它们可以用于具有非线性 LED 电流刻度的设备。

  • config

    V4L2 闪光子设备的配置

    • dev_name

      媒体实体的名称,在系统中必须唯一。

    • flash_faults

      LED 闪光类设备可以报告的闪光故障的位掩码;相应的 LED_FAULT* 位定义可在 <linux/led-class-flash.h> 中找到。

    • torch_intensity

      手电筒模式下 LED 的约束条件,以微安为单位。

    • indicator_intensity

      指示灯 LED 的约束条件,以微安为单位。

    • has_external_strobe

      确定闪光频闪源是否可以切换到外部。

在移除时,必须调用 v4l2_flash_release 函数,该函数接受一个参数 - struct v4l2_flash 指针,该指针之前由 v4l2_flash_init 返回。可以安全地使用 NULL 或错误指针参数调用此函数。

有关 v4l2 闪光封装器的示例用法,请参阅 drivers/leds/leds-max77693.c。

一旦创建媒体控制器设备的驱动程序注册了 V4L2 子设备,该子设备节点的作用就类似于本机 V4L2 闪光 API 设备的节点。调用只是简单地路由到 LED 闪光 API。

打开 V4L2 闪光子设备会使 LED 子系统 sysfs 接口不可用。该接口在 V4L2 闪光子设备关闭后重新启用。