Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * 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 */