| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600 |
- .. SPDX-License-Identifier: GPL-2.0
- .. include:: <isonum.txt>
- ===============================================================
- Intel Image Processing Unit 3 (IPU3) Imaging Unit (ImgU) driver
- ===============================================================
- Copyright |copy| 2018 Intel Corporation
- Introduction
- ============
- This file documents the Intel IPU3 (3rd generation Image Processing Unit)
- Imaging Unit drivers located under drivers/media/pci/intel/ipu3 (CIO2) as well
- as under drivers/staging/media/ipu3 (ImgU).
- The Intel IPU3 found in certain Kaby Lake (as well as certain Sky Lake)
- platforms (U/Y processor lines) is made up of two parts namely the Imaging Unit
- (ImgU) and the CIO2 device (MIPI CSI2 receiver).
- The CIO2 device receives the raw Bayer data from the sensors and outputs the
- frames in a format that is specific to the IPU3 (for consumption by the IPU3
- ImgU). The CIO2 driver is available as drivers/media/pci/intel/ipu3/ipu3-cio2*
- and is enabled through the CONFIG_VIDEO_IPU3_CIO2 config option.
- The Imaging Unit (ImgU) is responsible for processing images captured
- by the IPU3 CIO2 device. The ImgU driver sources can be found under
- drivers/staging/media/ipu3 directory. The driver is enabled through the
- CONFIG_VIDEO_IPU3_IMGU config option.
- The two driver modules are named ipu3_csi2 and ipu3_imgu, respectively.
- The drivers has been tested on Kaby Lake platforms (U/Y processor lines).
- Both of the drivers implement V4L2, Media Controller and V4L2 sub-device
- interfaces. The IPU3 CIO2 driver supports camera sensors connected to the CIO2
- MIPI CSI-2 interfaces through V4L2 sub-device sensor drivers.
- CIO2
- ====
- The CIO2 is represented as a single V4L2 subdev, which provides a V4L2 subdev
- interface to the user space. There is a video node for each CSI-2 receiver,
- with a single media controller interface for the entire device.
- The CIO2 contains four independent capture channel, each with its own MIPI CSI-2
- receiver and DMA engine. Each channel is modelled as a V4L2 sub-device exposed
- to userspace as a V4L2 sub-device node and has two pads:
- .. tabularcolumns:: |p{0.8cm}|p{4.0cm}|p{4.0cm}|
- .. flat-table::
- :header-rows: 1
- * - Pad
- - Direction
- - Purpose
- * - 0
- - sink
- - MIPI CSI-2 input, connected to the sensor subdev
- * - 1
- - source
- - Raw video capture, connected to the V4L2 video interface
- The V4L2 video interfaces model the DMA engines. They are exposed to userspace
- as V4L2 video device nodes.
- Capturing frames in raw Bayer format
- ------------------------------------
- CIO2 MIPI CSI2 receiver is used to capture frames (in packed raw Bayer format)
- from the raw sensors connected to the CSI2 ports. The captured frames are used
- as input to the ImgU driver.
- Image processing using IPU3 ImgU requires tools such as raw2pnm [#f1]_, and
- yavta [#f2]_ due to the following unique requirements and / or features specific
- to IPU3.
- -- The IPU3 CSI2 receiver outputs the captured frames from the sensor in packed
- raw Bayer format that is specific to IPU3.
- -- Multiple video nodes have to be operated simultaneously.
- Let us take the example of ov5670 sensor connected to CSI2 port 0, for a
- 2592x1944 image capture.
- Using the media controller APIs, the ov5670 sensor is configured to send
- frames in packed raw Bayer format to IPU3 CSI2 receiver.
- .. code-block:: none
- # This example assumes /dev/media0 as the CIO2 media device
- export MDEV=/dev/media0
- # and that ov5670 sensor is connected to i2c bus 10 with address 0x36
- export SDEV=$(media-ctl -d $MDEV -e "ov5670 10-0036")
- # Establish the link for the media devices using media-ctl [#f3]_
- media-ctl -d $MDEV -l "ov5670:0 -> ipu3-csi2 0:0[1]"
- # Set the format for the media devices
- media-ctl -d $MDEV -V "ov5670:0 [fmt:SGRBG10/2592x1944]"
- media-ctl -d $MDEV -V "ipu3-csi2 0:0 [fmt:SGRBG10/2592x1944]"
- media-ctl -d $MDEV -V "ipu3-csi2 0:1 [fmt:SGRBG10/2592x1944]"
- Once the media pipeline is configured, desired sensor specific settings
- (such as exposure and gain settings) can be set, using the yavta tool.
- e.g
- .. code-block:: none
- yavta -w 0x009e0903 444 $SDEV
- yavta -w 0x009e0913 1024 $SDEV
- yavta -w 0x009e0911 2046 $SDEV
- Once the desired sensor settings are set, frame captures can be done as below.
- e.g
- .. code-block:: none
- yavta --data-prefix -u -c10 -n5 -I -s2592x1944 --file=/tmp/frame-#.bin \
- -f IPU3_SGRBG10 $(media-ctl -d $MDEV -e "ipu3-cio2 0")
- With the above command, 10 frames are captured at 2592x1944 resolution, with
- sGRBG10 format and output as IPU3_SGRBG10 format.
- The captured frames are available as /tmp/frame-#.bin files.
- ImgU
- ====
- The ImgU is represented as two V4L2 subdevs, each of which provides a V4L2
- subdev interface to the user space.
- Each V4L2 subdev represents a pipe, which can support a maximum of 2 streams.
- This helps to support advanced camera features like Continuous View Finder (CVF)
- and Snapshot During Video(SDV).
- The ImgU contains two independent pipes, each modelled as a V4L2 sub-device
- exposed to userspace as a V4L2 sub-device node.
- Each pipe has two sink pads and three source pads for the following purpose:
- .. tabularcolumns:: |p{0.8cm}|p{4.0cm}|p{4.0cm}|
- .. flat-table::
- :header-rows: 1
- * - Pad
- - Direction
- - Purpose
- * - 0
- - sink
- - Input raw video stream
- * - 1
- - sink
- - Processing parameters
- * - 2
- - source
- - Output processed video stream
- * - 3
- - source
- - Output viewfinder video stream
- * - 4
- - source
- - 3A statistics
- Each pad is connected to a corresponding V4L2 video interface, exposed to
- userspace as a V4L2 video device node.
- Device operation
- ----------------
- With ImgU, once the input video node ("ipu3-imgu 0/1":0, in
- <entity>:<pad-number> format) is queued with buffer (in packed raw Bayer
- format), ImgU starts processing the buffer and produces the video output in YUV
- format and statistics output on respective output nodes. The driver is expected
- to have buffers ready for all of parameter, output and statistics nodes, when
- input video node is queued with buffer.
- At a minimum, all of input, main output, 3A statistics and viewfinder
- video nodes should be enabled for IPU3 to start image processing.
- Each ImgU V4L2 subdev has the following set of video nodes.
- input, output and viewfinder video nodes
- ----------------------------------------
- The frames (in packed raw Bayer format specific to the IPU3) received by the
- input video node is processed by the IPU3 Imaging Unit and are output to 2 video
- nodes, with each targeting a different purpose (main output and viewfinder
- output).
- Details onand the Bayer format specific to the IPU3 can be found in
- :ref:`v4l2-pix-fmt-ipu3-sbggr10`.
- The driver supports V4L2 Video Capture Interface as defined at :ref:`devices`.
- Only the multi-planar API is supported. More details can be found at
- :ref:`planar-apis`.
- Parameters video node
- ---------------------
- The parameters video node receives the ImgU algorithm parameters that are used
- to configure how the ImgU algorithms process the image.
- Details on processing parameters specific to the IPU3 can be found in
- :ref:`v4l2-meta-fmt-params`.
- 3A statistics video node
- ------------------------
- 3A statistics video node is used by the ImgU driver to output the 3A (auto
- focus, auto exposure and auto white balance) statistics for the frames that are
- being processed by the ImgU to user space applications. User space applications
- can use this statistics data to compute the desired algorithm parameters for
- the ImgU.
- Configuring the Intel IPU3
- ==========================
- The IPU3 ImgU pipelines can be configured using the Media Controller, defined at
- :ref:`media_controller`.
- Running mode and firmware binary selection
- ------------------------------------------
- ImgU works based on firmware, currently the ImgU firmware support run 2 pipes
- in time-sharing with single input frame data. Each pipe can run at certain mode
- - "VIDEO" or "STILL", "VIDEO" mode is commonly used for video frames capture,
- and "STILL" is used for still frame capture. However, you can also select
- "VIDEO" to capture still frames if you want to capture images with less system
- load and power. For "STILL" mode, ImgU will try to use smaller BDS factor and
- output larger bayer frame for further YUV processing than "VIDEO" mode to get
- high quality images. Besides, "STILL" mode need XNR3 to do noise reduction,
- hence "STILL" mode will need more power and memory bandwidth than "VIDEO" mode.
- TNR will be enabled in "VIDEO" mode and bypassed by "STILL" mode. ImgU is
- running at "VIDEO" mode by default, the user can use v4l2 control
- V4L2_CID_INTEL_IPU3_MODE (currently defined in
- drivers/staging/media/ipu3/include/uapi/intel-ipu3.h) to query and set the
- running mode. For user, there is no difference for buffer queueing between the
- "VIDEO" and "STILL" mode, mandatory input and main output node should be
- enabled and buffers need be queued, the statistics and the view-finder queues
- are optional.
- The firmware binary will be selected according to current running mode, such log
- "using binary if_to_osys_striped " or "using binary if_to_osys_primary_striped"
- could be observed if you enable the ImgU dynamic debug, the binary
- if_to_osys_striped is selected for "VIDEO" and the binary
- "if_to_osys_primary_striped" is selected for "STILL".
- Processing the image in raw Bayer format
- ----------------------------------------
- Configuring ImgU V4L2 subdev for image processing
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The ImgU V4L2 subdevs have to be configured with media controller APIs to have
- all the video nodes setup correctly.
- Let us take "ipu3-imgu 0" subdev as an example.
- .. code-block:: none
- media-ctl -d $MDEV -r
- media-ctl -d $MDEV -l "ipu3-imgu 0 input":0 -> "ipu3-imgu 0":0[1]
- media-ctl -d $MDEV -l "ipu3-imgu 0":2 -> "ipu3-imgu 0 output":0[1]
- media-ctl -d $MDEV -l "ipu3-imgu 0":3 -> "ipu3-imgu 0 viewfinder":0[1]
- media-ctl -d $MDEV -l "ipu3-imgu 0":4 -> "ipu3-imgu 0 3a stat":0[1]
- Also the pipe mode of the corresponding V4L2 subdev should be set as desired
- (e.g 0 for video mode or 1 for still mode) through the control id 0x009819a1 as
- below.
- .. code-block:: none
- yavta -w "0x009819A1 1" /dev/v4l-subdev7
- Certain hardware blocks in ImgU pipeline can change the frame resolution by
- cropping or scaling, these hardware blocks include Input Feeder(IF), Bayer Down
- Scaler (BDS) and Geometric Distortion Correction (GDC).
- There is also a block which can change the frame resolution - YUV Scaler, it is
- only applicable to the secondary output.
- RAW Bayer frames go through these ImgU pipeline hardware blocks and the final
- processed image output to the DDR memory.
- .. kernel-figure:: ipu3_rcb.svg
- :alt: ipu3 resolution blocks image
- IPU3 resolution change hardware blocks
- **Input Feeder**
- Input Feeder gets the Bayer frame data from the sensor, it can enable cropping
- of lines and columns from the frame and then store pixels into device's internal
- pixel buffer which are ready to readout by following blocks.
- **Bayer Down Scaler**
- Bayer Down Scaler is capable of performing image scaling in Bayer domain, the
- downscale factor can be configured from 1X to 1/4X in each axis with
- configuration steps of 0.03125 (1/32).
- **Geometric Distortion Correction**
- Geometric Distortion Correction is used to perform correction of distortions
- and image filtering. It needs some extra filter and envelope padding pixels to
- work, so the input resolution of GDC should be larger than the output
- resolution.
- **YUV Scaler**
- YUV Scaler which similar with BDS, but it is mainly do image down scaling in
- YUV domain, it can support up to 1/12X down scaling, but it can not be applied
- to the main output.
- The ImgU V4L2 subdev has to be configured with the supported resolutions in all
- the above hardware blocks, for a given input resolution.
- For a given supported resolution for an input frame, the Input Feeder, Bayer
- Down Scaler and GDC blocks should be configured with the supported resolutions
- as each hardware block has its own alignment requirement.
- You must configure the output resolution of the hardware blocks smartly to meet
- the hardware requirement along with keeping the maximum field of view. The
- intermediate resolutions can be generated by specific tool -
- https://github.com/intel/intel-ipu3-pipecfg
- This tool can be used to generate intermediate resolutions. More information can
- be obtained by looking at the following IPU3 ImgU configuration table.
- https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master
- Under baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/files/gcss
- directory, graph_settings_ov5670.xml can be used as an example.
- The following steps prepare the ImgU pipeline for the image processing.
- 1. The ImgU V4L2 subdev data format should be set by using the
- VIDIOC_SUBDEV_S_FMT on pad 0, using the GDC width and height obtained above.
- 2. The ImgU V4L2 subdev cropping should be set by using the
- VIDIOC_SUBDEV_S_SELECTION on pad 0, with V4L2_SEL_TGT_CROP as the target,
- using the input feeder height and width.
- 3. The ImgU V4L2 subdev composing should be set by using the
- VIDIOC_SUBDEV_S_SELECTION on pad 0, with V4L2_SEL_TGT_COMPOSE as the target,
- using the BDS height and width.
- For the ov5670 example, for an input frame with a resolution of 2592x1944
- (which is input to the ImgU subdev pad 0), the corresponding resolutions
- for input feeder, BDS and GDC are 2592x1944, 2592x1944 and 2560x1920
- respectively.
- Once this is done, the received raw Bayer frames can be input to the ImgU
- V4L2 subdev as below, using the open source application v4l2n [#f1]_.
- For an image captured with 2592x1944 [#f4]_ resolution, with desired output
- resolution as 2560x1920 and viewfinder resolution as 2560x1920, the following
- v4l2n command can be used. This helps process the raw Bayer frames and produces
- the desired results for the main output image and the viewfinder output, in NV12
- format.
- .. code-block:: none
- v4l2n --pipe=4 --load=/tmp/frame-#.bin --open=/dev/video4
- --fmt=type:VIDEO_OUTPUT_MPLANE,width=2592,height=1944,pixelformat=0X47337069 \
- --reqbufs=type:VIDEO_OUTPUT_MPLANE,count:1 --pipe=1 \
- --output=/tmp/frames.out --open=/dev/video5 \
- --fmt=type:VIDEO_CAPTURE_MPLANE,width=2560,height=1920,pixelformat=NV12 \
- --reqbufs=type:VIDEO_CAPTURE_MPLANE,count:1 --pipe=2 \
- --output=/tmp/frames.vf --open=/dev/video6 \
- --fmt=type:VIDEO_CAPTURE_MPLANE,width=2560,height=1920,pixelformat=NV12 \
- --reqbufs=type:VIDEO_CAPTURE_MPLANE,count:1 --pipe=3 --open=/dev/video7 \
- --output=/tmp/frames.3A --fmt=type:META_CAPTURE,? \
- --reqbufs=count:1,type:META_CAPTURE --pipe=1,2,3,4 --stream=5
- You can also use yavta [#f2]_ command to do same thing as above:
- .. code-block:: none
- yavta --data-prefix -Bcapture-mplane -c10 -n5 -I -s2592x1944 \
- --file=frame-#.out-f NV12 /dev/video5 & \
- yavta --data-prefix -Bcapture-mplane -c10 -n5 -I -s2592x1944 \
- --file=frame-#.vf -f NV12 /dev/video6 & \
- yavta --data-prefix -Bmeta-capture -c10 -n5 -I \
- --file=frame-#.3a /dev/video7 & \
- yavta --data-prefix -Boutput-mplane -c10 -n5 -I -s2592x1944 \
- --file=/tmp/frame-in.cio2 -f IPU3_SGRBG10 /dev/video4
- where /dev/video4, /dev/video5, /dev/video6 and /dev/video7 devices point to
- input, output, viewfinder and 3A statistics video nodes respectively.
- Converting the raw Bayer image into YUV domain
- ----------------------------------------------
- The processed images after the above step, can be converted to YUV domain
- as below.
- Main output frames
- ~~~~~~~~~~~~~~~~~~
- .. code-block:: none
- raw2pnm -x2560 -y1920 -fNV12 /tmp/frames.out /tmp/frames.out.ppm
- where 2560x1920 is output resolution, NV12 is the video format, followed
- by input frame and output PNM file.
- Viewfinder output frames
- ~~~~~~~~~~~~~~~~~~~~~~~~
- .. code-block:: none
- raw2pnm -x2560 -y1920 -fNV12 /tmp/frames.vf /tmp/frames.vf.ppm
- where 2560x1920 is output resolution, NV12 is the video format, followed
- by input frame and output PNM file.
- Example user space code for IPU3
- ================================
- User space code that configures and uses IPU3 is available here.
- https://chromium.googlesource.com/chromiumos/platform/arc-camera/+/master/
- The source can be located under hal/intel directory.
- Overview of IPU3 pipeline
- =========================
- IPU3 pipeline has a number of image processing stages, each of which takes a
- set of parameters as input. The major stages of pipelines are shown here:
- .. kernel-render:: DOT
- :alt: IPU3 ImgU Pipeline
- :caption: IPU3 ImgU Pipeline Diagram
- digraph "IPU3 ImgU" {
- node [shape=box]
- splines="ortho"
- rankdir="LR"
- a [label="Raw pixels"]
- b [label="Bayer Downscaling"]
- c [label="Optical Black Correction"]
- d [label="Linearization"]
- e [label="Lens Shading Correction"]
- f [label="White Balance / Exposure / Focus Apply"]
- g [label="Bayer Noise Reduction"]
- h [label="ANR"]
- i [label="Demosaicing"]
- j [label="Color Correction Matrix"]
- k [label="Gamma correction"]
- l [label="Color Space Conversion"]
- m [label="Chroma Down Scaling"]
- n [label="Chromatic Noise Reduction"]
- o [label="Total Color Correction"]
- p [label="XNR3"]
- q [label="TNR"]
- r [label="DDR", style=filled, fillcolor=yellow, shape=cylinder]
- s [label="YUV Downscaling"]
- t [label="DDR", style=filled, fillcolor=yellow, shape=cylinder]
- { rank=same; a -> b -> c -> d -> e -> f -> g -> h -> i }
- { rank=same; j -> k -> l -> m -> n -> o -> p -> q -> s -> t}
- a -> j [style=invis, weight=10]
- i -> j
- q -> r
- }
- The table below presents a description of the above algorithms.
- ======================== =======================================================
- Name Description
- ======================== =======================================================
- Optical Black Correction Optical Black Correction block subtracts a pre-defined
- value from the respective pixel values to obtain better
- image quality.
- Defined in struct ipu3_uapi_obgrid_param.
- Linearization This algo block uses linearization parameters to
- address non-linearity sensor effects. The Lookup table
- table is defined in
- struct ipu3_uapi_isp_lin_vmem_params.
- SHD Lens shading correction is used to correct spatial
- non-uniformity of the pixel response due to optical
- lens shading. This is done by applying a different gain
- for each pixel. The gain, black level etc are
- configured in struct ipu3_uapi_shd_config_static.
- BNR Bayer noise reduction block removes image noise by
- applying a bilateral filter.
- See struct ipu3_uapi_bnr_static_config for details.
- ANR Advanced Noise Reduction is a block based algorithm
- that performs noise reduction in the Bayer domain. The
- convolution matrix etc can be found in
- struct ipu3_uapi_anr_config.
- DM Demosaicing converts raw sensor data in Bayer format
- into RGB (Red, Green, Blue) presentation. Then add
- outputs of estimation of Y channel for following stream
- processing by Firmware. The struct is defined as
- struct ipu3_uapi_dm_config.
- Color Correction Color Correction algo transforms sensor specific color
- space to the standard "sRGB" color space. This is done
- by applying 3x3 matrix defined in
- struct ipu3_uapi_ccm_mat_config.
- Gamma correction Gamma correction struct ipu3_uapi_gamma_config is a
- basic non-linear tone mapping correction that is
- applied per pixel for each pixel component.
- CSC Color space conversion transforms each pixel from the
- RGB primary presentation to YUV (Y: brightness,
- UV: Luminance) presentation. This is done by applying
- a 3x3 matrix defined in
- struct ipu3_uapi_csc_mat_config
- CDS Chroma down sampling
- After the CSC is performed, the Chroma Down Sampling
- is applied for a UV plane down sampling by a factor
- of 2 in each direction for YUV 4:2:0 using a 4x2
- configurable filter struct ipu3_uapi_cds_params.
- CHNR Chroma noise reduction
- This block processes only the chrominance pixels and
- performs noise reduction by cleaning the high
- frequency noise.
- See struct struct ipu3_uapi_yuvp1_chnr_config.
- TCC Total color correction as defined in struct
- struct ipu3_uapi_yuvp2_tcc_static_config.
- XNR3 eXtreme Noise Reduction V3 is the third revision of
- noise reduction algorithm used to improve image
- quality. This removes the low frequency noise in the
- captured image. Two related structs are being defined,
- struct ipu3_uapi_isp_xnr3_params for ISP data memory
- and struct ipu3_uapi_isp_xnr3_vmem_params for vector
- memory.
- TNR Temporal Noise Reduction block compares successive
- frames in time to remove anomalies / noise in pixel
- values. struct ipu3_uapi_isp_tnr3_vmem_params and
- struct ipu3_uapi_isp_tnr3_params are defined for ISP
- vector and data memory respectively.
- ======================== =======================================================
- Other often encountered acronyms not listed in above table:
- ACC
- Accelerator cluster
- AWB_FR
- Auto white balance filter response statistics
- BDS
- Bayer downscaler parameters
- CCM
- Color correction matrix coefficients
- IEFd
- Image enhancement filter directed
- Obgrid
- Optical black level compensation
- OSYS
- Output system configuration
- ROI
- Region of interest
- YDS
- Y down sampling
- YTM
- Y-tone mapping
- A few stages of the pipeline will be executed by firmware running on the ISP
- processor, while many others will use a set of fixed hardware blocks also
- called accelerator cluster (ACC) to crunch pixel data and produce statistics.
- ACC parameters of individual algorithms, as defined by
- struct ipu3_uapi_acc_param, can be chosen to be applied by the user
- space through struct struct ipu3_uapi_flags embedded in
- struct ipu3_uapi_params structure. For parameters that are configured as
- not enabled by the user space, the corresponding structs are ignored by the
- driver, in which case the existing configuration of the algorithm will be
- preserved.
- References
- ==========
- .. [#f5] drivers/staging/media/ipu3/include/uapi/intel-ipu3.h
- .. [#f1] https://github.com/intel/nvt
- .. [#f2] http://git.ideasonboard.org/yavta.git
- .. [#f3] http://git.ideasonboard.org/?p=media-ctl.git;a=summary
- .. [#f4] ImgU limitation requires an additional 16x16 for all input resolutions
|