Re: [RFC v4] V4L2 API for flash devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thursday, May 05, 2011 20:49:21 Sakari Ailus wrote:
> Hi,
> 
> This is a fourth proposal for an interface for controlling flash devices
> on the V4L2/v4l2_subdev APIs.
> 
> I want to thank everyone who have participated to the development of the
> flash interface.
> 
> Comments and questions are very, very welcome as always.
> 
> 
> Changes since v3 [12]
> =====================
> 
> - V4L2_CID_FLASH_STROBE changed to button control,
> V4L2_CID_FLASH_STROBE_STOP button control added,
> V4L2_CID_FLASH_STROBE_STATUS boolean control added.
> 
> - No reason to say xenon flashes can't use V4L2_CID_FLASH_STROBE.
> 
> - V4L2_CID_FLASH_STROBE_WHENCE changed to V4L2_CID_FLASH_STROBE_MODE.
> 
> - V4L2_CID_TORCH_INTENSITY renamed to V4L2_CID_FLASH_TORCH_INTENSITY and
> V4L2_CID_INDICATOR_INTENSITY renamed to V4L2_CID_FLASH_INDICATOR_INTENSITY.
> 
> - Moved V4L2_CID_FLASH_EXTERNAL_STROBE_MODE under "Possible future
> extensions".
> 
> 
> Changes since v2 [9]
> ====================
> 
> - Rearranged proposed controls. V4L2_CID_FLASH_LED_MODE is now the first
> control.
> 
> - Added an open question on naming of indicator and torch controls.
> 
> - V4L2_CID_FLASH_STROBE_MODE renamed to V4L2_CID_FLASH_STROBE_WHENCE.
> V4L2_CID_FLASH_EXTERNAL_STROBE_WHENCE renamed to
> V4L2_CID_FLASH_EXTERNAL_STROBE_MODE.
> 
> - Removed CID_ from V4L2_CID_FLASH_EXTERNAL_STROBE_MODE values.
> 
> - Added a new use case based on [11]: Synchronised LED flash (hardware
> strobe, timed exposure).
> 
> - Added section on possible future extensions.
> 
> - Complemented the open question on units.
> 
> 
> Changes since v1 [7]
> ====================
> 
> - V4L2_FLASH_STROBE_MODE_EXT_STROBE renamed to
> V4L2_FLASH_STROBE_MODE_EXTERNAL.
> 
> - V4L2_CID_FLASH_STROBE control changed from button to bool.
> 
> - Removed suggestion of adding V4L2_CID_FLASH_DURATION.
> V4L2_CID_FLASH_TIMEOUT is used as hardware timeout.
> 
> - Added control access info (ro/rw).
> 
> - V4L2_FLASH_MODE_NONE added, V4L2_FLASH_LED_MODE_FLASH no longer forced
> as 1 in enum.
> 
> - Bits use (1 << x) instead of 0x00... format.
> 
> - Added an open question on flash LED mode controls.
> 
> - Added an open question on a new control:
> V4L2_CID_FLASH_EXTERNAL_STROBE_WHENCE.
> 
> - Added an open question on control units.
> 
> 
> Scope
> =====
> 
> This RFC is focused mostly on the ADP1653 [1] and similar chips [2, 3]
> which provides following functionality. [2, 3] mostly differ on the
> available faults --- for example, there are faults also for the
> indicator LED.
> 
> - High power LED output (flash or torch modes)
> - Low power indicator LED output (a.k.a. privacy light)
> - Programmable flash timeout
> - Software and hardware strobe
> - Fault detection
> 	- Overvoltage
> 	- Overtemperature
> 	- Short circuit
> 	- Timeout
> - Programmable current (both high-power and indicator LEDs)
> 
> If anyone else is aware of hardware which significantly differs from
> these and does not get served well under the proposed interface, please
> tell about it.
> 
> This RFC does NOT address the synchronisation of the flash to a given
> frame since this task is typically performed by the sensor through a
> strobe signal. The host does not have enough information for this ---
> exact timing information on the exposure of the sensor pixel array. In
> this case the flash synchronisation is visible to the flash controller
> as the hardware strobe originating from the sensor.
> 
> Flash synchronisation requires
> 
> 1) flash control capability from the sensor including a strobe output,
> 2) strobe input in the flash controller,
> 3) (optionally) ability to program sensor parameters at given frame,
> such as flash strobe, and
> 4) ability to read back metadata produced by the sensor related to a
> given frame. This should include whether the frame is exposed with
> flash, i.e. the sensor's flash strobe output.
> 
> Since we have little examples of both in terms of hardware support,
> which is in practice required, it was decided to postpone the interface
> specification for now. [6]
> 
> Xenon flash controllers exist but I don't have a specific example of
> those. Typically the interface is quite simple. Gpio pins for charge and
> strobe. The length of the strobe signal determines the strength of the
> flash pulse. The strobe is controlled by the sensor as for LED flash if
> it is hardware based.
> 
> See "Possible future extensions" section below for more.
> 
> 
> Known use cases
> ===============
> 
> The use case listed below concentrate on using a flash in a mobile
> device, for example in a mobile phone. The use cases could be somewhat
> different in devices the primary use of which is camera.
> 
> Unsynchronised LED flash (software strobe)
> ------------------------------------------
> 
> Unsynchronised LED flash is controlled directly by the host as the
> sensor. The flash must be enabled by the host before the exposure of the
> image starts and disabled once it ends. The host is fully responsible
> for the timing of the flash.
> 
> Example of such device: Nokia N900.
> 
> Synchronised LED flash (hardware strobe)
> ----------------------------------------
> 
> The synchronised LED flash is pre-programmed by the host (power and
> timeout) but controlled by the sensor through a strobe signal from the
> sensor to the flash.
> 
> The sensor controls the flash duration and timing. This control
> typically must be programmed to the sensor, and specifying an interface
> for this is out of scope of this RFC.
> 
> The LED flash controllers we know of can function in both synchronised
> and unsynchronised modes.
> 
> LED flash as torch
> ------------------
> 
> LED flash may be used as torch in conjunction with another use case
> involving camera or individually. [4]
> 
> Synchronised xenon flash
> ------------------------
> 
> The synchronised xenon flash is controlled more closely by the sensor
> than the LED flash. There is no separate intensity control for the xenon
> flash as its intensity is determined by the length of the strobe pulse.
> Several consecutive strobe pluses are possible but this needs to be
> still controlled by the sensor.
> 
> Synchronised xenon flash (timed exposure)
> -----------------------------------------
> 
> The same as above, but the flash is triggered around the end of the
> exposure. [11] This also probably requires a sensor which can do
> synchronous exposure, i.e. can start (and stop) the exposure of all
> lines at the same time.
> 
> 
> Proposed interface
> ==================
> 
> The flash, either LED or xenon, does not require large amounts of data
> to control it. There are parameters to control it but they are
> independent and assumably some hardware would only support some subsets
> of the functionality available somewhere else. Thus V4L2 controls seem
> an ideal way to support flash controllers.
> 
> A separate control class is reserved for the flash controls. It is
> called V4L2_CTRL_CLASS_FLASH.
> 
> Type of the control; type of flash is in parentheses after the control.
> 
> 
> 	V4L2_CID_FLASH_LED_MODE (menu; rw; LED)
> 
> enum v4l2_flash_led_mode {
> 	V4L2_FLASH_LED_MODE_NONE,
> 	V4L2_FLASH_LED_MODE_FLASH,
> 	V4L2_FLASH_LED_MODE_TORCH,
> };
> 
> 
> 	V4L2_CID_FLASH_STROBE (button; wo; LED, xenon)
> 
> Strobe the flash using software strobe from the host, typically over I2C
> or a GPIO. The flash is NOT synchronised to sensor pixel are exposure
> since the command is given asynchronously. Alternatively, if the flash
> controller is a master in the system, the sensor exposure may be
> triggered based on software strobe.

I would like a comment here that the driver will always stop the strobe
to prevent hardware damage, but that STROBE_STOP can be called to shut
down the strobe earlier.

Also, how to protect against nastiness like this:

struct v4l2_control ctrl = { V4L2_CID_FLASH_STROBE, 0 };

for (;;)
	ioctl(fd, VIDIOC_S_CTRL, &ctrl);

Return -EBUSY as long as either a strobe is in progress or if it is unsafe to
start a new one?

> 
> 
> 	V4L2_CID_FLASH_STROBE_STOP (button; wo; LED)
> 
> This control may be used to shut down the strobe immediately.
> 
> 
> 	V4L2_CID_FLASH_STROBE_STATUS (boolean; ro; LED)
> 
> This contol may be used to query the status of the strobe (on/off).
> 
> 
> 	V4L2_CID_FLASH_STROBE_MODE (menu; rw; LED)
> 
> Use hardware or software strobe. If hardware strobe is selected, the
> flash controller is a slave in the system where the sensor produces the
> strobe signal to the flash.
> 
> In this case the flash controller setup is limited to programming strobe
> timeout and power (LED flash) and the sensor controls the timing and
> length of the strobe.
> 
> enum v4l2_flash_strobe_whence {
> 	V4L2_FLASH_STROBE_WHENCE_SOFTWARE,
> 	V4L2_FLASH_STROBE_WHENCE_EXTERNAL,
> };

Perhaps use 'type' instead of 'whence'? English isn't my native language,
but it sounds pretty archaic to me.

> 
> 
> 	V4L2_CID_FLASH_TIMEOUT (integer; rw; LED)
> 
> The flash controller provides timeout functionality to shut down the led
> in case the host fails to do that. For hardware strobe, this is the
> maximum amount of time the flash should stay on, and the purpose of the
> setting is to prevent the LED from catching fire.

It is a bit ambiguous. I assume you mean to say that the application can
set the timeout to any value less than the maximum of the control (which
is the maximum allowed by the hardware).
 
> For software strobe, the setting may be used to limit the length of the
> strobe using a hardware watchdog. The granularity of the timeout in [1,
> 2, 3] is very coarse.
> 
> A standard unit such as ms or µs should be used.
> 
> 
> 	V4L2_CID_FLASH_INTENSITY (integer; rw; LED)
> 
> Intensity of the flash in hardware specific units. The LED flash
> controller provides current to the LED but the actual luminous power is
> dictated by the LED connected to the controller.
> 
> 
> 	V4L2_CID_FLASH_TORCH_INTENSITY (integer; rw; LED)
> 
> Intensity of the flash in hardware specific units.
> 
> 
> 	V4L2_CID_FLASH_INDICATOR_INTENSITY (integer; rw; LED)
> 
> Intensity of the indicator light in hardware specific units.
> 
> 
> 	V4L2_CID_FLASH_FAULT (bit field; ro; LED)
> 
> This is a bitmask containing the fault information for the flash. This
> assumes the proposed V4L2 bit mask controls [5]; otherwise this would
> likely need to be a set of controls.
> 
> #define V4L2_FLASH_FAULT_OVER_VOLTAGE		(1 << 0)
> #define V4L2_FLASH_FAULT_TIMEOUT		(1 << 1)
> #define V4L2_FLASH_FAULT_OVER_TEMPERATURE	(1 << 2)
> #define V4L2_FLASH_FAULT_SHORT_CIRCUIT		(1 << 3)
> 
> Several faults may occur at single occasion. The ADP1653 is able to
> inform the user a fault has occurred, so a V4L2 control event (proposed
> earlier) could be used for that.
> 
> These faults are supported by the ADP1653. More faults may be added as
> support for more chips require that. In some other hardware faults are
> available for indicator led as well.
> 
> 
> 	V4L2_CID_FLASH_CHARGE (bool; rw; xenon)
> 
> Charge control for the xenon flash. Enable or disable charging.
> 
> 
> 	V4L2_CID_FLASH_READY (bool; ro; xenon, LED)
> 
> Flash is ready to strobe. On xenon flash this tells the capacitor has
> been charged, on LED flash it's that the LED is no longer too hot.
> 
> The implementation on LED flash may be modelling the temperature
> behaviour of the LED in the driver (or elsewhere, e.g. library or board
> code) if the hardware does not provide direct temperature information
> from the LED.
> 
> A V4L2 control event should be produced whenever the flash becomes ready.
> 
> 
> Open questions
> ==============
> 
> 1. Flash LED mode control
> -------------------------
> 
> Should the flash led mode control be a single control or a set of
> controls? A single control would make it easier for application to
> choose between different modes, but on the other hand limits future
> extensibility if there would have to be further splitting of the modes. [8]

I think I like the current proposal best.

> 3. Units
> --------
> 
> Which units should e.g. V4L2_CID_FLASH_TIMEOUT be using? It'd be very
> useful to have standard unit on this control, like ms or µs.

This should be standardized. The question is how flexible we want this.
I would definitely go for µs or perhaps even ns. But what should the
maximum duration be? Are there extreme cases where you can have a really
long flash in special types of photography? Perhaps this should be a 64-bit
number?

> Some controls, like V4L2_CID_FLASH_INTENSITY, can't easily use a
> standard unit. The luminous output depends on the LED connected (you
> could use an incandescent lightbulb too, I suppose?) to the flash
> controller. These controls typically control the current supplied by the
> flash controller.
> 
> The timing controls on the sensor could use pixels (or lines) since
> these are the units the sensor uses itself. Converting between pixels
> (or lines) and SI units is trivial since the pixel clock is known in the
> user space.
> 
> The flash chip, on the other hand, has no knowledge of sensor pixel
> clock, so it should use SI units. Also, the timing control currently in
> the flash chip itself is very coarse.
> 
> PROPOSAL: If the component has internal timing which is known elsewhere,
> such the sensor, the controls should use these units. Otherwise,
> standard SI units should be used. In the sensor's case, this could be µs.

Not sure about that. I would go for SI units at all time.

> 
> 
> Possible future extensions
> ==========================
> 
> 1. Indicator faults
> -------------------
> 
> Some chips do support these. As they are part of the same register (at
> least on some chips [10]), they could be part of V4L2_CID_FLASH_FAULT
> control.
> 
> 2. Strobe output control on sensor
> ----------------------------------
> 
> Sensor requires strobe output control to trigger hardware strobe (on
> next possible frame).
> 
> 3. Sensor metadata on frames
> ----------------------------
> 
> It'd be useful to be able to read back sensor metadata. If the flash is
> strobed (on sensor hardware) while streaming, it's difficult to know
> otherwise which frame in the stream has been exposed with flash.

I wonder if it would make sense to have a V4L2_BUF_FLAG_FLASH buffer flag?
That way userspace can tell if that particular frame was taken with flash.

> 4. Timing of strobe
> -------------------
> 
> Hardware strobe timing relative to frame start. The length of the strobe
> should be timeable as well.
> 
> 5. Flash type control
> ---------------------
> 
> Probably it'd be good to be able to tell which kind of flash we have
> (xenon/LED). This should be added no later than we have a xenon flash
> driver.
> 
> V4L2_CID_FLASH_TYPE
> 
> 6. V4L2_CID_FLASH_EXTERNAL_STROBE_MODE
> --------------------------------------
> 
> The implementation of this control is postponed until we have a driver
> which implements this functionality.
> 
> 	V4L2_CID_FLASH_EXTERNAL_STROBE_MODE (bool; rw; xenon, LED)
> 
> Whether the flash controller considers external strobe as edge, when the
> only limit of the strobe is the timeout on flash controller, or level,
> when the flash strobe will last as long as the strobe signal, or as long
> until the timeout expires.
> 
> enum v4l2_flash_external_strobe_mode {
> 	V4L2_FLASH_EXTERNAL_STROBE_MODE_LEVEL,
> 	V4L2_FLASH_EXTERNAL_STROBE_MODE_EDGE,
> };
> 
> Should V4L2_CID_FLASH_EXTERNAL_STROBE_MODE be renamed? Are _EDGE and
> _LEVEL menu values enough to describe the functionality?
> 
> 
> References
> ==========
> 
> [1] ADP1653 datasheet.
> http://www.analog.com/static/imported-files/data_sheets/ADP1653.pdf
> 
> [2] LM3555. http://www.national.com/mpf/LM/LM3555.html#Overview
> 
> [3] AS3645 product brief.
> http://www.austriamicrosystems.com/eng/Products/Lighting-Management/Camera-Flash-LED-Drivers/AS3645
> 
> [4] Flashlight applet for the N900.
> http://maemo.org/downloads/product/Maemo5/flashlight-applet/
> 
> [5] V4L2 Warszaw brainstorming meeting notes, day 2.
> http://www.retiisi.org.uk/v4l2/v4l2-brainstorming-warsaw-2011-03/notes/day%202%20(SGz6LU2esk).html
> 
> [6] V4L2 Warszaw brainstorming meeting notes, day 3.
> http://www.retiisi.org.uk/v4l2/v4l2-brainstorming-warsaw-2011-03/notes/day%203%20(RhoYa0X9D7).html
> 
> [7] [RFC] V4L2 flash API for flash devices.
> http://www.spinics.net/lists/linux-media/msg30725.html
> 
> [8] http://www.spinics.net/lists/linux-media/msg30794.html
> 
> [9] [RFC v2] V4L2 flash API for flash devices.
> http://www.spinics.net/lists/linux-media/msg31135.html
> 
> [10] AS3645 datasheet.
> http://www.cdiweb.com/datasheets/austriamicro/AS3645_Datasheet_v1-6.pdf
> 
> [11] Andrew's use cases for flash.
> http://www.spinics.net/lists/linux-media/msg31363.html
> 
> [12] [RFC v3] V4L2 flash API for flash devices.
> http://www.spinics.net/lists/linux-media/msg31425.html
> 
> 
> Cheers,
> 
> 

I think this is starting to look good.

Regards,

	Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux