1*32e2eae2SMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0 2*32e2eae2SMauro Carvalho Chehab 3*32e2eae2SMauro Carvalho Chehab.. include:: <isonum.txt> 4*32e2eae2SMauro Carvalho Chehab 5*32e2eae2SMauro Carvalho Chehab=============================================================== 6*32e2eae2SMauro Carvalho ChehabIntel Image Processing Unit 3 (IPU3) Imaging Unit (ImgU) driver 7*32e2eae2SMauro Carvalho Chehab=============================================================== 8*32e2eae2SMauro Carvalho Chehab 9*32e2eae2SMauro Carvalho ChehabCopyright |copy| 2018 Intel Corporation 10*32e2eae2SMauro Carvalho Chehab 11*32e2eae2SMauro Carvalho ChehabIntroduction 12*32e2eae2SMauro Carvalho Chehab============ 13*32e2eae2SMauro Carvalho Chehab 14*32e2eae2SMauro Carvalho ChehabThis file documents the Intel IPU3 (3rd generation Image Processing Unit) 15*32e2eae2SMauro Carvalho ChehabImaging Unit drivers located under drivers/media/pci/intel/ipu3 (CIO2) as well 16*32e2eae2SMauro Carvalho Chehabas under drivers/staging/media/ipu3 (ImgU). 17*32e2eae2SMauro Carvalho Chehab 18*32e2eae2SMauro Carvalho ChehabThe Intel IPU3 found in certain Kaby Lake (as well as certain Sky Lake) 19*32e2eae2SMauro Carvalho Chehabplatforms (U/Y processor lines) is made up of two parts namely the Imaging Unit 20*32e2eae2SMauro Carvalho Chehab(ImgU) and the CIO2 device (MIPI CSI2 receiver). 21*32e2eae2SMauro Carvalho Chehab 22*32e2eae2SMauro Carvalho ChehabThe CIO2 device receives the raw Bayer data from the sensors and outputs the 23*32e2eae2SMauro Carvalho Chehabframes in a format that is specific to the IPU3 (for consumption by the IPU3 24*32e2eae2SMauro Carvalho ChehabImgU). The CIO2 driver is available as drivers/media/pci/intel/ipu3/ipu3-cio2* 25*32e2eae2SMauro Carvalho Chehaband is enabled through the CONFIG_VIDEO_IPU3_CIO2 config option. 26*32e2eae2SMauro Carvalho Chehab 27*32e2eae2SMauro Carvalho ChehabThe Imaging Unit (ImgU) is responsible for processing images captured 28*32e2eae2SMauro Carvalho Chehabby the IPU3 CIO2 device. The ImgU driver sources can be found under 29*32e2eae2SMauro Carvalho Chehabdrivers/staging/media/ipu3 directory. The driver is enabled through the 30*32e2eae2SMauro Carvalho ChehabCONFIG_VIDEO_IPU3_IMGU config option. 31*32e2eae2SMauro Carvalho Chehab 32*32e2eae2SMauro Carvalho ChehabThe two driver modules are named ipu3_csi2 and ipu3_imgu, respectively. 33*32e2eae2SMauro Carvalho Chehab 34*32e2eae2SMauro Carvalho ChehabThe drivers has been tested on Kaby Lake platforms (U/Y processor lines). 35*32e2eae2SMauro Carvalho Chehab 36*32e2eae2SMauro Carvalho ChehabBoth of the drivers implement V4L2, Media Controller and V4L2 sub-device 37*32e2eae2SMauro Carvalho Chehabinterfaces. The IPU3 CIO2 driver supports camera sensors connected to the CIO2 38*32e2eae2SMauro Carvalho ChehabMIPI CSI-2 interfaces through V4L2 sub-device sensor drivers. 39*32e2eae2SMauro Carvalho Chehab 40*32e2eae2SMauro Carvalho ChehabCIO2 41*32e2eae2SMauro Carvalho Chehab==== 42*32e2eae2SMauro Carvalho Chehab 43*32e2eae2SMauro Carvalho ChehabThe CIO2 is represented as a single V4L2 subdev, which provides a V4L2 subdev 44*32e2eae2SMauro Carvalho Chehabinterface to the user space. There is a video node for each CSI-2 receiver, 45*32e2eae2SMauro Carvalho Chehabwith a single media controller interface for the entire device. 46*32e2eae2SMauro Carvalho Chehab 47*32e2eae2SMauro Carvalho ChehabThe CIO2 contains four independent capture channel, each with its own MIPI CSI-2 48*32e2eae2SMauro Carvalho Chehabreceiver and DMA engine. Each channel is modelled as a V4L2 sub-device exposed 49*32e2eae2SMauro Carvalho Chehabto userspace as a V4L2 sub-device node and has two pads: 50*32e2eae2SMauro Carvalho Chehab 51*32e2eae2SMauro Carvalho Chehab.. tabularcolumns:: |p{0.8cm}|p{4.0cm}|p{4.0cm}| 52*32e2eae2SMauro Carvalho Chehab 53*32e2eae2SMauro Carvalho Chehab.. flat-table:: 54*32e2eae2SMauro Carvalho Chehab 55*32e2eae2SMauro Carvalho Chehab * - pad 56*32e2eae2SMauro Carvalho Chehab - direction 57*32e2eae2SMauro Carvalho Chehab - purpose 58*32e2eae2SMauro Carvalho Chehab 59*32e2eae2SMauro Carvalho Chehab * - 0 60*32e2eae2SMauro Carvalho Chehab - sink 61*32e2eae2SMauro Carvalho Chehab - MIPI CSI-2 input, connected to the sensor subdev 62*32e2eae2SMauro Carvalho Chehab 63*32e2eae2SMauro Carvalho Chehab * - 1 64*32e2eae2SMauro Carvalho Chehab - source 65*32e2eae2SMauro Carvalho Chehab - Raw video capture, connected to the V4L2 video interface 66*32e2eae2SMauro Carvalho Chehab 67*32e2eae2SMauro Carvalho ChehabThe V4L2 video interfaces model the DMA engines. They are exposed to userspace 68*32e2eae2SMauro Carvalho Chehabas V4L2 video device nodes. 69*32e2eae2SMauro Carvalho Chehab 70*32e2eae2SMauro Carvalho ChehabCapturing frames in raw Bayer format 71*32e2eae2SMauro Carvalho Chehab------------------------------------ 72*32e2eae2SMauro Carvalho Chehab 73*32e2eae2SMauro Carvalho ChehabCIO2 MIPI CSI2 receiver is used to capture frames (in packed raw Bayer format) 74*32e2eae2SMauro Carvalho Chehabfrom the raw sensors connected to the CSI2 ports. The captured frames are used 75*32e2eae2SMauro Carvalho Chehabas input to the ImgU driver. 76*32e2eae2SMauro Carvalho Chehab 77*32e2eae2SMauro Carvalho ChehabImage processing using IPU3 ImgU requires tools such as raw2pnm [#f1]_, and 78*32e2eae2SMauro Carvalho Chehabyavta [#f2]_ due to the following unique requirements and / or features specific 79*32e2eae2SMauro Carvalho Chehabto IPU3. 80*32e2eae2SMauro Carvalho Chehab 81*32e2eae2SMauro Carvalho Chehab-- The IPU3 CSI2 receiver outputs the captured frames from the sensor in packed 82*32e2eae2SMauro Carvalho Chehabraw Bayer format that is specific to IPU3. 83*32e2eae2SMauro Carvalho Chehab 84*32e2eae2SMauro Carvalho Chehab-- Multiple video nodes have to be operated simultaneously. 85*32e2eae2SMauro Carvalho Chehab 86*32e2eae2SMauro Carvalho ChehabLet us take the example of ov5670 sensor connected to CSI2 port 0, for a 87*32e2eae2SMauro Carvalho Chehab2592x1944 image capture. 88*32e2eae2SMauro Carvalho Chehab 89*32e2eae2SMauro Carvalho ChehabUsing the media contorller APIs, the ov5670 sensor is configured to send 90*32e2eae2SMauro Carvalho Chehabframes in packed raw Bayer format to IPU3 CSI2 receiver. 91*32e2eae2SMauro Carvalho Chehab 92*32e2eae2SMauro Carvalho Chehab# This example assumes /dev/media0 as the CIO2 media device 93*32e2eae2SMauro Carvalho Chehab 94*32e2eae2SMauro Carvalho Chehabexport MDEV=/dev/media0 95*32e2eae2SMauro Carvalho Chehab 96*32e2eae2SMauro Carvalho Chehab# and that ov5670 sensor is connected to i2c bus 10 with address 0x36 97*32e2eae2SMauro Carvalho Chehab 98*32e2eae2SMauro Carvalho Chehabexport SDEV=$(media-ctl -d $MDEV -e "ov5670 10-0036") 99*32e2eae2SMauro Carvalho Chehab 100*32e2eae2SMauro Carvalho Chehab# Establish the link for the media devices using media-ctl [#f3]_ 101*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ov5670:0 -> ipu3-csi2 0:0[1]" 102*32e2eae2SMauro Carvalho Chehab 103*32e2eae2SMauro Carvalho Chehab# Set the format for the media devices 104*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -V "ov5670:0 [fmt:SGRBG10/2592x1944]" 105*32e2eae2SMauro Carvalho Chehab 106*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -V "ipu3-csi2 0:0 [fmt:SGRBG10/2592x1944]" 107*32e2eae2SMauro Carvalho Chehab 108*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -V "ipu3-csi2 0:1 [fmt:SGRBG10/2592x1944]" 109*32e2eae2SMauro Carvalho Chehab 110*32e2eae2SMauro Carvalho ChehabOnce the media pipeline is configured, desired sensor specific settings 111*32e2eae2SMauro Carvalho Chehab(such as exposure and gain settings) can be set, using the yavta tool. 112*32e2eae2SMauro Carvalho Chehab 113*32e2eae2SMauro Carvalho Chehabe.g 114*32e2eae2SMauro Carvalho Chehab 115*32e2eae2SMauro Carvalho Chehabyavta -w 0x009e0903 444 $SDEV 116*32e2eae2SMauro Carvalho Chehab 117*32e2eae2SMauro Carvalho Chehabyavta -w 0x009e0913 1024 $SDEV 118*32e2eae2SMauro Carvalho Chehab 119*32e2eae2SMauro Carvalho Chehabyavta -w 0x009e0911 2046 $SDEV 120*32e2eae2SMauro Carvalho Chehab 121*32e2eae2SMauro Carvalho ChehabOnce the desired sensor settings are set, frame captures can be done as below. 122*32e2eae2SMauro Carvalho Chehab 123*32e2eae2SMauro Carvalho Chehabe.g 124*32e2eae2SMauro Carvalho Chehab 125*32e2eae2SMauro Carvalho Chehabyavta --data-prefix -u -c10 -n5 -I -s2592x1944 --file=/tmp/frame-#.bin \ 126*32e2eae2SMauro Carvalho Chehab -f IPU3_SGRBG10 $(media-ctl -d $MDEV -e "ipu3-cio2 0") 127*32e2eae2SMauro Carvalho Chehab 128*32e2eae2SMauro Carvalho ChehabWith the above command, 10 frames are captured at 2592x1944 resolution, with 129*32e2eae2SMauro Carvalho ChehabsGRBG10 format and output as IPU3_SGRBG10 format. 130*32e2eae2SMauro Carvalho Chehab 131*32e2eae2SMauro Carvalho ChehabThe captured frames are available as /tmp/frame-#.bin files. 132*32e2eae2SMauro Carvalho Chehab 133*32e2eae2SMauro Carvalho ChehabImgU 134*32e2eae2SMauro Carvalho Chehab==== 135*32e2eae2SMauro Carvalho Chehab 136*32e2eae2SMauro Carvalho ChehabThe ImgU is represented as two V4L2 subdevs, each of which provides a V4L2 137*32e2eae2SMauro Carvalho Chehabsubdev interface to the user space. 138*32e2eae2SMauro Carvalho Chehab 139*32e2eae2SMauro Carvalho ChehabEach V4L2 subdev represents a pipe, which can support a maximum of 2 streams. 140*32e2eae2SMauro Carvalho ChehabThis helps to support advanced camera features like Continuous View Finder (CVF) 141*32e2eae2SMauro Carvalho Chehaband Snapshot During Video(SDV). 142*32e2eae2SMauro Carvalho Chehab 143*32e2eae2SMauro Carvalho ChehabThe ImgU contains two independent pipes, each modelled as a V4L2 sub-device 144*32e2eae2SMauro Carvalho Chehabexposed to userspace as a V4L2 sub-device node. 145*32e2eae2SMauro Carvalho Chehab 146*32e2eae2SMauro Carvalho ChehabEach pipe has two sink pads and three source pads for the following purpose: 147*32e2eae2SMauro Carvalho Chehab 148*32e2eae2SMauro Carvalho Chehab.. tabularcolumns:: |p{0.8cm}|p{4.0cm}|p{4.0cm}| 149*32e2eae2SMauro Carvalho Chehab 150*32e2eae2SMauro Carvalho Chehab.. flat-table:: 151*32e2eae2SMauro Carvalho Chehab 152*32e2eae2SMauro Carvalho Chehab * - pad 153*32e2eae2SMauro Carvalho Chehab - direction 154*32e2eae2SMauro Carvalho Chehab - purpose 155*32e2eae2SMauro Carvalho Chehab 156*32e2eae2SMauro Carvalho Chehab * - 0 157*32e2eae2SMauro Carvalho Chehab - sink 158*32e2eae2SMauro Carvalho Chehab - Input raw video stream 159*32e2eae2SMauro Carvalho Chehab 160*32e2eae2SMauro Carvalho Chehab * - 1 161*32e2eae2SMauro Carvalho Chehab - sink 162*32e2eae2SMauro Carvalho Chehab - Processing parameters 163*32e2eae2SMauro Carvalho Chehab 164*32e2eae2SMauro Carvalho Chehab * - 2 165*32e2eae2SMauro Carvalho Chehab - source 166*32e2eae2SMauro Carvalho Chehab - Output processed video stream 167*32e2eae2SMauro Carvalho Chehab 168*32e2eae2SMauro Carvalho Chehab * - 3 169*32e2eae2SMauro Carvalho Chehab - source 170*32e2eae2SMauro Carvalho Chehab - Output viewfinder video stream 171*32e2eae2SMauro Carvalho Chehab 172*32e2eae2SMauro Carvalho Chehab * - 4 173*32e2eae2SMauro Carvalho Chehab - source 174*32e2eae2SMauro Carvalho Chehab - 3A statistics 175*32e2eae2SMauro Carvalho Chehab 176*32e2eae2SMauro Carvalho ChehabEach pad is connected to a corresponding V4L2 video interface, exposed to 177*32e2eae2SMauro Carvalho Chehabuserspace as a V4L2 video device node. 178*32e2eae2SMauro Carvalho Chehab 179*32e2eae2SMauro Carvalho ChehabDevice operation 180*32e2eae2SMauro Carvalho Chehab---------------- 181*32e2eae2SMauro Carvalho Chehab 182*32e2eae2SMauro Carvalho ChehabWith ImgU, once the input video node ("ipu3-imgu 0/1":0, in 183*32e2eae2SMauro Carvalho Chehab<entity>:<pad-number> format) is queued with buffer (in packed raw Bayer 184*32e2eae2SMauro Carvalho Chehabformat), ImgU starts processing the buffer and produces the video output in YUV 185*32e2eae2SMauro Carvalho Chehabformat and statistics output on respective output nodes. The driver is expected 186*32e2eae2SMauro Carvalho Chehabto have buffers ready for all of parameter, output and statistics nodes, when 187*32e2eae2SMauro Carvalho Chehabinput video node is queued with buffer. 188*32e2eae2SMauro Carvalho Chehab 189*32e2eae2SMauro Carvalho ChehabAt a minimum, all of input, main output, 3A statistics and viewfinder 190*32e2eae2SMauro Carvalho Chehabvideo nodes should be enabled for IPU3 to start image processing. 191*32e2eae2SMauro Carvalho Chehab 192*32e2eae2SMauro Carvalho ChehabEach ImgU V4L2 subdev has the following set of video nodes. 193*32e2eae2SMauro Carvalho Chehab 194*32e2eae2SMauro Carvalho Chehabinput, output and viewfinder video nodes 195*32e2eae2SMauro Carvalho Chehab---------------------------------------- 196*32e2eae2SMauro Carvalho Chehab 197*32e2eae2SMauro Carvalho ChehabThe frames (in packed raw Bayer format specific to the IPU3) received by the 198*32e2eae2SMauro Carvalho Chehabinput video node is processed by the IPU3 Imaging Unit and are output to 2 video 199*32e2eae2SMauro Carvalho Chehabnodes, with each targeting a different purpose (main output and viewfinder 200*32e2eae2SMauro Carvalho Chehaboutput). 201*32e2eae2SMauro Carvalho Chehab 202*32e2eae2SMauro Carvalho ChehabDetails onand the Bayer format specific to the IPU3 can be found in 203*32e2eae2SMauro Carvalho Chehab:ref:`v4l2-pix-fmt-ipu3-sbggr10`. 204*32e2eae2SMauro Carvalho Chehab 205*32e2eae2SMauro Carvalho ChehabThe driver supports V4L2 Video Capture Interface as defined at :ref:`devices`. 206*32e2eae2SMauro Carvalho Chehab 207*32e2eae2SMauro Carvalho ChehabOnly the multi-planar API is supported. More details can be found at 208*32e2eae2SMauro Carvalho Chehab:ref:`planar-apis`. 209*32e2eae2SMauro Carvalho Chehab 210*32e2eae2SMauro Carvalho ChehabParameters video node 211*32e2eae2SMauro Carvalho Chehab--------------------- 212*32e2eae2SMauro Carvalho Chehab 213*32e2eae2SMauro Carvalho ChehabThe parameters video node receives the ImgU algorithm parameters that are used 214*32e2eae2SMauro Carvalho Chehabto configure how the ImgU algorithms process the image. 215*32e2eae2SMauro Carvalho Chehab 216*32e2eae2SMauro Carvalho ChehabDetails on processing parameters specific to the IPU3 can be found in 217*32e2eae2SMauro Carvalho Chehab:ref:`v4l2-meta-fmt-params`. 218*32e2eae2SMauro Carvalho Chehab 219*32e2eae2SMauro Carvalho Chehab3A statistics video node 220*32e2eae2SMauro Carvalho Chehab------------------------ 221*32e2eae2SMauro Carvalho Chehab 222*32e2eae2SMauro Carvalho Chehab3A statistics video node is used by the ImgU driver to output the 3A (auto 223*32e2eae2SMauro Carvalho Chehabfocus, auto exposure and auto white balance) statistics for the frames that are 224*32e2eae2SMauro Carvalho Chehabbeing processed by the ImgU to user space applications. User space applications 225*32e2eae2SMauro Carvalho Chehabcan use this statistics data to compute the desired algorithm parameters for 226*32e2eae2SMauro Carvalho Chehabthe ImgU. 227*32e2eae2SMauro Carvalho Chehab 228*32e2eae2SMauro Carvalho ChehabConfiguring the Intel IPU3 229*32e2eae2SMauro Carvalho Chehab========================== 230*32e2eae2SMauro Carvalho Chehab 231*32e2eae2SMauro Carvalho ChehabThe IPU3 ImgU pipelines can be configured using the Media Controller, defined at 232*32e2eae2SMauro Carvalho Chehab:ref:`media_controller`. 233*32e2eae2SMauro Carvalho Chehab 234*32e2eae2SMauro Carvalho ChehabFirmware binary selection 235*32e2eae2SMauro Carvalho Chehab------------------------- 236*32e2eae2SMauro Carvalho Chehab 237*32e2eae2SMauro Carvalho ChehabThe firmware binary is selected using the V4L2_CID_INTEL_IPU3_MODE, currently 238*32e2eae2SMauro Carvalho Chehabdefined in drivers/staging/media/ipu3/include/intel-ipu3.h . "VIDEO" and "STILL" 239*32e2eae2SMauro Carvalho Chehabmodes are available. 240*32e2eae2SMauro Carvalho Chehab 241*32e2eae2SMauro Carvalho ChehabProcessing the image in raw Bayer format 242*32e2eae2SMauro Carvalho Chehab---------------------------------------- 243*32e2eae2SMauro Carvalho Chehab 244*32e2eae2SMauro Carvalho ChehabConfiguring ImgU V4L2 subdev for image processing 245*32e2eae2SMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 246*32e2eae2SMauro Carvalho Chehab 247*32e2eae2SMauro Carvalho ChehabThe ImgU V4L2 subdevs have to be configured with media controller APIs to have 248*32e2eae2SMauro Carvalho Chehaball the video nodes setup correctly. 249*32e2eae2SMauro Carvalho Chehab 250*32e2eae2SMauro Carvalho ChehabLet us take "ipu3-imgu 0" subdev as an example. 251*32e2eae2SMauro Carvalho Chehab 252*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -r 253*32e2eae2SMauro Carvalho Chehab 254*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ipu3-imgu 0 input":0 -> "ipu3-imgu 0":0[1] 255*32e2eae2SMauro Carvalho Chehab 256*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ipu3-imgu 0":2 -> "ipu3-imgu 0 output":0[1] 257*32e2eae2SMauro Carvalho Chehab 258*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ipu3-imgu 0":3 -> "ipu3-imgu 0 viewfinder":0[1] 259*32e2eae2SMauro Carvalho Chehab 260*32e2eae2SMauro Carvalho Chehabmedia-ctl -d $MDEV -l "ipu3-imgu 0":4 -> "ipu3-imgu 0 3a stat":0[1] 261*32e2eae2SMauro Carvalho Chehab 262*32e2eae2SMauro Carvalho ChehabAlso the pipe mode of the corresponding V4L2 subdev should be set as desired 263*32e2eae2SMauro Carvalho Chehab(e.g 0 for video mode or 1 for still mode) through the control id 0x009819a1 as 264*32e2eae2SMauro Carvalho Chehabbelow. 265*32e2eae2SMauro Carvalho Chehab 266*32e2eae2SMauro Carvalho Chehabyavta -w "0x009819A1 1" /dev/v4l-subdev7 267*32e2eae2SMauro Carvalho Chehab 268*32e2eae2SMauro Carvalho ChehabCertain hardware blocks in ImgU pipeline can change the frame resolution by 269*32e2eae2SMauro Carvalho Chehabcropping or scaling, these hardware blocks include Input Feeder(IF), Bayer Down 270*32e2eae2SMauro Carvalho ChehabScaler (BDS) and Geometric Distortion Correction (GDC). 271*32e2eae2SMauro Carvalho ChehabThere is also a block which can change the frame resolution - YUV Scaler, it is 272*32e2eae2SMauro Carvalho Chehabonly applicable to the secondary output. 273*32e2eae2SMauro Carvalho Chehab 274*32e2eae2SMauro Carvalho ChehabRAW Bayer frames go through these ImgU pipeline hardware blocks and the final 275*32e2eae2SMauro Carvalho Chehabprocessed image output to the DDR memory. 276*32e2eae2SMauro Carvalho Chehab 277*32e2eae2SMauro Carvalho Chehab.. kernel-figure:: ipu3_rcb.svg 278*32e2eae2SMauro Carvalho Chehab :alt: ipu3 resolution blocks image 279*32e2eae2SMauro Carvalho Chehab 280*32e2eae2SMauro Carvalho Chehab IPU3 resolution change hardware blocks 281*32e2eae2SMauro Carvalho Chehab 282*32e2eae2SMauro Carvalho Chehab**Input Feeder** 283*32e2eae2SMauro Carvalho Chehab 284*32e2eae2SMauro Carvalho ChehabInput Feeder gets the Bayer frame data from the sensor, it can enable cropping 285*32e2eae2SMauro Carvalho Chehabof lines and columns from the frame and then store pixels into device's internal 286*32e2eae2SMauro Carvalho Chehabpixel buffer which are ready to readout by following blocks. 287*32e2eae2SMauro Carvalho Chehab 288*32e2eae2SMauro Carvalho Chehab**Bayer Down Scaler** 289*32e2eae2SMauro Carvalho Chehab 290*32e2eae2SMauro Carvalho ChehabBayer Down Scaler is capable of performing image scaling in Bayer domain, the 291*32e2eae2SMauro Carvalho Chehabdownscale factor can be configured from 1X to 1/4X in each axis with 292*32e2eae2SMauro Carvalho Chehabconfiguration steps of 0.03125 (1/32). 293*32e2eae2SMauro Carvalho Chehab 294*32e2eae2SMauro Carvalho Chehab**Geometric Distortion Correction** 295*32e2eae2SMauro Carvalho Chehab 296*32e2eae2SMauro Carvalho ChehabGeometric Distortion Correction is used to performe correction of distortions 297*32e2eae2SMauro Carvalho Chehaband image filtering. It needs some extra filter and envelop padding pixels to 298*32e2eae2SMauro Carvalho Chehabwork, so the input resolution of GDC should be larger than the output 299*32e2eae2SMauro Carvalho Chehabresolution. 300*32e2eae2SMauro Carvalho Chehab 301*32e2eae2SMauro Carvalho Chehab**YUV Scaler** 302*32e2eae2SMauro Carvalho Chehab 303*32e2eae2SMauro Carvalho ChehabYUV Scaler which similar with BDS, but it is mainly do image down scaling in 304*32e2eae2SMauro Carvalho ChehabYUV domain, it can support up to 1/12X down scaling, but it can not be applied 305*32e2eae2SMauro Carvalho Chehabto the main output. 306*32e2eae2SMauro Carvalho Chehab 307*32e2eae2SMauro Carvalho ChehabThe ImgU V4L2 subdev has to be configured with the supported resolutions in all 308*32e2eae2SMauro Carvalho Chehabthe above hardware blocks, for a given input resolution. 309*32e2eae2SMauro Carvalho ChehabFor a given supported resolution for an input frame, the Input Feeder, Bayer 310*32e2eae2SMauro Carvalho ChehabDown Scaler and GDC blocks should be configured with the supported resolutions 311*32e2eae2SMauro Carvalho Chehabas each hardware block has its own alignment requirement. 312*32e2eae2SMauro Carvalho Chehab 313*32e2eae2SMauro Carvalho ChehabYou must configure the output resolution of the hardware blocks smartly to meet 314*32e2eae2SMauro Carvalho Chehabthe hardware requirement along with keeping the maximum field of view. The 315*32e2eae2SMauro Carvalho Chehabintermediate resolutions can be generated by specific tool - 316*32e2eae2SMauro Carvalho Chehab 317*32e2eae2SMauro Carvalho Chehabhttps://github.com/intel/intel-ipu3-pipecfg 318*32e2eae2SMauro Carvalho Chehab 319*32e2eae2SMauro Carvalho ChehabThis tool can be used to generate intermediate resolutions. More information can 320*32e2eae2SMauro Carvalho Chehabbe obtained by looking at the following IPU3 ImgU configuration table. 321*32e2eae2SMauro Carvalho Chehab 322*32e2eae2SMauro Carvalho Chehabhttps://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master 323*32e2eae2SMauro Carvalho Chehab 324*32e2eae2SMauro Carvalho ChehabUnder baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/files/gcss 325*32e2eae2SMauro Carvalho Chehabdirectory, graph_settings_ov5670.xml can be used as an example. 326*32e2eae2SMauro Carvalho Chehab 327*32e2eae2SMauro Carvalho ChehabThe following steps prepare the ImgU pipeline for the image processing. 328*32e2eae2SMauro Carvalho Chehab 329*32e2eae2SMauro Carvalho Chehab1. The ImgU V4L2 subdev data format should be set by using the 330*32e2eae2SMauro Carvalho ChehabVIDIOC_SUBDEV_S_FMT on pad 0, using the GDC width and height obtained above. 331*32e2eae2SMauro Carvalho Chehab 332*32e2eae2SMauro Carvalho Chehab2. The ImgU V4L2 subdev cropping should be set by using the 333*32e2eae2SMauro Carvalho ChehabVIDIOC_SUBDEV_S_SELECTION on pad 0, with V4L2_SEL_TGT_CROP as the target, 334*32e2eae2SMauro Carvalho Chehabusing the input feeder height and width. 335*32e2eae2SMauro Carvalho Chehab 336*32e2eae2SMauro Carvalho Chehab3. The ImgU V4L2 subdev composing should be set by using the 337*32e2eae2SMauro Carvalho ChehabVIDIOC_SUBDEV_S_SELECTION on pad 0, with V4L2_SEL_TGT_COMPOSE as the target, 338*32e2eae2SMauro Carvalho Chehabusing the BDS height and width. 339*32e2eae2SMauro Carvalho Chehab 340*32e2eae2SMauro Carvalho ChehabFor the ov5670 example, for an input frame with a resolution of 2592x1944 341*32e2eae2SMauro Carvalho Chehab(which is input to the ImgU subdev pad 0), the corresponding resolutions 342*32e2eae2SMauro Carvalho Chehabfor input feeder, BDS and GDC are 2592x1944, 2592x1944 and 2560x1920 343*32e2eae2SMauro Carvalho Chehabrespectively. 344*32e2eae2SMauro Carvalho Chehab 345*32e2eae2SMauro Carvalho ChehabOnce this is done, the received raw Bayer frames can be input to the ImgU 346*32e2eae2SMauro Carvalho ChehabV4L2 subdev as below, using the open source application v4l2n [#f1]_. 347*32e2eae2SMauro Carvalho Chehab 348*32e2eae2SMauro Carvalho ChehabFor an image captured with 2592x1944 [#f4]_ resolution, with desired output 349*32e2eae2SMauro Carvalho Chehabresolution as 2560x1920 and viewfinder resolution as 2560x1920, the following 350*32e2eae2SMauro Carvalho Chehabv4l2n command can be used. This helps process the raw Bayer frames and produces 351*32e2eae2SMauro Carvalho Chehabthe desired results for the main output image and the viewfinder output, in NV12 352*32e2eae2SMauro Carvalho Chehabformat. 353*32e2eae2SMauro Carvalho Chehab 354*32e2eae2SMauro Carvalho Chehabv4l2n --pipe=4 --load=/tmp/frame-#.bin --open=/dev/video4 355*32e2eae2SMauro Carvalho Chehab--fmt=type:VIDEO_OUTPUT_MPLANE,width=2592,height=1944,pixelformat=0X47337069 356*32e2eae2SMauro Carvalho Chehab--reqbufs=type:VIDEO_OUTPUT_MPLANE,count:1 --pipe=1 --output=/tmp/frames.out 357*32e2eae2SMauro Carvalho Chehab--open=/dev/video5 358*32e2eae2SMauro Carvalho Chehab--fmt=type:VIDEO_CAPTURE_MPLANE,width=2560,height=1920,pixelformat=NV12 359*32e2eae2SMauro Carvalho Chehab--reqbufs=type:VIDEO_CAPTURE_MPLANE,count:1 --pipe=2 --output=/tmp/frames.vf 360*32e2eae2SMauro Carvalho Chehab--open=/dev/video6 361*32e2eae2SMauro Carvalho Chehab--fmt=type:VIDEO_CAPTURE_MPLANE,width=2560,height=1920,pixelformat=NV12 362*32e2eae2SMauro Carvalho Chehab--reqbufs=type:VIDEO_CAPTURE_MPLANE,count:1 --pipe=3 --open=/dev/video7 363*32e2eae2SMauro Carvalho Chehab--output=/tmp/frames.3A --fmt=type:META_CAPTURE,? 364*32e2eae2SMauro Carvalho Chehab--reqbufs=count:1,type:META_CAPTURE --pipe=1,2,3,4 --stream=5 365*32e2eae2SMauro Carvalho Chehab 366*32e2eae2SMauro Carvalho Chehabwhere /dev/video4, /dev/video5, /dev/video6 and /dev/video7 devices point to 367*32e2eae2SMauro Carvalho Chehabinput, output, viewfinder and 3A statistics video nodes respectively. 368*32e2eae2SMauro Carvalho Chehab 369*32e2eae2SMauro Carvalho ChehabConverting the raw Bayer image into YUV domain 370*32e2eae2SMauro Carvalho Chehab---------------------------------------------- 371*32e2eae2SMauro Carvalho Chehab 372*32e2eae2SMauro Carvalho ChehabThe processed images after the above step, can be converted to YUV domain 373*32e2eae2SMauro Carvalho Chehabas below. 374*32e2eae2SMauro Carvalho Chehab 375*32e2eae2SMauro Carvalho ChehabMain output frames 376*32e2eae2SMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~ 377*32e2eae2SMauro Carvalho Chehab 378*32e2eae2SMauro Carvalho Chehabraw2pnm -x2560 -y1920 -fNV12 /tmp/frames.out /tmp/frames.out.ppm 379*32e2eae2SMauro Carvalho Chehab 380*32e2eae2SMauro Carvalho Chehabwhere 2560x1920 is output resolution, NV12 is the video format, followed 381*32e2eae2SMauro Carvalho Chehabby input frame and output PNM file. 382*32e2eae2SMauro Carvalho Chehab 383*32e2eae2SMauro Carvalho ChehabViewfinder output frames 384*32e2eae2SMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~~~~~~~ 385*32e2eae2SMauro Carvalho Chehab 386*32e2eae2SMauro Carvalho Chehabraw2pnm -x2560 -y1920 -fNV12 /tmp/frames.vf /tmp/frames.vf.ppm 387*32e2eae2SMauro Carvalho Chehab 388*32e2eae2SMauro Carvalho Chehabwhere 2560x1920 is output resolution, NV12 is the video format, followed 389*32e2eae2SMauro Carvalho Chehabby input frame and output PNM file. 390*32e2eae2SMauro Carvalho Chehab 391*32e2eae2SMauro Carvalho ChehabExample user space code for IPU3 392*32e2eae2SMauro Carvalho Chehab================================ 393*32e2eae2SMauro Carvalho Chehab 394*32e2eae2SMauro Carvalho ChehabUser space code that configures and uses IPU3 is available here. 395*32e2eae2SMauro Carvalho Chehab 396*32e2eae2SMauro Carvalho Chehabhttps://chromium.googlesource.com/chromiumos/platform/arc-camera/+/master/ 397*32e2eae2SMauro Carvalho Chehab 398*32e2eae2SMauro Carvalho ChehabThe source can be located under hal/intel directory. 399*32e2eae2SMauro Carvalho Chehab 400*32e2eae2SMauro Carvalho ChehabOverview of IPU3 pipeline 401*32e2eae2SMauro Carvalho Chehab========================= 402*32e2eae2SMauro Carvalho Chehab 403*32e2eae2SMauro Carvalho ChehabIPU3 pipeline has a number of image processing stages, each of which takes a 404*32e2eae2SMauro Carvalho Chehabset of parameters as input. The major stages of pipelines are shown here: 405*32e2eae2SMauro Carvalho Chehab 406*32e2eae2SMauro Carvalho Chehab.. kernel-render:: DOT 407*32e2eae2SMauro Carvalho Chehab :alt: IPU3 ImgU Pipeline 408*32e2eae2SMauro Carvalho Chehab :caption: IPU3 ImgU Pipeline Diagram 409*32e2eae2SMauro Carvalho Chehab 410*32e2eae2SMauro Carvalho Chehab digraph "IPU3 ImgU" { 411*32e2eae2SMauro Carvalho Chehab node [shape=box] 412*32e2eae2SMauro Carvalho Chehab splines="ortho" 413*32e2eae2SMauro Carvalho Chehab rankdir="LR" 414*32e2eae2SMauro Carvalho Chehab 415*32e2eae2SMauro Carvalho Chehab a [label="Raw pixels"] 416*32e2eae2SMauro Carvalho Chehab b [label="Bayer Downscaling"] 417*32e2eae2SMauro Carvalho Chehab c [label="Optical Black Correction"] 418*32e2eae2SMauro Carvalho Chehab d [label="Linearization"] 419*32e2eae2SMauro Carvalho Chehab e [label="Lens Shading Correction"] 420*32e2eae2SMauro Carvalho Chehab f [label="White Balance / Exposure / Focus Apply"] 421*32e2eae2SMauro Carvalho Chehab g [label="Bayer Noise Reduction"] 422*32e2eae2SMauro Carvalho Chehab h [label="ANR"] 423*32e2eae2SMauro Carvalho Chehab i [label="Demosaicing"] 424*32e2eae2SMauro Carvalho Chehab j [label="Color Correction Matrix"] 425*32e2eae2SMauro Carvalho Chehab k [label="Gamma correction"] 426*32e2eae2SMauro Carvalho Chehab l [label="Color Space Conversion"] 427*32e2eae2SMauro Carvalho Chehab m [label="Chroma Down Scaling"] 428*32e2eae2SMauro Carvalho Chehab n [label="Chromatic Noise Reduction"] 429*32e2eae2SMauro Carvalho Chehab o [label="Total Color Correction"] 430*32e2eae2SMauro Carvalho Chehab p [label="XNR3"] 431*32e2eae2SMauro Carvalho Chehab q [label="TNR"] 432*32e2eae2SMauro Carvalho Chehab r [label="DDR"] 433*32e2eae2SMauro Carvalho Chehab 434*32e2eae2SMauro Carvalho Chehab { rank=same; a -> b -> c -> d -> e -> f } 435*32e2eae2SMauro Carvalho Chehab { rank=same; g -> h -> i -> j -> k -> l } 436*32e2eae2SMauro Carvalho Chehab { rank=same; m -> n -> o -> p -> q -> r } 437*32e2eae2SMauro Carvalho Chehab 438*32e2eae2SMauro Carvalho Chehab a -> g -> m [style=invis, weight=10] 439*32e2eae2SMauro Carvalho Chehab 440*32e2eae2SMauro Carvalho Chehab f -> g 441*32e2eae2SMauro Carvalho Chehab l -> m 442*32e2eae2SMauro Carvalho Chehab } 443*32e2eae2SMauro Carvalho Chehab 444*32e2eae2SMauro Carvalho ChehabThe table below presents a description of the above algorithms. 445*32e2eae2SMauro Carvalho Chehab 446*32e2eae2SMauro Carvalho Chehab======================== ======================================================= 447*32e2eae2SMauro Carvalho ChehabName Description 448*32e2eae2SMauro Carvalho Chehab======================== ======================================================= 449*32e2eae2SMauro Carvalho ChehabOptical Black Correction Optical Black Correction block subtracts a pre-defined 450*32e2eae2SMauro Carvalho Chehab value from the respective pixel values to obtain better 451*32e2eae2SMauro Carvalho Chehab image quality. 452*32e2eae2SMauro Carvalho Chehab Defined in :c:type:`ipu3_uapi_obgrid_param`. 453*32e2eae2SMauro Carvalho ChehabLinearization This algo block uses linearization parameters to 454*32e2eae2SMauro Carvalho Chehab address non-linearity sensor effects. The Lookup table 455*32e2eae2SMauro Carvalho Chehab table is defined in 456*32e2eae2SMauro Carvalho Chehab :c:type:`ipu3_uapi_isp_lin_vmem_params`. 457*32e2eae2SMauro Carvalho ChehabSHD Lens shading correction is used to correct spatial 458*32e2eae2SMauro Carvalho Chehab non-uniformity of the pixel response due to optical 459*32e2eae2SMauro Carvalho Chehab lens shading. This is done by applying a different gain 460*32e2eae2SMauro Carvalho Chehab for each pixel. The gain, black level etc are 461*32e2eae2SMauro Carvalho Chehab configured in :c:type:`ipu3_uapi_shd_config_static`. 462*32e2eae2SMauro Carvalho ChehabBNR Bayer noise reduction block removes image noise by 463*32e2eae2SMauro Carvalho Chehab applying a bilateral filter. 464*32e2eae2SMauro Carvalho Chehab See :c:type:`ipu3_uapi_bnr_static_config` for details. 465*32e2eae2SMauro Carvalho ChehabANR Advanced Noise Reduction is a block based algorithm 466*32e2eae2SMauro Carvalho Chehab that performs noise reduction in the Bayer domain. The 467*32e2eae2SMauro Carvalho Chehab convolution matrix etc can be found in 468*32e2eae2SMauro Carvalho Chehab :c:type:`ipu3_uapi_anr_config`. 469*32e2eae2SMauro Carvalho ChehabDM Demosaicing converts raw sensor data in Bayer format 470*32e2eae2SMauro Carvalho Chehab into RGB (Red, Green, Blue) presentation. Then add 471*32e2eae2SMauro Carvalho Chehab outputs of estimation of Y channel for following stream 472*32e2eae2SMauro Carvalho Chehab processing by Firmware. The struct is defined as 473*32e2eae2SMauro Carvalho Chehab :c:type:`ipu3_uapi_dm_config`. 474*32e2eae2SMauro Carvalho ChehabColor Correction Color Correction algo transforms sensor specific color 475*32e2eae2SMauro Carvalho Chehab space to the standard "sRGB" color space. This is done 476*32e2eae2SMauro Carvalho Chehab by applying 3x3 matrix defined in 477*32e2eae2SMauro Carvalho Chehab :c:type:`ipu3_uapi_ccm_mat_config`. 478*32e2eae2SMauro Carvalho ChehabGamma correction Gamma correction :c:type:`ipu3_uapi_gamma_config` is a 479*32e2eae2SMauro Carvalho Chehab basic non-linear tone mapping correction that is 480*32e2eae2SMauro Carvalho Chehab applied per pixel for each pixel component. 481*32e2eae2SMauro Carvalho ChehabCSC Color space conversion transforms each pixel from the 482*32e2eae2SMauro Carvalho Chehab RGB primary presentation to YUV (Y: brightness, 483*32e2eae2SMauro Carvalho Chehab UV: Luminance) presentation. This is done by applying 484*32e2eae2SMauro Carvalho Chehab a 3x3 matrix defined in 485*32e2eae2SMauro Carvalho Chehab :c:type:`ipu3_uapi_csc_mat_config` 486*32e2eae2SMauro Carvalho ChehabCDS Chroma down sampling 487*32e2eae2SMauro Carvalho Chehab After the CSC is performed, the Chroma Down Sampling 488*32e2eae2SMauro Carvalho Chehab is applied for a UV plane down sampling by a factor 489*32e2eae2SMauro Carvalho Chehab of 2 in each direction for YUV 4:2:0 using a 4x2 490*32e2eae2SMauro Carvalho Chehab configurable filter :c:type:`ipu3_uapi_cds_params`. 491*32e2eae2SMauro Carvalho ChehabCHNR Chroma noise reduction 492*32e2eae2SMauro Carvalho Chehab This block processes only the chrominance pixels and 493*32e2eae2SMauro Carvalho Chehab performs noise reduction by cleaning the high 494*32e2eae2SMauro Carvalho Chehab frequency noise. 495*32e2eae2SMauro Carvalho Chehab See struct :c:type:`ipu3_uapi_yuvp1_chnr_config`. 496*32e2eae2SMauro Carvalho ChehabTCC Total color correction as defined in struct 497*32e2eae2SMauro Carvalho Chehab :c:type:`ipu3_uapi_yuvp2_tcc_static_config`. 498*32e2eae2SMauro Carvalho ChehabXNR3 eXtreme Noise Reduction V3 is the third revision of 499*32e2eae2SMauro Carvalho Chehab noise reduction algorithm used to improve image 500*32e2eae2SMauro Carvalho Chehab quality. This removes the low frequency noise in the 501*32e2eae2SMauro Carvalho Chehab captured image. Two related structs are being defined, 502*32e2eae2SMauro Carvalho Chehab :c:type:`ipu3_uapi_isp_xnr3_params` for ISP data memory 503*32e2eae2SMauro Carvalho Chehab and :c:type:`ipu3_uapi_isp_xnr3_vmem_params` for vector 504*32e2eae2SMauro Carvalho Chehab memory. 505*32e2eae2SMauro Carvalho ChehabTNR Temporal Noise Reduction block compares successive 506*32e2eae2SMauro Carvalho Chehab frames in time to remove anomalies / noise in pixel 507*32e2eae2SMauro Carvalho Chehab values. :c:type:`ipu3_uapi_isp_tnr3_vmem_params` and 508*32e2eae2SMauro Carvalho Chehab :c:type:`ipu3_uapi_isp_tnr3_params` are defined for ISP 509*32e2eae2SMauro Carvalho Chehab vector and data memory respectively. 510*32e2eae2SMauro Carvalho Chehab======================== ======================================================= 511*32e2eae2SMauro Carvalho Chehab 512*32e2eae2SMauro Carvalho ChehabOther often encountered acronyms not listed in above table: 513*32e2eae2SMauro Carvalho Chehab 514*32e2eae2SMauro Carvalho Chehab ACC 515*32e2eae2SMauro Carvalho Chehab Accelerator cluster 516*32e2eae2SMauro Carvalho Chehab AWB_FR 517*32e2eae2SMauro Carvalho Chehab Auto white balance filter response statistics 518*32e2eae2SMauro Carvalho Chehab BDS 519*32e2eae2SMauro Carvalho Chehab Bayer downscaler parameters 520*32e2eae2SMauro Carvalho Chehab CCM 521*32e2eae2SMauro Carvalho Chehab Color correction matrix coefficients 522*32e2eae2SMauro Carvalho Chehab IEFd 523*32e2eae2SMauro Carvalho Chehab Image enhancement filter directed 524*32e2eae2SMauro Carvalho Chehab Obgrid 525*32e2eae2SMauro Carvalho Chehab Optical black level compensation 526*32e2eae2SMauro Carvalho Chehab OSYS 527*32e2eae2SMauro Carvalho Chehab Output system configuration 528*32e2eae2SMauro Carvalho Chehab ROI 529*32e2eae2SMauro Carvalho Chehab Region of interest 530*32e2eae2SMauro Carvalho Chehab YDS 531*32e2eae2SMauro Carvalho Chehab Y down sampling 532*32e2eae2SMauro Carvalho Chehab YTM 533*32e2eae2SMauro Carvalho Chehab Y-tone mapping 534*32e2eae2SMauro Carvalho Chehab 535*32e2eae2SMauro Carvalho ChehabA few stages of the pipeline will be executed by firmware running on the ISP 536*32e2eae2SMauro Carvalho Chehabprocessor, while many others will use a set of fixed hardware blocks also 537*32e2eae2SMauro Carvalho Chehabcalled accelerator cluster (ACC) to crunch pixel data and produce statistics. 538*32e2eae2SMauro Carvalho Chehab 539*32e2eae2SMauro Carvalho ChehabACC parameters of individual algorithms, as defined by 540*32e2eae2SMauro Carvalho Chehab:c:type:`ipu3_uapi_acc_param`, can be chosen to be applied by the user 541*32e2eae2SMauro Carvalho Chehabspace through struct :c:type:`ipu3_uapi_flags` embedded in 542*32e2eae2SMauro Carvalho Chehab:c:type:`ipu3_uapi_params` structure. For parameters that are configured as 543*32e2eae2SMauro Carvalho Chehabnot enabled by the user space, the corresponding structs are ignored by the 544*32e2eae2SMauro Carvalho Chehabdriver, in which case the existing configuration of the algorithm will be 545*32e2eae2SMauro Carvalho Chehabpreserved. 546*32e2eae2SMauro Carvalho Chehab 547*32e2eae2SMauro Carvalho ChehabReferences 548*32e2eae2SMauro Carvalho Chehab========== 549*32e2eae2SMauro Carvalho Chehab 550*32e2eae2SMauro Carvalho Chehab.. [#f5] drivers/staging/media/ipu3/include/intel-ipu3.h 551*32e2eae2SMauro Carvalho Chehab 552*32e2eae2SMauro Carvalho Chehab.. [#f1] https://github.com/intel/nvt 553*32e2eae2SMauro Carvalho Chehab 554*32e2eae2SMauro Carvalho Chehab.. [#f2] http://git.ideasonboard.org/yavta.git 555*32e2eae2SMauro Carvalho Chehab 556*32e2eae2SMauro Carvalho Chehab.. [#f3] http://git.ideasonboard.org/?p=media-ctl.git;a=summary 557*32e2eae2SMauro Carvalho Chehab 558*32e2eae2SMauro Carvalho Chehab.. [#f4] ImgU limitation requires an additional 16x16 for all input resolutions 559