diff mbox series

[4/4] media: docs: create vimc documentation

Message ID 20190613150616.19336-5-andrealmeid@collabora.com (mailing list archive)
State New, archived
Headers show
Series media: vimc: Minor code cleanup and documentation | expand

Commit Message

André Almeida June 13, 2019, 3:06 p.m. UTC
Create vimc documentation file to explain it basics features, it's
topology, how to configure it and to document vimc's subdevices.

Signed-off-by: André Almeida <andrealmeid@collabora.com>
Suggested-by: Helen Koike <helen.koike@collabora.com>
---
 Documentation/media/v4l-drivers/index.rst |  1 +
 Documentation/media/v4l-drivers/vimc.dot  | 22 +++++
 Documentation/media/v4l-drivers/vimc.rst  | 98 +++++++++++++++++++++++
 3 files changed, 121 insertions(+)
 create mode 100644 Documentation/media/v4l-drivers/vimc.dot
 create mode 100644 Documentation/media/v4l-drivers/vimc.rst

Comments

Hans Verkuil June 14, 2019, 7:30 a.m. UTC | #1
Hi André,

Thanks for working one this, very nice to have this documentation.

Some comments below:

On 6/13/19 5:06 PM, André Almeida wrote:
> Create vimc documentation file to explain it basics features, it's
> topology, how to configure it and to document vimc's subdevices.
> 
> Signed-off-by: André Almeida <andrealmeid@collabora.com>
> Suggested-by: Helen Koike <helen.koike@collabora.com>
> ---
>  Documentation/media/v4l-drivers/index.rst |  1 +
>  Documentation/media/v4l-drivers/vimc.dot  | 22 +++++
>  Documentation/media/v4l-drivers/vimc.rst  | 98 +++++++++++++++++++++++
>  3 files changed, 121 insertions(+)
>  create mode 100644 Documentation/media/v4l-drivers/vimc.dot
>  create mode 100644 Documentation/media/v4l-drivers/vimc.rst
> 
> diff --git a/Documentation/media/v4l-drivers/index.rst b/Documentation/media/v4l-drivers/index.rst
> index 33a055907258..c4c78a28654c 100644
> --- a/Documentation/media/v4l-drivers/index.rst
> +++ b/Documentation/media/v4l-drivers/index.rst
> @@ -64,5 +64,6 @@ For more details see the file COPYING in the source distribution of Linux.
>  	si476x
>  	soc-camera
>  	uvcvideo
> +	vimc
>  	vivid
>  	zr364xx
> diff --git a/Documentation/media/v4l-drivers/vimc.dot b/Documentation/media/v4l-drivers/vimc.dot
> new file mode 100644
> index 000000000000..57863a13fa39
> --- /dev/null
> +++ b/Documentation/media/v4l-drivers/vimc.dot
> @@ -0,0 +1,22 @@
> +# SPDX-License-Identifier: GPL-2.0
> +
> +digraph board {
> +	rankdir=TB
> +	n00000001 [label="{{} | Sensor A\n/dev/v4l-subdev0 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
> +	n00000001:port0 -> n00000005:port0 [style=bold]
> +	n00000001:port0 -> n0000000b [style=bold]
> +	n00000003 [label="{{} | Sensor B\n/dev/v4l-subdev1 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
> +	n00000003:port0 -> n00000008:port0 [style=bold]
> +	n00000003:port0 -> n0000000f [style=bold]
> +	n00000005 [label="{{<port0> 0} | Debayer A\n/dev/v4l-subdev2 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
> +	n00000005:port1 -> n00000017:port0
> +	n00000008 [label="{{<port0> 0} | Debayer B\n/dev/v4l-subdev3 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
> +	n00000008:port1 -> n00000017:port0 [style=dashed]
> +	n0000000b [label="Raw Capture 0\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
> +	n0000000f [label="Raw Capture 1\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
> +	n00000013 [label="RGB/YUV Input\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
> +	n00000013 -> n00000017:port0 [style=dashed]
> +	n00000017 [label="{{<port0> 0} | Scaler\n/dev/v4l-subdev4 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
> +	n00000017:port1 -> n0000001a [style=bold]
> +	n0000001a [label="RGB/YUV Capture\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
> +}
> diff --git a/Documentation/media/v4l-drivers/vimc.rst b/Documentation/media/v4l-drivers/vimc.rst
> new file mode 100644
> index 000000000000..bd98c55a0025
> --- /dev/null
> +++ b/Documentation/media/v4l-drivers/vimc.rst
> @@ -0,0 +1,98 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +The Virtual Media Controller Driver (vimc)
> +==========================================
> +
> +The Vimc driver emulates the V4L2 API and the Media API as well. Its goal is to

Vimc -> vimc

It doesn't emulate these APIs, it emulates complex video hardware using these APIs.

> +emulate complex devices and topologies. In the actual state, it has a capture

Drop 'In the actual state, '.

> +device and three subdevices: sensor, debayer and scaler.
> +
> +Topology
> +--------
> +
> +The topology is hardcoded, although you could modify it on vimc-core and

on -> in

> +recompile the driver to achieve your own topology. This is the default topology:
> +
> +.. _vimc_topology_graph:
> +
> +.. kernel-figure:: vimc.dot
> +    :alt:   vimc.dot
> +    :align: center
> +
> +    Media pipeline graph on Vimc
> +
> +Configuring the topology
> +~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +Each subdevice will come with its default configuration (pixelformat, height,
> +width, ...). One needs to configure the topology in order to match the
> +configuration on each linked subdevice to stream frames through the pipeline.
> +If the configuration doesn't match, the stream will fail. The ``v4l2-utils``
> +is a bundle of user-space applications, that comes with ``media-ctl`` and
> +``v4l2-clt`` that can be used in combination to configure. This sequence of

v4l2-clt -> v4l2-ctl

in combination to configure -> to configure the vimc configuration.

> +commands fits for the default topology:
> +
> +.. code-block:: bash
> +
> +        media-ctl -d platform:vimc -V '"Sensor A":0[fmt:SBGGR8_1X8/640x480]'
> +        media-ctl -d platform:vimc -V '"Debayer A":0[fmt:SBGGR8_1X8/640x480]'
> +        media-ctl -d platform:vimc -V '"Sensor B":0[fmt:SBGGR8_1X8/640x480]'
> +        media-ctl -d platform:vimc -V '"Debayer B":0[fmt:SBGGR8_1X8/640x480]'
> +        v4l2-ctl -z platform:vimc -d "RGB/YUV Capture" -v width=1920,height=1440
> +        v4l2-ctl -z platform:vimc -d "Raw Capture 0" -v pixelformat=BA81
> +        v4l2-ctl -z platform:vimc -d "Raw Capture 1" -v pixelformat=BA81
> +
> +Subdevices
> +----------
> +
> +Subdevices define the behavior of an entity in the topology. Depending on the
> +subdevice, the entity can have multiple pads of type source or sink.
> +
> +vimc-sensor:
> +	Generates images in several formats using video test pattern generator.
> +	Exposes:
> +
> +	* 1 Pad source
> +
> +vimc-debayer:
> +	Transforms images in bayer format into a non-bayer format.
> +	Exposes:
> +
> +	* 1 Pad sink
> +	* 1 Pad source
> +
> +vimc-scaler:
> +	Multiplies the size of the image by 9 (this value can be configured,
> +        see at `Modules options`_).

It's a bit ambiguous: I assume you mean that the images is scaled up by a
factor of 3? So 640x480 becomes 1920x1440?

> +	Exposes:
> +
> +	* 1 Pad sink
> +	* 1 Pad source
> +
> +vimc-capture:
> +	Exposes node /dev/videoX to allow userspace to capture the stream.
> +	Exposes:
> +
> +	* 1 Pad sink
> +	* 1 Pad source
> +
> +Modules options

Modules -> Module

> +---------------
> +
> +Vimc has a few module parameters to configure the driver. You should pass
> +those arguments to each subdevice, not for the Vimc module. For example::

for the -> to the

> +
> +        vimc_subvice.param=value

subvice -> subdevice

> +
> +* ``vimc_scaler.sca_mult=<unsigned int>``
> +
> +        Image size multiplier factor to be used to multiply both width and
> +        height, so the image size will be ``sca_mult^2`` bigger than the
> +        original one. Currently, only supports scaling up (the default value
> +        is 3).
> +
> +* ``vimc_debayer.deb_mean_win_size=<unsigned int>``
> +
> +        Window size to calculate the mean. Note: the window size needs to be an
> +        odd number, as the main pixel stays in the center of the window,
> +        otherwise the next odd number is considered (the default value is 3).
> 

Regards,

	Hans
André Almeida June 14, 2019, 2:14 p.m. UTC | #2
Hello Hans,

On 6/14/19 4:30 AM, Hans Verkuil wrote:
> Hi André,
>
> Thanks for working one this, very nice to have this documentation.
>
> Some comments below:
>
> [...]
>
> Regards,
>
> 	Hans
Thanks for the feedback! I saw that 1/4 and 2/4 already are at your [GIT
PULL v5.3], so my v2 should only have 3/4 and 4/4, right?

Thanks,
        André
Hans Verkuil June 15, 2019, 7:32 a.m. UTC | #3
On 6/14/19 4:14 PM, André Almeida wrote:
> Hello Hans,
> 
> On 6/14/19 4:30 AM, Hans Verkuil wrote:
>> Hi André,
>>
>> Thanks for working one this, very nice to have this documentation.
>>
>> Some comments below:
>>
>> [...]
>>
>> Regards,
>>
>> 	Hans
> Thanks for the feedback! I saw that 1/4 and 2/4 already are at your [GIT
> PULL v5.3], so my v2 should only have 3/4 and 4/4, right?

Yes please!

Thanks,

	Hans
diff mbox series

Patch

diff --git a/Documentation/media/v4l-drivers/index.rst b/Documentation/media/v4l-drivers/index.rst
index 33a055907258..c4c78a28654c 100644
--- a/Documentation/media/v4l-drivers/index.rst
+++ b/Documentation/media/v4l-drivers/index.rst
@@ -64,5 +64,6 @@  For more details see the file COPYING in the source distribution of Linux.
 	si476x
 	soc-camera
 	uvcvideo
+	vimc
 	vivid
 	zr364xx
diff --git a/Documentation/media/v4l-drivers/vimc.dot b/Documentation/media/v4l-drivers/vimc.dot
new file mode 100644
index 000000000000..57863a13fa39
--- /dev/null
+++ b/Documentation/media/v4l-drivers/vimc.dot
@@ -0,0 +1,22 @@ 
+# SPDX-License-Identifier: GPL-2.0
+
+digraph board {
+	rankdir=TB
+	n00000001 [label="{{} | Sensor A\n/dev/v4l-subdev0 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
+	n00000001:port0 -> n00000005:port0 [style=bold]
+	n00000001:port0 -> n0000000b [style=bold]
+	n00000003 [label="{{} | Sensor B\n/dev/v4l-subdev1 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
+	n00000003:port0 -> n00000008:port0 [style=bold]
+	n00000003:port0 -> n0000000f [style=bold]
+	n00000005 [label="{{<port0> 0} | Debayer A\n/dev/v4l-subdev2 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
+	n00000005:port1 -> n00000017:port0
+	n00000008 [label="{{<port0> 0} | Debayer B\n/dev/v4l-subdev3 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
+	n00000008:port1 -> n00000017:port0 [style=dashed]
+	n0000000b [label="Raw Capture 0\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
+	n0000000f [label="Raw Capture 1\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
+	n00000013 [label="RGB/YUV Input\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
+	n00000013 -> n00000017:port0 [style=dashed]
+	n00000017 [label="{{<port0> 0} | Scaler\n/dev/v4l-subdev4 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
+	n00000017:port1 -> n0000001a [style=bold]
+	n0000001a [label="RGB/YUV Capture\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
+}
diff --git a/Documentation/media/v4l-drivers/vimc.rst b/Documentation/media/v4l-drivers/vimc.rst
new file mode 100644
index 000000000000..bd98c55a0025
--- /dev/null
+++ b/Documentation/media/v4l-drivers/vimc.rst
@@ -0,0 +1,98 @@ 
+.. SPDX-License-Identifier: GPL-2.0
+
+The Virtual Media Controller Driver (vimc)
+==========================================
+
+The Vimc driver emulates the V4L2 API and the Media API as well. Its goal is to
+emulate complex devices and topologies. In the actual state, it has a capture
+device and three subdevices: sensor, debayer and scaler.
+
+Topology
+--------
+
+The topology is hardcoded, although you could modify it on vimc-core and
+recompile the driver to achieve your own topology. This is the default topology:
+
+.. _vimc_topology_graph:
+
+.. kernel-figure:: vimc.dot
+    :alt:   vimc.dot
+    :align: center
+
+    Media pipeline graph on Vimc
+
+Configuring the topology
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Each subdevice will come with its default configuration (pixelformat, height,
+width, ...). One needs to configure the topology in order to match the
+configuration on each linked subdevice to stream frames through the pipeline.
+If the configuration doesn't match, the stream will fail. The ``v4l2-utils``
+is a bundle of user-space applications, that comes with ``media-ctl`` and
+``v4l2-clt`` that can be used in combination to configure. This sequence of
+commands fits for the default topology:
+
+.. code-block:: bash
+
+        media-ctl -d platform:vimc -V '"Sensor A":0[fmt:SBGGR8_1X8/640x480]'
+        media-ctl -d platform:vimc -V '"Debayer A":0[fmt:SBGGR8_1X8/640x480]'
+        media-ctl -d platform:vimc -V '"Sensor B":0[fmt:SBGGR8_1X8/640x480]'
+        media-ctl -d platform:vimc -V '"Debayer B":0[fmt:SBGGR8_1X8/640x480]'
+        v4l2-ctl -z platform:vimc -d "RGB/YUV Capture" -v width=1920,height=1440
+        v4l2-ctl -z platform:vimc -d "Raw Capture 0" -v pixelformat=BA81
+        v4l2-ctl -z platform:vimc -d "Raw Capture 1" -v pixelformat=BA81
+
+Subdevices
+----------
+
+Subdevices define the behavior of an entity in the topology. Depending on the
+subdevice, the entity can have multiple pads of type source or sink.
+
+vimc-sensor:
+	Generates images in several formats using video test pattern generator.
+	Exposes:
+
+	* 1 Pad source
+
+vimc-debayer:
+	Transforms images in bayer format into a non-bayer format.
+	Exposes:
+
+	* 1 Pad sink
+	* 1 Pad source
+
+vimc-scaler:
+	Multiplies the size of the image by 9 (this value can be configured,
+        see at `Modules options`_).
+	Exposes:
+
+	* 1 Pad sink
+	* 1 Pad source
+
+vimc-capture:
+	Exposes node /dev/videoX to allow userspace to capture the stream.
+	Exposes:
+
+	* 1 Pad sink
+	* 1 Pad source
+
+Modules options
+---------------
+
+Vimc has a few module parameters to configure the driver. You should pass
+those arguments to each subdevice, not for the Vimc module. For example::
+
+        vimc_subvice.param=value
+
+* ``vimc_scaler.sca_mult=<unsigned int>``
+
+        Image size multiplier factor to be used to multiply both width and
+        height, so the image size will be ``sca_mult^2`` bigger than the
+        original one. Currently, only supports scaling up (the default value
+        is 3).
+
+* ``vimc_debayer.deb_mean_win_size=<unsigned int>``
+
+        Window size to calculate the mean. Note: the window size needs to be an
+        odd number, as the main pixel stays in the center of the window,
+        otherwise the next odd number is considered (the default value is 3).