73 lines
2.5 KiB
ReStructuredText
73 lines
2.5 KiB
ReStructuredText
|
MIPI CSI-2
|
||
|
==========
|
||
|
|
||
|
CSI-2 is a data bus intended for transferring images from cameras to
|
||
|
the host SoC. It is defined by the `MIPI alliance`_.
|
||
|
|
||
|
.. _`MIPI alliance`: http://www.mipi.org/
|
||
|
|
||
|
Transmitter drivers
|
||
|
-------------------
|
||
|
|
||
|
CSI-2 transmitter, such as a sensor or a TV tuner, drivers need to
|
||
|
provide the CSI-2 receiver with information on the CSI-2 bus
|
||
|
configuration. These include the V4L2_CID_LINK_FREQ and
|
||
|
V4L2_CID_PIXEL_RATE controls and
|
||
|
(:c:type:`v4l2_subdev_video_ops`->s_stream() callback). These
|
||
|
interface elements must be present on the sub-device represents the
|
||
|
CSI-2 transmitter.
|
||
|
|
||
|
The V4L2_CID_LINK_FREQ control is used to tell the receiver driver the
|
||
|
frequency (and not the symbol rate) of the link. The
|
||
|
V4L2_CID_PIXEL_RATE is may be used by the receiver to obtain the pixel
|
||
|
rate the transmitter uses. The
|
||
|
:c:type:`v4l2_subdev_video_ops`->s_stream() callback provides an
|
||
|
ability to start and stop the stream.
|
||
|
|
||
|
The value of the V4L2_CID_PIXEL_RATE is calculated as follows::
|
||
|
|
||
|
pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample
|
||
|
|
||
|
where
|
||
|
|
||
|
.. list-table:: variables in pixel rate calculation
|
||
|
:header-rows: 1
|
||
|
|
||
|
* - variable or constant
|
||
|
- description
|
||
|
* - link_freq
|
||
|
- The value of the V4L2_CID_LINK_FREQ integer64 menu item.
|
||
|
* - nr_of_lanes
|
||
|
- Number of data lanes used on the CSI-2 link. This can
|
||
|
be obtained from the OF endpoint configuration.
|
||
|
* - 2
|
||
|
- Two bits are transferred per clock cycle per lane.
|
||
|
* - bits_per_sample
|
||
|
- Number of bits per sample.
|
||
|
|
||
|
The transmitter drivers must, if possible, configure the CSI-2
|
||
|
transmitter to *LP-11 mode* whenever the transmitter is powered on but
|
||
|
not active. Some transmitters do this automatically but some have to
|
||
|
be explicitly programmed to do so, and some are unable to do so
|
||
|
altogether due to hardware constraints.
|
||
|
|
||
|
Stopping the transmitter
|
||
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||
|
|
||
|
A transmitter stops sending the stream of images as a result of
|
||
|
calling the ``.s_stream()`` callback. Some transmitters may stop the
|
||
|
stream at a frame boundary whereas others stop immediately,
|
||
|
effectively leaving the current frame unfinished. The receiver driver
|
||
|
should not make assumptions either way, but function properly in both
|
||
|
cases.
|
||
|
|
||
|
Receiver drivers
|
||
|
----------------
|
||
|
|
||
|
Before the receiver driver may enable the CSI-2 transmitter by using
|
||
|
the :c:type:`v4l2_subdev_video_ops`->s_stream(), it must have powered
|
||
|
the transmitter up by using the
|
||
|
:c:type:`v4l2_subdev_core_ops`->s_power() callback. This may take
|
||
|
place either indirectly by using :c:func:`v4l2_pipeline_pm_use` or
|
||
|
directly.
|