mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
9d5c3c0698
The DW100 driver gets the dewarping mapping as a binary blob from the userspace application through a custom control. The blob format is hardware specific so create a dedicated control for this purpose. Signed-off-by: Xavier Roumegue <xavier.roumegue@oss.nxp.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
85 lines
3.6 KiB
ReStructuredText
85 lines
3.6 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
|
|
|
DW100 dewarp driver
|
|
===================
|
|
|
|
The Vivante DW100 Dewarp Processor IP core found on i.MX8MP SoC applies a
|
|
programmable geometrical transformation on the input image to correct distortion
|
|
introduced by lenses.
|
|
|
|
The transformation function is exposed by the hardware as a grid map with 16x16
|
|
pixel macroblocks indexed using X, Y vertex coordinates.
|
|
::
|
|
|
|
Image width
|
|
<--------------------------------------->
|
|
|
|
^ .-------.-------.-------.-------.-------.
|
|
| | 16x16 | | | | |
|
|
I | | pixel | | | | |
|
|
m | | block | | | | |
|
|
a | .-------.-------.-------.-------.-------.
|
|
g | | | | | | |
|
|
e | | | | | | |
|
|
| | | | | | |
|
|
h | .-------.-------.-------.-------.-------.
|
|
e | | | | | | |
|
|
i | | | | | | |
|
|
g | | | | | | |
|
|
h | .-------.-------.-------.-------.-------.
|
|
t | | | | | | |
|
|
| | | | | | |
|
|
| | | | | | |
|
|
v '-------'-------'-------'-------'-------'
|
|
|
|
Grid of Image Blocks for Dewarping Map
|
|
|
|
|
|
Each x, y coordinate register uses 16 bits to record the coordinate address in
|
|
an unsigned 12.4 fixed point format (UQ12.4).
|
|
::
|
|
|
|
.----------------------.--------..----------------------.--------.
|
|
| 31~20 | 19~16 || 15~4 | 3~0 |
|
|
| (integer) | (frac) || (integer) | (frac) |
|
|
'----------------------'--------''----------------------'--------'
|
|
<-------------------------------><------------------------------->
|
|
Y coordinate X coordinate
|
|
|
|
Remap Register Layout
|
|
|
|
The dewarping map is set from applications using the
|
|
V4L2_CID_DW100_DEWARPING_16x16_VERTEX_MAP control. The control contains
|
|
an array of u32 values storing (x, y) destination coordinates for each
|
|
vertex of the grid. The x coordinate is stored in the 16 LSBs and the y
|
|
coordinate in the 16 MSBs.
|
|
|
|
The number of elements in the array must match the image size:
|
|
|
|
.. code-block:: C
|
|
|
|
elems = (DIV_ROUND_UP(width, 16) + 1) * (DIV_ROUND_UP(height, 16) + 1);
|
|
|
|
If the control has not been set by the application, the driver uses an identity
|
|
map.
|
|
|
|
More details on the DW100 hardware operations can be found in
|
|
*chapter 13.15 DeWarp* of IMX8MP_ reference manual.
|
|
|
|
The Vivante DW100 m2m driver implements the following driver-specific control:
|
|
|
|
``V4L2_CID_DW100_DEWARPING_16x16_VERTEX_MAP (__u32 array)``
|
|
Specifies to DW100 driver its dewarping map (aka LUT) blob as described in
|
|
*chapter 13.15.2.3 Dewarping Remap* of IMX8MP_ reference manual as an U32
|
|
dynamic array. The image is divided into many small 16x16 blocks. If the
|
|
width/height of the image is not divisible by 16, the size of the
|
|
rightmost/bottommost block is the remainder. The dewarping map only saves
|
|
the vertex coordinates of the block. The dewarping grid map is comprised of
|
|
vertex coordinates for x and y. Each x, y coordinate register uses 16 bits
|
|
(UQ12.4) to record the coordinate address, with the Y coordinate in the
|
|
upper bits and X in the lower bits. The driver modifies the dimensions of
|
|
this control when the sink format is changed, to reflect the new input
|
|
resolution.
|
|
|
|
.. _IMX8MP: https://www.nxp.com/webapp/Download?colCode=IMX8MPRM
|