1/*
2 * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef __HI_AE_COMM_H__
17#define __HI_AE_COMM_H__
18
19#include "hi_type.h"
20#include "hi_comm_isp.h"
21
22#ifdef __cplusplus
23#if __cplusplus
24extern "C" {
25#endif
26#endif /* End of #ifdef __cplusplus */
27
28#define HI_AE_LIB_NAME "hisi_ae_lib"
29
30/* ae ctrl cmd */
31typedef enum hiAE_CTRL_CMD_E {
32    AE_DEBUG_ATTR_SET,
33    AE_DEBUG_ATTR_GET,
34
35    AE_CTRL_BUTT,
36} AE_CTRL_CMD_E;
37
38typedef struct hiAE_DBG_ATTR_S {
39    HI_U32  u32MaxIntTime;
40    HI_U32  u32MinIntTime;
41    HI_U32  u32MaxAgain;
42    HI_U32  u32MinAgain;
43    HI_U32  u32MaxDgain;
44    HI_U32  u32MinDgain;
45    HI_U32  u32MaxIspDgain;
46    HI_U32  u32MinIspDgain;
47    HI_U32  u32MaxSysGain;
48    HI_U32  u32MinSysGain;
49    HI_U32  u32Compensation;
50    HI_U32  u32EVBias;
51    HI_BOOL bManualExposureEn;
52    HI_BOOL bManualTimeEn;
53    HI_BOOL bManualAgainEn;
54    HI_BOOL bManualDgainEn;
55    HI_BOOL bManualIspDgainEn;
56    HI_U32  u32ManualExposureLines;
57    HI_U32  u32ManualAgain;
58    HI_U32  u32ManualDgain;
59    HI_U32  u32ManualIspDgain;
60    HI_U32  au32AeWeights[(AE_ZONE_ROW) * (AE_ZONE_COLUMN)];
61} AE_DBG_ATTR_S;
62
63typedef struct hiAE_DBG_STATUS_S {
64    HI_U32  u32FrmNumBgn;
65    HI_U32  u32FullLines;
66    HI_U32  u32IntTime;
67    HI_U32  u32ShortIntTime;
68    HI_U32  u32MedIntTime;
69    HI_U32  u32LongIntTime;
70    HI_U32  u32Again;
71    HI_U32  u32Dgain;
72    HI_U32  u32IspDgain;
73    HI_U32  u32IrisFNOLin;
74    HI_U64  u64Exposure;
75    HI_U32  u32Increment;
76    HI_S32  s32HistError;
77    HI_S32  s32HistOriAverage;
78    HI_S32  s32LumaOffset;
79    HI_U32  u32Iso;
80    HI_U32  u32ExpRatio;
81    HI_U32  u32OverExpRatio;
82    HI_U32  u32OverExpRatioFilter;
83} AE_DBG_STATUS_S;
84
85/* sensor's interface to ae
86 * eg: 0.35db, enAccuType=AE_ACCURACY_DB, f32Accuracy=0.35
87 *  and the multiply of 0.35db is power(10, (0.35/20))
88 *  eg: 1/16, 2/16, 3/16 multiplies, enAccuType=AE_ACCURACY_LINEAR, f32Accuracy=0.0625
89 *  eg: 1,2,4,8,16 multiplies, enAccuType=AE_ACCURACY_DB, f32Accuracy=6
90 */
91typedef enum hiAE_ACCURACY_E {
92    AE_ACCURACY_DB = 0,
93    AE_ACCURACY_LINEAR,
94    AE_ACCURACY_TABLE,
95
96    AE_ACCURACY_BUTT,
97} AE_ACCURACY_E;
98
99typedef struct hiAE_ACCURACY_S {
100    AE_ACCURACY_E enAccuType;
101    float   f32Accuracy;
102    float   f32Offset;
103} AE_ACCURACY_S;
104
105typedef struct hiAE_SENSOR_DEFAULT_S {
106    HI_U8   au8HistThresh[HIST_THRESH_NUM];
107    HI_U8   u8AeCompensation;
108
109    HI_U32  u32LinesPer500ms;
110    HI_U32  u32FlickerFreq;
111    HI_FLOAT f32Fps;
112    HI_U32  u32HmaxTimes; /* unit is ns */
113    HI_U32  u32InitExposure;
114    HI_U32  u32InitAESpeed;
115    HI_U32  u32InitAETolerance;
116
117    HI_U32  u32FullLinesStd;
118    HI_U32  u32FullLinesMax;
119    HI_U32  u32FullLines;
120    HI_U32  u32BinningFullLines;
121    HI_U32  u32MaxIntTime;     /* RW;unit is line */
122    HI_U32  u32MinIntTime;
123    HI_U32  u32MaxIntTimeTarget;
124    HI_U32  u32MinIntTimeTarget;
125    AE_ACCURACY_S stIntTimeAccu;
126
127    HI_U32  u32MaxAgain;
128    HI_U32  u32MinAgain;
129    HI_U32  u32MaxAgainTarget;
130    HI_U32  u32MinAgainTarget;
131    AE_ACCURACY_S stAgainAccu;
132
133    HI_U32  u32MaxDgain;
134    HI_U32  u32MinDgain;
135    HI_U32  u32MaxDgainTarget;
136    HI_U32  u32MinDgainTarget;
137    AE_ACCURACY_S stDgainAccu;
138
139    HI_U32  u32MaxISPDgainTarget;
140    HI_U32  u32MinISPDgainTarget;
141    HI_U32  u32ISPDgainShift;
142
143    HI_U32  u32MaxIntTimeStep;
144    HI_BOOL bMaxTimeStepEnable;
145    HI_U32  u32MaxIncTimeStep[WDR_MAX_FRAME_NUM];
146    HI_U32  u32MaxDecTimeStep[WDR_MAX_FRAME_NUM];
147    HI_U32  u32LFMaxShortTime;
148    HI_U32  u32LFMinExposure;
149
150    ISP_AE_ROUTE_S stAERouteAttr;
151    HI_BOOL bAERouteExValid;
152    ISP_AE_ROUTE_EX_S stAERouteAttrEx;
153
154    ISP_AE_ROUTE_S stAERouteSFAttr;
155    ISP_AE_ROUTE_EX_S stAERouteSFAttrEx;
156
157    HI_U16 u16ManRatioEnable;
158    HI_U32 au32Ratio[EXP_RATIO_NUM];
159
160    ISP_IRIS_TYPE_E  enIrisType;
161    ISP_PIRIS_ATTR_S stPirisAttr;
162    ISP_IRIS_F_NO_E  enMaxIrisFNO;  /* RW; Range:[0, 10]; Format:4.0;
163                                       Max F number of Piris's aperture, it's related to the specific iris */
164    ISP_IRIS_F_NO_E  enMinIrisFNO;  /* RW; Range:[0, 10]; Format:4.0;
165                                       Min F number of Piris's aperture, it's related to the specific iris */
166    ISP_AE_STRATEGY_E enAeExpMode;
167
168    HI_U16 u16ISOCalCoef;
169    HI_U8  u8AERunInterval;
170    HI_U32 u32ExpRatioMax;
171    HI_U32 u32ExpRatioMin;
172    HI_BOOL bDiffGainSupport;
173    ISP_QUICK_START_PARAM_S stQuickStart;
174    ISP_PRIOR_FRAME_E enPriorFrame;
175    HI_BOOL bAEGainSepCfg;
176    HI_BOOL bLhcgSupport;
177    HI_U32 u32SnsLhcgExpRatio;
178} AE_SENSOR_DEFAULT_S;
179
180typedef struct hiAE_FSWDR_ATTR_S {
181    ISP_FSWDR_MODE_E enFSWDRMode;
182} AE_FSWDR_ATTR_S;
183
184typedef struct hiAE_EXP_PARAM_REG_S {
185    HI_U32 u32RegAddr;
186    HI_U32 u32RegValue;
187} AE_EXP_PARAM_REG_S;
188
189typedef struct hiAE_EXP_PARAM_S {
190    HI_U32 u32TarFps;
191    HI_U32 u32ExpTime;
192    HI_U32 u32ExpAgain;
193    HI_U32 u32ExpDgain;
194    HI_U32 u32ExpIspDgain;
195    AE_EXP_PARAM_REG_S stTimeReg[10]; /* 10 */
196    AE_EXP_PARAM_REG_S stAgainReg[10]; /* 10 */
197    AE_EXP_PARAM_REG_S stDgainReg[10]; /* 10 */
198} AE_EXP_PARAM_S;
199
200typedef struct hiAE_SENSOR_EXP_FUNC_S {
201    HI_S32 (*pfn_cmos_get_ae_default)(VI_PIPE ViPipe, AE_SENSOR_DEFAULT_S *pstAeSnsDft);
202
203    /* the function of sensor set fps */
204    HI_VOID (*pfn_cmos_fps_set)(VI_PIPE ViPipe, HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft);
205    HI_VOID (*pfn_cmos_slow_framerate_set)(VI_PIPE ViPipe, HI_U32 u32FullLines, AE_SENSOR_DEFAULT_S *pstAeSnsDft);
206
207    /* while isp notify ae to update sensor regs, ae call these funcs. */
208    HI_VOID (*pfn_cmos_inttime_update)(VI_PIPE ViPipe, HI_U32 u32IntTime);
209    HI_VOID (*pfn_cmos_gains_update)(VI_PIPE ViPipe, HI_U32 u32Again, HI_U32 u32Dgain);
210
211    HI_VOID (*pfn_cmos_again_calc_table)(VI_PIPE ViPipe, HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb);
212    HI_VOID (*pfn_cmos_dgain_calc_table)(VI_PIPE ViPipe, HI_U32 *pu32DgainLin, HI_U32 *pu32DgainDb);
213
214    HI_VOID (*pfn_cmos_get_inttime_max)(VI_PIPE ViPipe, HI_U16 u16ManRatioEnable,
215        HI_U32 *au32Ratio, HI_U32 *au32IntTimeMax, HI_U32 *au32IntTimeMin, HI_U32 *pu32LFMaxIntTime);
216
217    /* long frame mode set */
218    HI_VOID (*pfn_cmos_ae_fswdr_attr_set)(VI_PIPE ViPipe, AE_FSWDR_ATTR_S *pstAeFSWDRAttr);
219    HI_VOID (*pfn_cmos_ae_quick_start_status_set)(VI_PIPE ViPipe, HI_BOOL bQuickStartStatus);
220    HI_VOID (*pfn_cmos_exp_param_convert)(VI_PIPE ViPipe, AE_EXP_PARAM_S *pstExpFuncs);
221} AE_SENSOR_EXP_FUNC_S;
222
223typedef struct hiAE_SENSOR_REGISTER_S {
224    AE_SENSOR_EXP_FUNC_S stSnsExp;
225} AE_SENSOR_REGISTER_S;
226
227#ifdef __cplusplus
228#if __cplusplus
229}
230#endif
231#endif /* End of #ifdef __cplusplus */
232
233#endif
234