mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
media: uapi: Add parameters structs to mali-c55-config.h
Add structures describing the ISP parameters to mali-c55-config.h Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Acked-by: Nayden Kanchev <nayden.kanchev@arm.com> Co-developed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
committed by
Hans Verkuil
parent
1ab3cb233d
commit
08a99369f4
@@ -10,6 +10,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/v4l2-controls.h>
|
||||
#include <linux/media/v4l2-isp.h>
|
||||
|
||||
#define V4L2_CID_MALI_C55_CAPABILITIES (V4L2_CID_USER_MALI_C55_BASE + 0x0)
|
||||
#define MALI_C55_GPS_PONG (1U << 0)
|
||||
@@ -193,4 +194,601 @@ struct mali_c55_stats_buffer {
|
||||
__u32 reserved3[15];
|
||||
} __attribute__((packed));
|
||||
|
||||
/**
|
||||
* enum mali_c55_param_buffer_version - Mali-C55 parameters block versioning
|
||||
*
|
||||
* @MALI_C55_PARAM_BUFFER_V1: First version of Mali-C55 parameters block
|
||||
*/
|
||||
enum mali_c55_param_buffer_version {
|
||||
MALI_C55_PARAM_BUFFER_V1,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mali_c55_param_block_type - Enumeration of Mali-C55 parameter blocks
|
||||
*
|
||||
* This enumeration defines the types of Mali-C55 parameters block. Each block
|
||||
* configures a specific processing block of the Mali-C55 ISP. The block
|
||||
* type allows the driver to correctly interpret the parameters block data.
|
||||
*
|
||||
* It is the responsibility of userspace to correctly set the type of each
|
||||
* parameters block.
|
||||
*
|
||||
* @MALI_C55_PARAM_BLOCK_SENSOR_OFFS: Sensor pre-shading black level offset
|
||||
* @MALI_C55_PARAM_BLOCK_AEXP_HIST: Auto-exposure 1024-bin histogram
|
||||
* configuration
|
||||
* @MALI_C55_PARAM_BLOCK_AEXP_IHIST: Post-Iridix auto-exposure 1024-bin
|
||||
* histogram configuration
|
||||
* @MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS: Auto-exposure 1024-bin histogram
|
||||
* weighting
|
||||
* @MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS: Post-Iridix auto-exposure 1024-bin
|
||||
* histogram weighting
|
||||
* @MALI_C55_PARAM_BLOCK_DIGITAL_GAIN: Digital gain
|
||||
* @MALI_C55_PARAM_BLOCK_AWB_GAINS: Auto-white balance gains
|
||||
* @MALI_C55_PARAM_BLOCK_AWB_CONFIG: Auto-white balance statistics config
|
||||
* @MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP: Auto-white balance gains for AEXP-0 tap
|
||||
* @MALI_C55_PARAM_MESH_SHADING_CONFIG : Mesh shading tables configuration
|
||||
* @MALI_C55_PARAM_MESH_SHADING_SELECTION: Mesh shading table selection
|
||||
*/
|
||||
enum mali_c55_param_block_type {
|
||||
MALI_C55_PARAM_BLOCK_SENSOR_OFFS,
|
||||
MALI_C55_PARAM_BLOCK_AEXP_HIST,
|
||||
MALI_C55_PARAM_BLOCK_AEXP_IHIST,
|
||||
MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS,
|
||||
MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS,
|
||||
MALI_C55_PARAM_BLOCK_DIGITAL_GAIN,
|
||||
MALI_C55_PARAM_BLOCK_AWB_GAINS,
|
||||
MALI_C55_PARAM_BLOCK_AWB_CONFIG,
|
||||
MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP,
|
||||
MALI_C55_PARAM_MESH_SHADING_CONFIG,
|
||||
MALI_C55_PARAM_MESH_SHADING_SELECTION,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mali_c55_params_sensor_off_preshading - offset subtraction for each
|
||||
* color channel
|
||||
*
|
||||
* Provides removal of the sensor black level from the sensor data. Separate
|
||||
* offsets are provided for each of the four Bayer component color channels
|
||||
* which are defaulted to R, Gr, Gb, B.
|
||||
*
|
||||
* header.type should be set to MALI_C55_PARAM_BLOCK_SENSOR_OFFS from
|
||||
* :c:type:`mali_c55_param_block_type` for this block.
|
||||
*
|
||||
* @header: The Mali-C55 parameters block header
|
||||
* @chan00: Offset for color channel 00 (default: R)
|
||||
* @chan01: Offset for color channel 01 (default: Gr)
|
||||
* @chan10: Offset for color channel 10 (default: Gb)
|
||||
* @chan11: Offset for color channel 11 (default: B)
|
||||
*/
|
||||
struct mali_c55_params_sensor_off_preshading {
|
||||
struct v4l2_isp_params_block_header header;
|
||||
__u32 chan00;
|
||||
__u32 chan01;
|
||||
__u32 chan10;
|
||||
__u32 chan11;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mali_c55_aexp_hist_tap_points - Tap points for the AEXP histogram
|
||||
* @MALI_C55_AEXP_HIST_TAP_WB: After static white balance
|
||||
* @MALI_C55_AEXP_HIST_TAP_FS: After WDR Frame Stitch
|
||||
* @MALI_C55_AEXP_HIST_TAP_TPG: After the test pattern generator
|
||||
*/
|
||||
enum mali_c55_aexp_hist_tap_points {
|
||||
MALI_C55_AEXP_HIST_TAP_WB = 0,
|
||||
MALI_C55_AEXP_HIST_TAP_FS,
|
||||
MALI_C55_AEXP_HIST_TAP_TPG,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mali_c55_aexp_skip_x - Horizontal pixel skipping
|
||||
* @MALI_C55_AEXP_SKIP_X_EVERY_2ND: Collect every 2nd pixel horizontally
|
||||
* @MALI_C55_AEXP_SKIP_X_EVERY_3RD: Collect every 3rd pixel horizontally
|
||||
* @MALI_C55_AEXP_SKIP_X_EVERY_4TH: Collect every 4th pixel horizontally
|
||||
* @MALI_C55_AEXP_SKIP_X_EVERY_5TH: Collect every 5th pixel horizontally
|
||||
* @MALI_C55_AEXP_SKIP_X_EVERY_8TH: Collect every 8th pixel horizontally
|
||||
* @MALI_C55_AEXP_SKIP_X_EVERY_9TH: Collect every 9th pixel horizontally
|
||||
*/
|
||||
enum mali_c55_aexp_skip_x {
|
||||
MALI_C55_AEXP_SKIP_X_EVERY_2ND,
|
||||
MALI_C55_AEXP_SKIP_X_EVERY_3RD,
|
||||
MALI_C55_AEXP_SKIP_X_EVERY_4TH,
|
||||
MALI_C55_AEXP_SKIP_X_EVERY_5TH,
|
||||
MALI_C55_AEXP_SKIP_X_EVERY_8TH,
|
||||
MALI_C55_AEXP_SKIP_X_EVERY_9TH
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mali_c55_aexp_skip_y - Vertical pixel skipping
|
||||
* @MALI_C55_AEXP_SKIP_Y_ALL: Collect every single pixel vertically
|
||||
* @MALI_C55_AEXP_SKIP_Y_EVERY_2ND: Collect every 2nd pixel vertically
|
||||
* @MALI_C55_AEXP_SKIP_Y_EVERY_3RD: Collect every 3rd pixel vertically
|
||||
* @MALI_C55_AEXP_SKIP_Y_EVERY_4TH: Collect every 4th pixel vertically
|
||||
* @MALI_C55_AEXP_SKIP_Y_EVERY_5TH: Collect every 5th pixel vertically
|
||||
* @MALI_C55_AEXP_SKIP_Y_EVERY_8TH: Collect every 8th pixel vertically
|
||||
* @MALI_C55_AEXP_SKIP_Y_EVERY_9TH: Collect every 9th pixel vertically
|
||||
*/
|
||||
enum mali_c55_aexp_skip_y {
|
||||
MALI_C55_AEXP_SKIP_Y_ALL,
|
||||
MALI_C55_AEXP_SKIP_Y_EVERY_2ND,
|
||||
MALI_C55_AEXP_SKIP_Y_EVERY_3RD,
|
||||
MALI_C55_AEXP_SKIP_Y_EVERY_4TH,
|
||||
MALI_C55_AEXP_SKIP_Y_EVERY_5TH,
|
||||
MALI_C55_AEXP_SKIP_Y_EVERY_8TH,
|
||||
MALI_C55_AEXP_SKIP_Y_EVERY_9TH
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mali_c55_aexp_row_column_offset - Start from the first or second row or
|
||||
* column
|
||||
* @MALI_C55_AEXP_FIRST_ROW_OR_COL: Start from the first row / column
|
||||
* @MALI_C55_AEXP_SECOND_ROW_OR_COL: Start from the second row / column
|
||||
*/
|
||||
enum mali_c55_aexp_row_column_offset {
|
||||
MALI_C55_AEXP_FIRST_ROW_OR_COL = 1,
|
||||
MALI_C55_AEXP_SECOND_ROW_OR_COL = 2,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mali_c55_aexp_hist_plane_mode - Mode for the AEXP Histograms
|
||||
* @MALI_C55_AEXP_HIST_COMBINED: All color planes in one 1024-bin histogram
|
||||
* @MALI_C55_AEXP_HIST_SEPARATE: Each color plane in one 256-bin histogram with a bin width of 16
|
||||
* @MALI_C55_AEXP_HIST_FOCUS_00: Top left plane in the first bank, rest in second bank
|
||||
* @MALI_C55_AEXP_HIST_FOCUS_01: Top right plane in the first bank, rest in second bank
|
||||
* @MALI_C55_AEXP_HIST_FOCUS_10: Bottom left plane in the first bank, rest in second bank
|
||||
* @MALI_C55_AEXP_HIST_FOCUS_11: Bottom right plane in the first bank, rest in second bank
|
||||
*
|
||||
* In the "focus" modes statistics are collected into two 512-bin histograms
|
||||
* with a bin width of 8. One colour plane is in the first histogram with the
|
||||
* remainder combined into the second. The four options represent which of the
|
||||
* four positions in a bayer pattern are the focused plane.
|
||||
*/
|
||||
enum mali_c55_aexp_hist_plane_mode {
|
||||
MALI_C55_AEXP_HIST_COMBINED = 0,
|
||||
MALI_C55_AEXP_HIST_SEPARATE = 1,
|
||||
MALI_C55_AEXP_HIST_FOCUS_00 = 4,
|
||||
MALI_C55_AEXP_HIST_FOCUS_01 = 5,
|
||||
MALI_C55_AEXP_HIST_FOCUS_10 = 6,
|
||||
MALI_C55_AEXP_HIST_FOCUS_11 = 7,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mali_c55_params_aexp_hist - configuration for AEXP metering hists
|
||||
*
|
||||
* This struct allows users to configure the 1024-bin AEXP histograms. Broadly
|
||||
* speaking the parameters allow you to mask particular regions of the image and
|
||||
* to select different kinds of histogram.
|
||||
*
|
||||
* The skip_x, offset_x, skip_y and offset_y fields allow users to ignore or
|
||||
* mask pixels in the frame by their position relative to the top left pixel.
|
||||
* First, the skip_y, offset_x and offset_y fields define which of the pixels
|
||||
* within each 2x2 region will be counted in the statistics.
|
||||
*
|
||||
* If skip_y == 0 then two pixels from each covered region will be counted. If
|
||||
* both offset_x and offset_y are zero, then the two left-most pixels in each
|
||||
* 2x2 pixel region will be counted. Setting offset_x = 1 will discount the top
|
||||
* left pixel and count the top right pixel. Setting offset_y = 1 will discount
|
||||
* the bottom left pixel and count the bottom right pixel.
|
||||
*
|
||||
* If skip_y != 0 then only a single pixel from each region covered by the
|
||||
* pattern will be counted. In this case offset_x controls whether the pixel
|
||||
* that's counted is in the left (if offset_x == 0) or right (if offset_x == 1)
|
||||
* column and offset_y controls whether the pixel that's counted is in the top
|
||||
* (if offset_y == 0) or bottom (if offset_y == 1) row.
|
||||
*
|
||||
* The skip_x and skip_y fields control how the 2x2 pixel region is repeated
|
||||
* across the image data. The first instance of the region is always in the top
|
||||
* left of the image data. The skip_x field controls how many pixels are ignored
|
||||
* in the x direction before the pixel masking region is repeated. The skip_y
|
||||
* field controls how many pixels are ignored in the y direction before the
|
||||
* pixel masking region is repeated.
|
||||
*
|
||||
* These fields can be used to reduce the number of pixels counted for the
|
||||
* statistics, but it's important to be careful to configure them correctly.
|
||||
* Some combinations of values will result in colour components from the input
|
||||
* data being ignored entirely, for example in the following configuration:
|
||||
*
|
||||
* skip_x = 0
|
||||
* offset_x = 0
|
||||
* skip_y = 0
|
||||
* offset_y = 0
|
||||
*
|
||||
* Only the R and Gb components of RGGB data that was input would be collected.
|
||||
* Similarly in the following configuration:
|
||||
*
|
||||
* skip_x = 0
|
||||
* offset_x = 0
|
||||
* skip_y = 1
|
||||
* offset_y = 1
|
||||
*
|
||||
* Only the Gb component of RGGB data that was input would be collected. To
|
||||
* correct things such that all 4 colour components were included it would be
|
||||
* necessary to set the skip_x and skip_y fields in a way that resulted in all
|
||||
* four colour components being collected:
|
||||
*
|
||||
* skip_x = 1
|
||||
* offset_x = 0
|
||||
* skip_y = 1
|
||||
* offset_y = 1
|
||||
*
|
||||
* header.type should be set to one of either MALI_C55_PARAM_BLOCK_AEXP_HIST or
|
||||
* MALI_C55_PARAM_BLOCK_AEXP_IHIST from :c:type:`mali_c55_param_block_type`.
|
||||
*
|
||||
* @header: The Mali-C55 parameters block header
|
||||
* @skip_x: Horizontal decimation. See enum mali_c55_aexp_skip_x
|
||||
* @offset_x: Skip the first column, or not. See enum mali_c55_aexp_row_column_offset
|
||||
* @skip_y: Vertical decimation. See enum mali_c55_aexp_skip_y
|
||||
* @offset_y: Skip the first row, or not. See enum mali_c55_aexp_row_column_offset
|
||||
* @scale_bottom: Scale pixels in bottom half of intensity range: 0=1x ,1=2x, 2=4x, 4=8x, 4=16x
|
||||
* @scale_top: scale pixels in top half of intensity range: 0=1x ,1=2x, 2=4x, 4=8x, 4=16x
|
||||
* @plane_mode: Plane separation mode. See enum mali_c55_aexp_hist_plane_mode
|
||||
* @tap_point: Tap point for histogram from enum mali_c55_aexp_hist_tap_points.
|
||||
* This parameter is unused for the post-Iridix Histogram
|
||||
*/
|
||||
struct mali_c55_params_aexp_hist {
|
||||
struct v4l2_isp_params_block_header header;
|
||||
__u8 skip_x;
|
||||
__u8 offset_x;
|
||||
__u8 skip_y;
|
||||
__u8 offset_y;
|
||||
__u8 scale_bottom;
|
||||
__u8 scale_top;
|
||||
__u8 plane_mode;
|
||||
__u8 tap_point;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mali_c55_params_aexp_weights - Array of weights for AEXP metering
|
||||
*
|
||||
* This struct allows users to configure the weighting for both of the 1024-bin
|
||||
* AEXP histograms. The pixel data collected for each zone is multiplied by the
|
||||
* corresponding weight from this array, which may be zero if the intention is
|
||||
* to mask off the zone entirely.
|
||||
*
|
||||
* header.type should be set to one of either MALI_C55_PARAM_BLOCK_AEXP_HIST_WEIGHTS
|
||||
* or MALI_C55_PARAM_BLOCK_AEXP_IHIST_WEIGHTS from :c:type:`mali_c55_param_block_type`.
|
||||
*
|
||||
* @header: The Mali-C55 parameters block header
|
||||
* @nodes_used_horiz: Number of active zones horizontally [0..15]
|
||||
* @nodes_used_vert: Number of active zones vertically [0..15]
|
||||
* @zone_weights: Zone weighting. Index is row*col where 0,0 is the top
|
||||
* left zone continuing in raster order. Each zone can be
|
||||
* weighted in the range [0..15]. The number of rows and
|
||||
* columns is defined by @nodes_used_vert and
|
||||
* @nodes_used_horiz
|
||||
*/
|
||||
struct mali_c55_params_aexp_weights {
|
||||
struct v4l2_isp_params_block_header header;
|
||||
__u8 nodes_used_horiz;
|
||||
__u8 nodes_used_vert;
|
||||
__u8 zone_weights[MALI_C55_MAX_ZONES];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mali_c55_params_digital_gain - Digital gain value
|
||||
*
|
||||
* This struct carries a digital gain value to set in the ISP.
|
||||
*
|
||||
* header.type should be set to MALI_C55_PARAM_BLOCK_DIGITAL_GAIN from
|
||||
* :c:type:`mali_c55_param_block_type` for this block.
|
||||
*
|
||||
* @header: The Mali-C55 parameters block header
|
||||
* @gain: The digital gain value to apply, in Q5.8 format.
|
||||
*/
|
||||
struct mali_c55_params_digital_gain {
|
||||
struct v4l2_isp_params_block_header header;
|
||||
__u16 gain;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mali_c55_awb_stats_mode - Statistics mode for AWB
|
||||
* @MALI_C55_AWB_MODE_GRBR: Statistics collected as Green/Red and Blue/Red ratios
|
||||
* @MALI_C55_AWB_MODE_RGBG: Statistics collected as Red/Green and Blue/Green ratios
|
||||
*/
|
||||
enum mali_c55_awb_stats_mode {
|
||||
MALI_C55_AWB_MODE_GRBR = 0,
|
||||
MALI_C55_AWB_MODE_RGBG,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mali_c55_params_awb_gains - Gain settings for auto white balance
|
||||
*
|
||||
* This struct allows users to configure the gains for auto-white balance. There
|
||||
* are four gain settings corresponding to each colour channel in the bayer
|
||||
* domain. Although named generically, the association between the gain applied
|
||||
* and the colour channel is done automatically within the ISP depending on the
|
||||
* input format, and so the following mapping always holds true::
|
||||
*
|
||||
* gain00 = R
|
||||
* gain01 = Gr
|
||||
* gain10 = Gb
|
||||
* gain11 = B
|
||||
*
|
||||
* All of the gains are stored in Q4.8 format.
|
||||
*
|
||||
* header.type should be set to one of either MALI_C55_PARAM_BLOCK_AWB_GAINS or
|
||||
* MALI_C55_PARAM_BLOCK_AWB_GAINS_AEXP from :c:type:`mali_c55_param_block_type`.
|
||||
*
|
||||
* @header: The Mali-C55 parameters block header
|
||||
* @gain00: Multiplier for colour channel 00
|
||||
* @gain01: Multiplier for colour channel 01
|
||||
* @gain10: Multiplier for colour channel 10
|
||||
* @gain11: Multiplier for colour channel 11
|
||||
*/
|
||||
struct mali_c55_params_awb_gains {
|
||||
struct v4l2_isp_params_block_header header;
|
||||
__u16 gain00;
|
||||
__u16 gain01;
|
||||
__u16 gain10;
|
||||
__u16 gain11;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mali_c55_params_awb_tap_points - Tap points for the AWB statistics
|
||||
* @MALI_C55_AWB_STATS_TAP_PF: Immediately after the Purple Fringe block
|
||||
* @MALI_C55_AWB_STATS_TAP_CNR: Immediately after the CNR block
|
||||
*/
|
||||
enum mali_c55_params_awb_tap_points {
|
||||
MALI_C55_AWB_STATS_TAP_PF = 0,
|
||||
MALI_C55_AWB_STATS_TAP_CNR,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mali_c55_params_awb_config - Stats settings for auto-white balance
|
||||
*
|
||||
* This struct allows the configuration of the statistics generated for auto
|
||||
* white balance. Pixel intensity limits can be set to exclude overly bright or
|
||||
* dark regions of an image from the statistics entirely. Colour ratio minima
|
||||
* and maxima can be set to discount pixels who's ratios fall outside the
|
||||
* defined boundaries; there are two sets of registers to do this - the
|
||||
* "min/max" ratios which bound a region and the "high/low" ratios which further
|
||||
* trim the upper and lower ratios. For example with the boundaries configured
|
||||
* as follows, only pixels whos colour ratios falls into the region marked "A"
|
||||
* would be counted::
|
||||
*
|
||||
* cr_high
|
||||
* 2.0 | |
|
||||
* | cb_max --> _________________________v_____
|
||||
* 1.8 | | \ |
|
||||
* | | \ |
|
||||
* 1.6 | | \ |
|
||||
* | | \ |
|
||||
* c 1.4 | cb_low -->|\ A \|<-- cb_high
|
||||
* b | | \ |
|
||||
* 1.2 | | \ |
|
||||
* r | | \ |
|
||||
* a 1.0 | cb_min --> |____\_________________________|
|
||||
* t | ^ ^ ^
|
||||
* i 0.8 | | | |
|
||||
* o | cr_min | cr_max
|
||||
* s 0.6 | |
|
||||
* | cr_low
|
||||
* 0.4 |
|
||||
* |
|
||||
* 0.2 |
|
||||
* |
|
||||
* 0.0 |_______________________________________________________________
|
||||
* 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0
|
||||
* cr ratios
|
||||
*
|
||||
* header.type should be set to MALI_C55_PARAM_BLOCK_AWB_CONFIG from
|
||||
* :c:type:`mali_c55_param_block_type` for this block.
|
||||
*
|
||||
* @header: The Mali-C55 parameters block header
|
||||
* @tap_point: The tap point from enum mali_c55_params_awb_tap_points
|
||||
* @stats_mode: AWB statistics collection mode, see :c:type:`mali_c55_awb_stats_mode`
|
||||
* @white_level: Upper pixel intensity (I.E. raw pixel values) limit
|
||||
* @black_level: Lower pixel intensity (I.E. raw pixel values) limit
|
||||
* @cr_max: Maximum R/G ratio (Q4.8 format)
|
||||
* @cr_min: Minimum R/G ratio (Q4.8 format)
|
||||
* @cb_max: Maximum B/G ratio (Q4.8 format)
|
||||
* @cb_min: Minimum B/G ratio (Q4.8 format)
|
||||
* @nodes_used_horiz: Number of active zones horizontally [0..15]
|
||||
* @nodes_used_vert: Number of active zones vertically [0..15]
|
||||
* @cr_high: R/G ratio trim high (Q4.8 format)
|
||||
* @cr_low: R/G ratio trim low (Q4.8 format)
|
||||
* @cb_high: B/G ratio trim high (Q4.8 format)
|
||||
* @cb_low: B/G ratio trim low (Q4.8 format)
|
||||
*/
|
||||
struct mali_c55_params_awb_config {
|
||||
struct v4l2_isp_params_block_header header;
|
||||
__u8 tap_point;
|
||||
__u8 stats_mode;
|
||||
__u16 white_level;
|
||||
__u16 black_level;
|
||||
__u16 cr_max;
|
||||
__u16 cr_min;
|
||||
__u16 cb_max;
|
||||
__u16 cb_min;
|
||||
__u8 nodes_used_horiz;
|
||||
__u8 nodes_used_vert;
|
||||
__u16 cr_high;
|
||||
__u16 cr_low;
|
||||
__u16 cb_high;
|
||||
__u16 cb_low;
|
||||
};
|
||||
|
||||
#define MALI_C55_NUM_MESH_SHADING_ELEMENTS 3072
|
||||
|
||||
/**
|
||||
* struct mali_c55_params_mesh_shading_config - Mesh shading configuration
|
||||
*
|
||||
* The mesh shading correction module allows programming a separate table of
|
||||
* either 16x16 or 32x32 node coefficients for 3 different light sources. The
|
||||
* final correction coefficients applied are computed by blending the
|
||||
* coefficients from two tables together.
|
||||
*
|
||||
* A page of 1024 32-bit integers is associated to each colour channel, with
|
||||
* pages stored consecutively in memory. Each 32-bit integer packs 3 8-bit
|
||||
* correction coefficients for a single node, one for each of the three light
|
||||
* sources. The 8 most significant bits are unused. The following table
|
||||
* describes the layout::
|
||||
*
|
||||
* +----------- Page (Colour Plane) 0 -------------+
|
||||
* | @mesh[i] | Mesh Point | Bits | Light Source |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 0 | 0,0 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 1 | 0,1 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | ... | ... | ... | ... |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 1023 | 31,31 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +----------- Page (Colour Plane) 1 -------------+
|
||||
* | @mesh[i] | Mesh Point | Bits | Light Source |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 1024 | 0,0 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 1025 | 0,1 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | ... | ... | ... | ... |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 2047 | 31,31 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +----------- Page (Colour Plane) 2 -------------+
|
||||
* | @mesh[i] | Mesh Point | Bits | Light Source |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 2048 | 0,0 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 2049 | 0,1 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | ... | ... | ... | ... |
|
||||
* +-----------+------------+-------+--------------+
|
||||
* | 3071 | 31,31 | 16,23 | LS2 |
|
||||
* | | | 08-15 | LS1 |
|
||||
* | | | 00-07 | LS0 |
|
||||
* +-----------+------------+-------+--------------+
|
||||
*
|
||||
* The @mesh_scale member determines the precision and minimum and maximum gain.
|
||||
* For example if @mesh_scale is 0 and therefore selects 0 - 2x gain, a value of
|
||||
* 0 in a coefficient means 0.0 gain, a value of 128 means 1.0 gain and 255
|
||||
* means 2.0 gain.
|
||||
*
|
||||
* header.type should be set to MALI_C55_PARAM_MESH_SHADING_CONFIG from
|
||||
* :c:type:`mali_c55_param_block_type` for this block.
|
||||
*
|
||||
* @header: The Mali-C55 parameters block header
|
||||
* @mesh_show: Output the mesh data rather than image data
|
||||
* @mesh_scale: Set the precision and maximum gain range of mesh shading
|
||||
* - 0 = 0-2x gain
|
||||
* - 1 = 0-4x gain
|
||||
* - 2 = 0-8x gain
|
||||
* - 3 = 0-16x gain
|
||||
* - 4 = 1-2x gain
|
||||
* - 5 = 1-3x gain
|
||||
* - 6 = 1-5x gain
|
||||
* - 7 = 1-9x gain
|
||||
* @mesh_page_r: Mesh page select for red colour plane [0..2]
|
||||
* @mesh_page_g: Mesh page select for green colour plane [0..2]
|
||||
* @mesh_page_b: Mesh page select for blue colour plane [0..2]
|
||||
* @mesh_width: Number of horizontal nodes minus 1 [15,31]
|
||||
* @mesh_height: Number of vertical nodes minus 1 [15,31]
|
||||
* @mesh: Mesh shading correction tables
|
||||
*/
|
||||
struct mali_c55_params_mesh_shading_config {
|
||||
struct v4l2_isp_params_block_header header;
|
||||
__u8 mesh_show;
|
||||
__u8 mesh_scale;
|
||||
__u8 mesh_page_r;
|
||||
__u8 mesh_page_g;
|
||||
__u8 mesh_page_b;
|
||||
__u8 mesh_width;
|
||||
__u8 mesh_height;
|
||||
__u32 mesh[MALI_C55_NUM_MESH_SHADING_ELEMENTS];
|
||||
};
|
||||
|
||||
/** enum mali_c55_params_mesh_alpha_bank - Mesh shading table bank selection
|
||||
* @MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS1 - Select Light Sources 0 and 1
|
||||
* @MALI_C55_MESH_ALPHA_BANK_LS1_AND_LS2 - Select Light Sources 1 and 2
|
||||
* @MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS2 - Select Light Sources 0 and 2
|
||||
*/
|
||||
enum mali_c55_params_mesh_alpha_bank {
|
||||
MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS1 = 0,
|
||||
MALI_C55_MESH_ALPHA_BANK_LS1_AND_LS2 = 1,
|
||||
MALI_C55_MESH_ALPHA_BANK_LS0_AND_LS2 = 4
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mali_c55_params_mesh_shading_selection - Mesh table selection
|
||||
*
|
||||
* The module computes the final correction coefficients by blending the ones
|
||||
* from two light source tables, which are selected (independently for each
|
||||
* colour channel) by the @mesh_alpha_bank_r/g/b fields.
|
||||
*
|
||||
* The final blended coefficients for each node are calculated using the
|
||||
* following equation:
|
||||
*
|
||||
* Final coefficient = (a * LS\ :sub:`b`\ + (256 - a) * LS\ :sub:`a`\) / 256
|
||||
*
|
||||
* Where a is the @mesh_alpha_r/g/b value, and LS\ :sub:`a`\ and LS\ :sub:`b`\
|
||||
* are the node cofficients for the two tables selected by the
|
||||
* @mesh_alpha_bank_r/g/b value.
|
||||
*
|
||||
* The scale of the applied correction may also be controlled by tuning the
|
||||
* @mesh_strength member. This is a modifier to the final coefficients which can
|
||||
* be used to globally reduce the gains applied.
|
||||
*
|
||||
* header.type should be set to MALI_C55_PARAM_MESH_SHADING_SELECTION from
|
||||
* :c:type:`mali_c55_param_block_type` for this block.
|
||||
*
|
||||
* @header: The Mali-C55 parameters block header
|
||||
* @mesh_alpha_bank_r: Red mesh table select (c:type:`enum mali_c55_params_mesh_alpha_bank`)
|
||||
* @mesh_alpha_bank_g: Green mesh table select (c:type:`enum mali_c55_params_mesh_alpha_bank`)
|
||||
* @mesh_alpha_bank_b: Blue mesh table select (c:type:`enum mali_c55_params_mesh_alpha_bank`)
|
||||
* @mesh_alpha_r: Blend coefficient for R [0..255]
|
||||
* @mesh_alpha_g: Blend coefficient for G [0..255]
|
||||
* @mesh_alpha_b: Blend coefficient for B [0..255]
|
||||
* @mesh_strength: Mesh strength in Q4.12 format [0..4096]
|
||||
*/
|
||||
struct mali_c55_params_mesh_shading_selection {
|
||||
struct v4l2_isp_params_block_header header;
|
||||
__u8 mesh_alpha_bank_r;
|
||||
__u8 mesh_alpha_bank_g;
|
||||
__u8 mesh_alpha_bank_b;
|
||||
__u8 mesh_alpha_r;
|
||||
__u8 mesh_alpha_g;
|
||||
__u8 mesh_alpha_b;
|
||||
__u16 mesh_strength;
|
||||
};
|
||||
|
||||
/**
|
||||
* define MALI_C55_PARAMS_MAX_SIZE - Maximum size of all Mali C55 Parameters
|
||||
*
|
||||
* Though the parameters for the Mali-C55 are passed as optional blocks, the
|
||||
* driver still needs to know the absolute maximum size so that it can allocate
|
||||
* a buffer sized appropriately to accommodate userspace attempting to set all
|
||||
* possible parameters in a single frame.
|
||||
*
|
||||
* Some structs are in this list multiple times. Where that's the case, it just
|
||||
* reflects the fact that the same struct can be used with multiple different
|
||||
* header types from :c:type:`mali_c55_param_block_type`.
|
||||
*/
|
||||
#define MALI_C55_PARAMS_MAX_SIZE \
|
||||
(sizeof(struct mali_c55_params_sensor_off_preshading) + \
|
||||
sizeof(struct mali_c55_params_aexp_hist) + \
|
||||
sizeof(struct mali_c55_params_aexp_weights) + \
|
||||
sizeof(struct mali_c55_params_aexp_hist) + \
|
||||
sizeof(struct mali_c55_params_aexp_weights) + \
|
||||
sizeof(struct mali_c55_params_digital_gain) + \
|
||||
sizeof(struct mali_c55_params_awb_gains) + \
|
||||
sizeof(struct mali_c55_params_awb_config) + \
|
||||
sizeof(struct mali_c55_params_awb_gains) + \
|
||||
sizeof(struct mali_c55_params_mesh_shading_config) + \
|
||||
sizeof(struct mali_c55_params_mesh_shading_selection))
|
||||
|
||||
#endif /* __UAPI_MALI_C55_CONFIG_H */
|
||||
|
||||
Reference in New Issue
Block a user