Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 1 | ============================== |
Jacek Anaszewski | f6ad395 | 2015-03-04 08:14:24 -0800 | [diff] [blame] | 2 | Flash LED handling under Linux |
| 3 | ============================== |
| 4 | |
| 5 | Some LED devices provide two modes - torch and flash. In the LED subsystem |
Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 6 | those modes are supported by LED class (see Documentation/leds/leds-class.rst) |
Jacek Anaszewski | f6ad395 | 2015-03-04 08:14:24 -0800 | [diff] [blame] | 7 | and LED Flash class respectively. The torch mode related features are enabled |
| 8 | by default and the flash ones only if a driver declares it by setting |
| 9 | LED_DEV_CAP_FLASH flag. |
| 10 | |
| 11 | In order to enable the support for flash LEDs CONFIG_LEDS_CLASS_FLASH symbol |
| 12 | must be defined in the kernel config. A LED Flash class driver must be |
| 13 | registered in the LED subsystem with led_classdev_flash_register function. |
| 14 | |
| 15 | Following sysfs attributes are exposed for controlling flash LED devices: |
| 16 | (see Documentation/ABI/testing/sysfs-class-led-flash) |
Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 17 | |
Jacek Anaszewski | f6ad395 | 2015-03-04 08:14:24 -0800 | [diff] [blame] | 18 | - flash_brightness |
| 19 | - max_flash_brightness |
| 20 | - flash_timeout |
| 21 | - max_flash_timeout |
| 22 | - flash_strobe |
| 23 | - flash_fault |
Jacek Anaszewski | aaf2cbc | 2015-06-08 02:02:18 -0700 | [diff] [blame] | 24 | |
| 25 | |
| 26 | V4L2 flash wrapper for flash LEDs |
| 27 | ================================= |
| 28 | |
| 29 | A LED subsystem driver can be controlled also from the level of VideoForLinux2 |
| 30 | subsystem. In order to enable this CONFIG_V4L2_FLASH_LED_CLASS symbol has to |
| 31 | be defined in the kernel config. |
| 32 | |
| 33 | The driver must call the v4l2_flash_init function to get registered in the |
| 34 | V4L2 subsystem. The function takes six arguments: |
Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 35 | |
| 36 | - dev: |
| 37 | flash device, e.g. an I2C device |
| 38 | - of_node: |
| 39 | of_node of the LED, may be NULL if the same as device's |
| 40 | - fled_cdev: |
| 41 | LED flash class device to wrap |
| 42 | - iled_cdev: |
| 43 | LED flash class device representing indicator LED associated with |
| 44 | fled_cdev, may be NULL |
| 45 | - ops: |
| 46 | V4L2 specific ops |
| 47 | |
| 48 | * external_strobe_set |
| 49 | defines the source of the flash LED strobe - |
Jacek Anaszewski | aaf2cbc | 2015-06-08 02:02:18 -0700 | [diff] [blame] | 50 | V4L2_CID_FLASH_STROBE control or external source, typically |
| 51 | a sensor, which makes it possible to synchronise the flash |
| 52 | strobe start with exposure start, |
Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 53 | * intensity_to_led_brightness and led_brightness_to_intensity |
| 54 | perform |
Jacek Anaszewski | aaf2cbc | 2015-06-08 02:02:18 -0700 | [diff] [blame] | 55 | enum led_brightness <-> V4L2 intensity conversion in a device |
| 56 | specific manner - they can be used for devices with non-linear |
| 57 | LED current scale. |
Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 58 | - config: |
| 59 | configuration for V4L2 Flash sub-device |
| 60 | |
| 61 | * dev_name |
| 62 | the name of the media entity, unique in the system, |
| 63 | * flash_faults |
| 64 | bitmask of flash faults that the LED flash class |
Jacek Anaszewski | aaf2cbc | 2015-06-08 02:02:18 -0700 | [diff] [blame] | 65 | device can report; corresponding LED_FAULT* bit definitions are |
| 66 | available in <linux/led-class-flash.h>, |
Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 67 | * torch_intensity |
| 68 | constraints for the LED in TORCH mode |
Jacek Anaszewski | aaf2cbc | 2015-06-08 02:02:18 -0700 | [diff] [blame] | 69 | in microamperes, |
Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 70 | * indicator_intensity |
| 71 | constraints for the indicator LED |
Jacek Anaszewski | aaf2cbc | 2015-06-08 02:02:18 -0700 | [diff] [blame] | 72 | in microamperes, |
Mauro Carvalho Chehab | 8dab919 | 2019-06-28 09:20:20 -0300 | [diff] [blame] | 73 | * has_external_strobe |
| 74 | determines whether the flash strobe source |
Jacek Anaszewski | aaf2cbc | 2015-06-08 02:02:18 -0700 | [diff] [blame] | 75 | can be switched to external, |
| 76 | |
| 77 | On remove the v4l2_flash_release function has to be called, which takes one |
| 78 | argument - struct v4l2_flash pointer returned previously by v4l2_flash_init. |
| 79 | This function can be safely called with NULL or error pointer argument. |
| 80 | |
| 81 | Please refer to drivers/leds/leds-max77693.c for an exemplary usage of the |
| 82 | v4l2 flash wrapper. |
| 83 | |
| 84 | Once the V4L2 sub-device is registered by the driver which created the Media |
| 85 | controller device, the sub-device node acts just as a node of a native V4L2 |
| 86 | flash API device would. The calls are simply routed to the LED flash API. |
| 87 | |
| 88 | Opening the V4L2 flash sub-device makes the LED subsystem sysfs interface |
| 89 | unavailable. The interface is re-enabled after the V4L2 flash sub-device |
| 90 | is closed. |