11bd4fe43Sopenharmony_ci/*
21bd4fe43Sopenharmony_ci * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License.
51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at
61bd4fe43Sopenharmony_ci *
71bd4fe43Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81bd4fe43Sopenharmony_ci *
91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and
131bd4fe43Sopenharmony_ci * limitations under the License.
141bd4fe43Sopenharmony_ci */
151bd4fe43Sopenharmony_ci
161bd4fe43Sopenharmony_ci#ifndef __HI_SNS_CTRL_H__
171bd4fe43Sopenharmony_ci#define __HI_SNS_CTRL_H__
181bd4fe43Sopenharmony_ci
191bd4fe43Sopenharmony_ci#include "hi_type.h"
201bd4fe43Sopenharmony_ci#include "hi_comm_3a.h"
211bd4fe43Sopenharmony_ci#include "hi_debug.h"
221bd4fe43Sopenharmony_ci
231bd4fe43Sopenharmony_ci#ifdef __cplusplus
241bd4fe43Sopenharmony_ci#if __cplusplus
251bd4fe43Sopenharmony_ciextern "C" {
261bd4fe43Sopenharmony_ci#endif
271bd4fe43Sopenharmony_ci#endif /* End of #ifdef __cplusplus */
281bd4fe43Sopenharmony_ci
291bd4fe43Sopenharmony_ci#define ISP_SNS_SAVE_INFO_MAX 2
301bd4fe43Sopenharmony_citypedef struct hiISP_SNS_STATE_S {
311bd4fe43Sopenharmony_ci    HI_BOOL     bInit;                  /* HI_TRUE: Sensor init */
321bd4fe43Sopenharmony_ci    HI_BOOL     bSyncInit;              /* HI_TRUE: Sync Reg init */
331bd4fe43Sopenharmony_ci    HI_U8       u8ImgMode;
341bd4fe43Sopenharmony_ci    HI_U8       u8Hdr;               /* HI_TRUE: HDR enbale */
351bd4fe43Sopenharmony_ci    WDR_MODE_E  enWDRMode;
361bd4fe43Sopenharmony_ci
371bd4fe43Sopenharmony_ci    ISP_SNS_REGS_INFO_S astRegsInfo[ISP_SNS_SAVE_INFO_MAX]; /* [0]: Sensor reg info of cur-frame;
381bd4fe43Sopenharmony_ci                                                               [1]: Sensor reg info of pre-frame */
391bd4fe43Sopenharmony_ci
401bd4fe43Sopenharmony_ci    HI_U32      au32FL[ISP_SNS_SAVE_INFO_MAX];     /* [0]: FullLines of cur-frame;
411bd4fe43Sopenharmony_ci                                                      [1]: Pre FullLines of pre-frame */
421bd4fe43Sopenharmony_ci    HI_U32      u32FLStd;               /* FullLines std */
431bd4fe43Sopenharmony_ci    HI_U32      au32WDRIntTime[WDR_MAX_FRAME_NUM];
441bd4fe43Sopenharmony_ci    HI_U32      au32SensorWBGain[ISP_BAYER_CHN_NUM];
451bd4fe43Sopenharmony_ci} ISP_SNS_STATE_S;
461bd4fe43Sopenharmony_ci
471bd4fe43Sopenharmony_citypedef enum hiISP_SNS_MIRRORFLIP_TYPE_E {
481bd4fe43Sopenharmony_ci    ISP_SNS_NORMAL      = 0,
491bd4fe43Sopenharmony_ci    ISP_SNS_MIRROR      = 1,
501bd4fe43Sopenharmony_ci    ISP_SNS_FLIP        = 2,
511bd4fe43Sopenharmony_ci    ISP_SNS_MIRROR_FLIP = 3,
521bd4fe43Sopenharmony_ci    ISP_SNS_BUTT
531bd4fe43Sopenharmony_ci} ISP_SNS_MIRRORFLIP_TYPE_E;
541bd4fe43Sopenharmony_ci
551bd4fe43Sopenharmony_citypedef struct hiISP_SNS_BUS_EX_S {
561bd4fe43Sopenharmony_ci    char bus_addr;
571bd4fe43Sopenharmony_ci} ISP_SNS_BUS_EX_S;
581bd4fe43Sopenharmony_ci
591bd4fe43Sopenharmony_citypedef struct hiISP_SNS_OBJ_S {
601bd4fe43Sopenharmony_ci    HI_S32 (*pfnRegisterCallback)(VI_PIPE ViPipe, ALG_LIB_S *pstAeLib, ALG_LIB_S *pstAwbLib);
611bd4fe43Sopenharmony_ci    HI_S32 (*pfnUnRegisterCallback)(VI_PIPE ViPipe, ALG_LIB_S *pstAeLib, ALG_LIB_S *pstAwbLib);
621bd4fe43Sopenharmony_ci    HI_S32 (*pfnSetBusInfo)(VI_PIPE ViPipe, ISP_SNS_COMMBUS_U unSNSBusInfo);
631bd4fe43Sopenharmony_ci    HI_S32 (*pfnSetBusExInfo)(VI_PIPE ViPipe, ISP_SNS_BUS_EX_S *pstSerdesInfo);
641bd4fe43Sopenharmony_ci    HI_VOID (*pfnStandby)(VI_PIPE ViPipe);
651bd4fe43Sopenharmony_ci    HI_VOID (*pfnRestart)(VI_PIPE ViPipe);
661bd4fe43Sopenharmony_ci    HI_VOID (*pfnMirrorFlip)(VI_PIPE ViPipe, ISP_SNS_MIRRORFLIP_TYPE_E eSnsMirrorFlip);
671bd4fe43Sopenharmony_ci    HI_S32 (*pfnWriteReg)(VI_PIPE ViPipe, HI_U32 s32Addr, HI_U32 s32Data);
681bd4fe43Sopenharmony_ci    HI_S32 (*pfnReadReg)(VI_PIPE ViPipe, HI_U32 s32Addr);
691bd4fe43Sopenharmony_ci    HI_S32 (*pfnSetInit)(VI_PIPE ViPipe, ISP_INIT_ATTR_S *pstInitAttr);
701bd4fe43Sopenharmony_ci} ISP_SNS_OBJ_S;
711bd4fe43Sopenharmony_ci
721bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsMn34220Obj;
731bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx377Obj;
741bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx299Obj;
751bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx477Obj;
761bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx299SlvsObj;
771bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx290Obj;
781bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx327Obj;
791bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx327_2l_Obj;
801bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx334Obj;
811bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsOV2718Obj;
821bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsOV2775Obj;
831bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsAr0237Obj;
841bd4fe43Sopenharmony_ci
851bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsCmv50000Obj;
861bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx277SlvsObj;
871bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx117Obj;
881bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx290SlaveObj;
891bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx334SlaveObj;
901bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx226Obj;
911bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx390Obj;
921bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx335Obj;
931bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx307Obj;
941bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx307_2l_Obj;
951bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S g_sns_imx307_2l_obj;
961bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S g_stSnsImx307_2l_Slave_Obj;
971bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx458Obj;
981bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsSc4236Obj;
991bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsSc4210Obj;
1001bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsSc2231Obj;
1011bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsSc2235Obj;
1021bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsSc3235Obj;
1031bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsOs04b10_2lObj;
1041bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsSoiF37Obj;
1051bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsOs05aObj;
1061bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsOS08A10Obj;
1071bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsOs05a_2lObj;
1081bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsGc2053Obj;
1091bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsSharp8kObj;
1101bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsOv12870Obj;
1111bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsGc2053ForCarObj;
1121bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsImx415Obj;
1131bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsSp2305Obj;
1141bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsOv9284Obj;
1151bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S g_stSnsPs5260_2l_Obj;
1161bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S g_sns_imx390_obj;
1171bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S g_sns_q03_obj;
1181bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S g_sns_sc500ai_obj;
1191bd4fe43Sopenharmony_ciextern ISP_SNS_OBJ_S stSnsK17Obj;
1201bd4fe43Sopenharmony_ci
1211bd4fe43Sopenharmony_ci#define CMOS_SLAVE_CHECK_DEV(dev) \
1221bd4fe43Sopenharmony_ci    do { \
1231bd4fe43Sopenharmony_ci        if (((dev) < 0) || ((dev) >= CAP_SLAVE_MAX_NUM)) {     \
1241bd4fe43Sopenharmony_ci            HI_ERR_TRACE(HI_ID_ISP, "Err slave dev %d!\n", dev); \
1251bd4fe43Sopenharmony_ci            return HI_ERR_ISP_ILLEGAL_PARAM; \
1261bd4fe43Sopenharmony_ci        } \
1271bd4fe43Sopenharmony_ci    } while (0)
1281bd4fe43Sopenharmony_ci
1291bd4fe43Sopenharmony_ci#define CMOS_CHECK_POINTER(ptr) \
1301bd4fe43Sopenharmony_ci    do { \
1311bd4fe43Sopenharmony_ci        if ((ptr) == HI_NULL) { \
1321bd4fe43Sopenharmony_ci            HI_ERR_TRACE(HI_ID_ISP, "Null Pointer!\n");  \
1331bd4fe43Sopenharmony_ci            return HI_ERR_ISP_NULL_PTR; \
1341bd4fe43Sopenharmony_ci        } \
1351bd4fe43Sopenharmony_ci    } while (0)
1361bd4fe43Sopenharmony_ci
1371bd4fe43Sopenharmony_ci#define CMOS_CHECK_POINTER_VOID(ptr) \
1381bd4fe43Sopenharmony_ci    do { \
1391bd4fe43Sopenharmony_ci        if ((ptr) == HI_NULL) { \
1401bd4fe43Sopenharmony_ci            HI_ERR_TRACE(HI_ID_ISP, "Null Pointer!\n"); \
1411bd4fe43Sopenharmony_ci            return; \
1421bd4fe43Sopenharmony_ci        } \
1431bd4fe43Sopenharmony_ci    } while (0)
1441bd4fe43Sopenharmony_ci
1451bd4fe43Sopenharmony_ci#define SENSOR_FREE(ptr) \
1461bd4fe43Sopenharmony_ci    do { \
1471bd4fe43Sopenharmony_ci        if ((ptr) != HI_NULL) { \
1481bd4fe43Sopenharmony_ci            free(ptr); \
1491bd4fe43Sopenharmony_ci            (ptr) = HI_NULL; \
1501bd4fe43Sopenharmony_ci        } \
1511bd4fe43Sopenharmony_ci    } while (0)
1521bd4fe43Sopenharmony_ci
1531bd4fe43Sopenharmony_ci#define SNS_ERR_TRACE(fmt, ...)                                                                            \
1541bd4fe43Sopenharmony_ci    do {                                                                                                    \
1551bd4fe43Sopenharmony_ci        HI_ERR_TRACE(HI_ID_ISP, "[Func]:%s [Line]:%d [Info]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
1561bd4fe43Sopenharmony_ci    } while (0)
1571bd4fe43Sopenharmony_ci
1581bd4fe43Sopenharmony_ci#define SNS_DIV_0_TO_1(a)   (((a) == 0) ? 1 : (a))
1591bd4fe43Sopenharmony_ci#define SNS_DIV_0_TO_1_FLOAT(a) ((((a) < 1E-10) && ((a) > (-1E-10))) ? 1 : (a))
1601bd4fe43Sopenharmony_ci#ifdef __cplusplus
1611bd4fe43Sopenharmony_ci#if __cplusplus
1621bd4fe43Sopenharmony_ci}
1631bd4fe43Sopenharmony_ci#endif
1641bd4fe43Sopenharmony_ci#endif /* End of #ifdef __cplusplus */
1651bd4fe43Sopenharmony_ci
1661bd4fe43Sopenharmony_ci#endif /* __HI_SNS_CTRL_H__ */
167