| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- .. SPDX-License-Identifier: GPL-2.0
- .. include:: <isonum.txt>
- =========================================
- Rockchip Image Signal Processor (rkisp1)
- =========================================
- Introduction
- ============
- This file documents the driver for the Rockchip ISP1 that is part of RK3288
- and RK3399 SoCs. The driver is located under drivers/media/platform/rockchip/
- rkisp1 and uses the Media-Controller API.
- Revisions
- =========
- There exist multiple smaller revisions to this ISP that got introduced in
- later SoCs. Revisions can be found in the enum :c:type:`rkisp1_cif_isp_version`
- in the UAPI and the revision of the ISP inside the running SoC can be read
- in the field hw_revision of struct media_device_info as returned by
- ioctl MEDIA_IOC_DEVICE_INFO.
- Versions in use are:
- - RKISP1_V10: used at least in rk3288 and rk3399
- - RKISP1_V11: declared in the original vendor code, but not used
- - RKISP1_V12: used at least in rk3326 and px30
- - RKISP1_V13: used at least in rk1808
- Topology
- ========
- .. _rkisp1_topology_graph:
- .. kernel-figure:: rkisp1.dot
- :alt: Diagram of the default media pipeline topology
- :align: center
- The driver has 4 video devices:
- - rkisp1_mainpath: capture device for retrieving images, usually in higher
- resolution.
- - rkisp1_selfpath: capture device for retrieving images.
- - rkisp1_stats: a metadata capture device that sends statistics.
- - rkisp1_params: a metadata output device that receives parameters
- configurations from userspace.
- The driver has 3 subdevices:
- - rkisp1_resizer_mainpath: used to resize and downsample frames for the
- mainpath capture device.
- - rkisp1_resizer_selfpath: used to resize and downsample frames for the
- selfpath capture device.
- - rkisp1_isp: is connected to the sensor and is responsible for all the isp
- operations.
- rkisp1_mainpath, rkisp1_selfpath - Frames Capture Video Nodes
- -------------------------------------------------------------
- Those are the `mainpath` and `selfpath` capture devices to capture frames.
- Those entities are the DMA engines that write the frames to memory.
- The selfpath video device can capture YUV/RGB formats. Its input is YUV encoded
- stream and it is able to convert it to RGB. The selfpath is not able to
- capture bayer formats.
- The mainpath can capture both bayer and YUV formats but it is not able to
- capture RGB formats.
- Both capture videos support
- the ``V4L2_CAP_IO_MC`` :ref:`capability <device-capabilities>`.
- rkisp1_resizer_mainpath, rkisp1_resizer_selfpath - Resizers Subdevices Nodes
- ----------------------------------------------------------------------------
- Those are resizer entities for the mainpath and the selfpath. Those entities
- can scale the frames up and down and also change the YUV sampling (for example
- YUV4:2:2 -> YUV4:2:0). They also have cropping capability on the sink pad.
- The resizers entities can only operate on YUV:4:2:2 format
- (MEDIA_BUS_FMT_YUYV8_2X8).
- The mainpath capture device supports capturing video in bayer formats. In that
- case the resizer of the mainpath is set to 'bypass' mode - it just forward the
- frame without operating on it.
- rkisp1_isp - Image Signal Processing Subdevice Node
- ---------------------------------------------------
- This is the isp entity. It is connected to the sensor on sink pad 0 and
- receives the frames using the CSI-2 protocol. It is responsible of configuring
- the CSI-2 protocol. It has a cropping capability on sink pad 0 that is
- connected to the sensor and on source pad 2 connected to the resizer entities.
- Cropping on sink pad 0 defines the image region from the sensor.
- Cropping on source pad 2 defines the region for the Image Stabilizer (IS).
- .. _rkisp1_stats:
- rkisp1_stats - Statistics Video Node
- ------------------------------------
- The statistics video node outputs the 3A (auto focus, auto exposure and auto
- white balance) statistics, and also histogram statistics for the frames that
- are being processed by the rkisp1 to userspace applications.
- Using these data, applications can implement algorithms and re-parameterize
- the driver through the rkisp_params node to improve image quality during a
- video stream.
- The buffer format is defined by struct :c:type:`rkisp1_stat_buffer`, and
- userspace should set
- :ref:`V4L2_META_FMT_RK_ISP1_STAT_3A <v4l2-meta-fmt-rk-isp1-stat-3a>` as the
- dataformat.
- .. _rkisp1_params:
- rkisp1_params - Parameters Video Node
- -------------------------------------
- The rkisp1_params video node receives a set of parameters from userspace
- to be applied to the hardware during a video stream, allowing userspace
- to dynamically modify values such as black level, cross talk corrections
- and others.
- The ISP driver supports two different parameters configuration methods, the
- `fixed parameters format` or the `extensible parameters format`.
- When using the `fixed parameters` method the buffer format is defined by struct
- :c:type:`rkisp1_params_cfg`, and userspace should set
- :ref:`V4L2_META_FMT_RK_ISP1_PARAMS <v4l2-meta-fmt-rk-isp1-params>` as the
- dataformat.
- When using the `extensible parameters` method the buffer format is defined by
- struct :c:type:`rkisp1_ext_params_cfg`, and userspace should set
- :ref:`V4L2_META_FMT_RK_ISP1_EXT_PARAMS <v4l2-meta-fmt-rk-isp1-ext-params>` as
- the dataformat.
- Capturing Video Frames Example
- ==============================
- In the following example, the sensor connected to pad 0 of 'rkisp1_isp' is
- imx219.
- The following commands can be used to capture video from the selfpath video
- node with dimension 900x800 planar format YUV 4:2:2. It uses all cropping
- capabilities possible, (see explanation right below)
- .. code-block:: bash
- # set the links
- "media-ctl" "-d" "platform:rkisp1" "-r"
- "media-ctl" "-d" "platform:rkisp1" "-l" "'imx219 4-0010':0 -> 'rkisp1_isp':0 [1]"
- "media-ctl" "-d" "platform:rkisp1" "-l" "'rkisp1_isp':2 -> 'rkisp1_resizer_selfpath':0 [1]"
- "media-ctl" "-d" "platform:rkisp1" "-l" "'rkisp1_isp':2 -> 'rkisp1_resizer_mainpath':0 [0]"
- # set format for imx219 4-0010:0
- "media-ctl" "-d" "platform:rkisp1" "--set-v4l2" '"imx219 4-0010":0 [fmt:SRGGB10_1X10/1640x1232]'
- # set format for rkisp1_isp pads:
- "media-ctl" "-d" "platform:rkisp1" "--set-v4l2" '"rkisp1_isp":0 [fmt:SRGGB10_1X10/1640x1232 crop: (0,0)/1600x1200]'
- "media-ctl" "-d" "platform:rkisp1" "--set-v4l2" '"rkisp1_isp":2 [fmt:YUYV8_2X8/1600x1200 crop: (0,0)/1500x1100]'
- # set format for rkisp1_resizer_selfpath pads:
- "media-ctl" "-d" "platform:rkisp1" "--set-v4l2" '"rkisp1_resizer_selfpath":0 [fmt:YUYV8_2X8/1500x1100 crop: (300,400)/1400x1000]'
- "media-ctl" "-d" "platform:rkisp1" "--set-v4l2" '"rkisp1_resizer_selfpath":1 [fmt:YUYV8_2X8/900x800]'
- # set format for rkisp1_selfpath:
- "v4l2-ctl" "-z" "platform:rkisp1" "-d" "rkisp1_selfpath" "-v" "width=900,height=800,"
- "v4l2-ctl" "-z" "platform:rkisp1" "-d" "rkisp1_selfpath" "-v" "pixelformat=422P"
- # start streaming:
- v4l2-ctl "-z" "platform:rkisp1" "-d" "rkisp1_selfpath" "--stream-mmap" "--stream-count" "10"
- In the above example the sensor is configured to bayer format:
- `SRGGB10_1X10/1640x1232`. The rkisp1_isp:0 pad should be configured to the
- same mbus format and dimensions as the sensor, otherwise streaming will fail
- with 'EPIPE' error. So it is also configured to `SRGGB10_1X10/1640x1232`.
- In addition, the rkisp1_isp:0 pad is configured to cropping `(0,0)/1600x1200`.
- The cropping dimensions are automatically propagated to be the format of the
- isp source pad `rkisp1_isp:2`. Another cropping operation is configured on
- the isp source pad: `(0,0)/1500x1100`.
- The resizer's sink pad `rkisp1_resizer_selfpath` should be configured to format
- `YUYV8_2X8/1500x1100` in order to match the format on the other side of the
- link. In addition a cropping `(300,400)/1400x1000` is configured on it.
- The source pad of the resizer, `rkisp1_resizer_selfpath:1` is configured to
- format `YUYV8_2X8/900x800`. That means that the resizer first crop a window
- of `(300,400)/1400x100` from the received frame and then scales this window
- to dimension `900x800`.
- Note that the above example does not uses the stats-params control loop.
- Therefore the capture frames will not go through the 3A algorithms and
- probably won't have a good quality, and can even look dark and greenish.
- Configuring Quantization
- ========================
- The driver supports limited and full range quantization on YUV formats,
- where limited is the default.
- To switch between one or the other, userspace should use the Colorspace
- Conversion API (CSC) for subdevices on source pad 2 of the
- isp (`rkisp1_isp:2`). The quantization configured on this pad is the
- quantization of the captured video frames on the mainpath and selfpath
- video nodes.
- Note that the resizer and capture entities will always report
- ``V4L2_QUANTIZATION_DEFAULT`` even if the quantization is configured to full
- range on `rkisp1_isp:2`. So in order to get the configured quantization,
- application should get it from pad `rkisp1_isp:2`.
|