blob: f57ed1ec5981a4f17c19fff115bfcdbcc6c818c1 [file] [log] [blame]
/*
* Support for Intel Camera Imaging ISP subsystem.
* Copyright (c) 2015, Intel Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#ifndef __IA_CSS_S3A_TYPES_H
#define __IA_CSS_S3A_TYPES_H
/** @file
* CSS-API header file for 3A statistics parameters.
*/
#include <ia_css_frac.h>
#if (defined(SYSTEM_css_skycam_c0_system)) && (! defined(PIPE_GENERATION) )
#include "../../../../components/stats_3a/src/stats_3a_public.h"
#endif
/** 3A configuration. This configures the 3A statistics collection
* module.
*/
/** 3A statistics grid
*
* ISP block: S3A1 (3A Support for 3A ver.1 (Histogram is not used for AE))
* S3A2 (3A Support for 3A ver.2 (Histogram is used for AE))
* ISP1: S3A1 is used.
* ISP2: S3A2 is used.
*/
struct ia_css_3a_grid_info {
#if defined(SYSTEM_css_skycam_c0_system)
uint32_t ae_enable; /**< ae enabled in binary,
0:disabled, 1:enabled */
struct ae_public_config_grid_config ae_grd_info; /**< see description in ae_public.h*/
uint32_t awb_enable; /**< awb enabled in binary,
0:disabled, 1:enabled */
struct awb_public_config_grid_config awb_grd_info; /**< see description in awb_public.h*/
uint32_t af_enable; /**< af enabled in binary,
0:disabled, 1:enabled */
struct af_public_grid_config af_grd_info; /**< see description in af_public.h*/
uint32_t awb_fr_enable; /**< awb_fr enabled in binary,
0:disabled, 1:enabled */
struct awb_fr_public_grid_config awb_fr_grd_info;/**< see description in awb_fr_public.h*/
uint32_t elem_bit_depth; /**< TODO:Taken from BYT - need input from AIQ
if needed for SKC
Bit depth of element used
to calculate 3A statistics.
This is 13, which is the normalized
bayer bit depth in DSP. */
#else
uint32_t enable; /**< 3A statistics enabled.
0:disabled, 1:enabled */
uint32_t use_dmem; /**< DMEM or VMEM determines layout.
0:3A statistics are stored to VMEM,
1:3A statistics are stored to DMEM */
uint32_t has_histogram; /**< Statistics include histogram.
0:no histogram, 1:has histogram */
uint32_t width; /**< Width of 3A grid table.
(= Horizontal number of grid cells
in table, which cells have effective
statistics.) */
uint32_t height; /**< Height of 3A grid table.
(= Vertical number of grid cells
in table, which cells have effective
statistics.) */
uint32_t aligned_width; /**< Horizontal stride (for alloc).
(= Horizontal number of grid cells
in table, which means
the allocated width.) */
uint32_t aligned_height; /**< Vertical stride (for alloc).
(= Vertical number of grid cells
in table, which means
the allocated height.) */
uint32_t bqs_per_grid_cell; /**< Grid cell size in BQ(Bayer Quad) unit.
(1BQ means {Gr,R,B,Gb}(2x2 pixels).)
Valid values are 8,16,32,64. */
uint32_t deci_factor_log2; /**< log2 of bqs_per_grid_cell. */
uint32_t elem_bit_depth; /**< Bit depth of element used
to calculate 3A statistics.
This is 13, which is the normalized
bayer bit depth in DSP. */
#endif
};
#if defined(SYSTEM_css_skycam_c0_system)
#if defined USE_NEW_AE_STRUCT || defined USE_NEW_AWB_STRUCT
#define DEFAULT_3A_GRID_INFO \
{ \
0, /* ae_enable */ \
{0,0,0,0,0,0,0}, /* AE: width,height,b_width,b_height,x_start,y_start*/ \
0, /* awb_enable */ \
{0,0,0,0,0,0}, /* AWB: width,height,b_width,b_height,x_start,y_start*/ \
0, /* af_enable */ \
{0,0,0,0,0,0,0}, /* AF: width,height,b_width,b_height,x_start,y_start,ff_en*/ \
0, /* awb_fr_enable */ \
{0,0,0,0,0,0,0}, /* AWB_FR: width,height,b_width,b_height,x_start,y_start,ff_en*/ \
0, /* elem_bit_depth */ \
}
#else
#define DEFAULT_3A_GRID_INFO \
{ \
0, /* ae_enable */ \
{0,0,0,0,0,0,0,0,0}, /* AE: width,height,b_width,b_height,x_start,y_start,x_end,y_end*/ \
0, /* awb_enable */ \
{0,0,0,0,0,0,0,0}, /* AWB: width,height,b_width,b_height,x_start,y_start,x_end,y_end*/ \
0, /* af_enable */ \
{0,0,0,0,0,0,0}, /* AF: width,height,b_width,b_height,x_start,y_start,ff_en*/ \
0, /* awb_fr_enable */ \
{0,0,0,0,0,0,0}, /* AWB_FR: width,height,b_width,b_height,x_start,y_start,ff_en*/ \
0, /* elem_bit_depth */ \
}
#endif /* USE_NEW_AE_STRUCT || defined USE_NEW_AWB_STRUCT */
#else
#define DEFAULT_3A_GRID_INFO \
{ \
0, /* enable */ \
0, /* use_dmem */ \
0, /* has_histogram */ \
0, /* width */ \
0, /* height */ \
0, /* aligned_width */ \
0, /* aligned_height */ \
0, /* bqs_per_grid_cell */ \
0, /* deci_factor_log2 */ \
0, /* elem_bit_depth */ \
}
#endif
/* This struct should be split into 3, for AE, AWB and AF.
* However, that will require driver/ 3A lib modifications.
*/
/** 3A configuration. This configures the 3A statistics collection
* module.
*
* ae_y_*: Coefficients to calculate luminance from bayer.
* awb_lg_*: Thresholds to check the saturated bayer pixels for AWB.
* Condition of effective pixel for AWB level gate check:
* bayer(sensor) <= awb_lg_high_raw &&
* bayer(when AWB statisitcs is calculated) >= awb_lg_low &&
* bayer(when AWB statisitcs is calculated) <= awb_lg_high
* af_fir*: Coefficients of high pass filter to calculate AF statistics.
*
* ISP block: S3A1(ae_y_* for AE/AF, awb_lg_* for AWB)
* S3A2(ae_y_* for AF, awb_lg_* for AWB)
* SDVS1(ae_y_*)
* SDVS2(ae_y_*)
* ISP1: S3A1 and SDVS1 are used.
* ISP2: S3A2 and SDVS2 are used.
*/
struct ia_css_3a_config {
ia_css_u0_16 ae_y_coef_r; /**< Weight of R for Y.
u0.16, [0,65535],
default/ineffective 25559 */
ia_css_u0_16 ae_y_coef_g; /**< Weight of G for Y.
u0.16, [0,65535],
default/ineffective 32768 */
ia_css_u0_16 ae_y_coef_b; /**< Weight of B for Y.
u0.16, [0,65535],
default/ineffective 7209 */
ia_css_u0_16 awb_lg_high_raw; /**< AWB level gate high for raw.
u0.16, [0,65535],
default 65472(=1023*64),
ineffective 65535 */
ia_css_u0_16 awb_lg_low; /**< AWB level gate low.
u0.16, [0,65535],
default 64(=1*64),
ineffective 0 */
ia_css_u0_16 awb_lg_high; /**< AWB level gate high.
u0.16, [0,65535],
default 65535,
ineffective 65535 */
ia_css_s0_15 af_fir1_coef[7]; /**< AF FIR coefficients of fir1.
s0.15, [-32768,32767],
default/ineffective
-6689,-12207,-32768,32767,12207,6689,0 */
ia_css_s0_15 af_fir2_coef[7]; /**< AF FIR coefficients of fir2.
s0.15, [-32768,32767],
default/ineffective
2053,0,-18437,32767,-18437,2053,0 */
};
/** 3A statistics. This structure describes the data stored
* in each 3A grid point.
*
* ISP block: S3A1 (3A Support for 3A ver.1) (Histogram is not used for AE)
* S3A2 (3A Support for 3A ver.2) (Histogram is used for AE)
* - ae_y is used only for S3A1.
* - awb_* and af_* are used both for S3A1 and S3A2.
* ISP1: S3A1 is used.
* ISP2: S3A2 is used.
*/
struct ia_css_3a_output {
int32_t ae_y; /**< Sum of Y in a statistics window, for AE.
(u19.13) */
int32_t awb_cnt; /**< Number of effective pixels
in a statistics window.
Pixels passed by the AWB level gate check are
judged as "effective". (u32) */
int32_t awb_gr; /**< Sum of Gr in a statistics window, for AWB.
All Gr pixels (not only for effective pixels)
are summed. (u19.13) */
int32_t awb_r; /**< Sum of R in a statistics window, for AWB.
All R pixels (not only for effective pixels)
are summed. (u19.13) */
int32_t awb_b; /**< Sum of B in a statistics window, for AWB.
All B pixels (not only for effective pixels)
are summed. (u19.13) */
int32_t awb_gb; /**< Sum of Gb in a statistics window, for AWB.
All Gb pixels (not only for effective pixels)
are summed. (u19.13) */
int32_t af_hpf1; /**< Sum of |Y| following high pass filter af_fir1
within a statistics window, for AF. (u19.13) */
int32_t af_hpf2; /**< Sum of |Y| following high pass filter af_fir2
within a statistics window, for AF. (u19.13) */
};
/** 3A Statistics. This structure describes the statistics that are generated
* using the provided configuration (ia_css_3a_config).
*/
struct ia_css_3a_statistics {
struct ia_css_3a_grid_info grid; /**< grid info contains the dimensions of the 3A grid */
struct ia_css_3a_output *data; /**< the pointer to 3a_output[grid.width * grid.height]
containing the 3A statistics */
struct ia_css_3a_rgby_output *rgby_data;/**< the pointer to 3a_rgby_output[256]
containing the histogram */
};
/** Histogram (Statistics for AE).
*
* 4 histograms(r,g,b,y),
* 256 bins for each histogram, unsigned 24bit value for each bin.
* struct ia_css_3a_rgby_output data[256];
* ISP block: HIST2
* (ISP1: HIST2 is not used.)
* ISP2: HIST2 is used.
*/
struct ia_css_3a_rgby_output {
uint32_t r; /**< Number of R of one bin of the histogram R. (u24) */
uint32_t g; /**< Number of G of one bin of the histogram G. (u24) */
uint32_t b; /**< Number of B of one bin of the histogram B. (u24) */
uint32_t y; /**< Number of Y of one bin of the histogram Y. (u24) */
};
#endif /* __IA_CSS_S3A_TYPES_H */