/* ****************************************************************************** * * common_vi.h * * Hawkview ISP - common_vi.h module * * Copyright (c) 2016 by Allwinnertech Co., Ltd. http://www.allwinnertech.com * * Version Author Date Description * * 3.0 Yang Feng 2016/04/01 VIDEO INPUT * ***************************************************************************** */ #ifndef _AW_COMMON_VI_H_ #define _AW_COMMON_VI_H_ #include "mm_common.h" #include #include "plat_errno.h" #include "sunxi_camera_v2.h" #include #ifdef __cplusplus #if __cplusplus extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ #define MAX_VIPP_DEV_NUM 16 #define MAX_VIDEO_NUM MAX_VIPP_DEV_NUM #define MAX_VIR_CHN_NUM 4 #define MAX_ISP_DEV_NUM 4 /** This macro specifies a valid VIPP device ID, for online only. */ #define HVIDEO(group, index) (group*4 + index) #define VI_ERR_PRIV_TIMEOUT (EN_ERR_BUTT + 1) #define VI_ERR_PRIV_NOTENABLE (EN_ERR_BUTT + 2) #define VI_ERR_PRIV_NOTDISABLE (EN_ERR_BUTT + 3) #define VI_ERR_PRIV_NORM_UNMATCH (EN_ERR_BUTT + 4) #define VI_ERR_PRIV_INVALID_PHYCHNID (EN_ERR_BUTT + 5) #define VI_ERR_PRIV_FAILED_NOTBIND (EN_ERR_BUTT + 6) #define VI_ERR_PRIV_FAILED_BINDED (EN_ERR_BUTT + 7) #define VI_ERR_PRIV_UNEXIST (EN_ERR_BUTT + 8) #define VI_ERR_PRIV_EXIST (EN_ERR_BUTT + 9) #define ERR_VI_INVALID_CHNID DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID) #define ERR_VI_INVALID_PARA DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM) #define ERR_VI_INVALID_NULL_PTR DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR) #define ERR_VI_FAILED_NOTCONFIG DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG) #define ERR_VI_NOT_SUPPORT DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT) #define ERR_VI_NOT_PERM DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM) #define ERR_VI_INVALID_DEVID DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_DEVID) #define ERR_VI_NOMEM DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM) #define ERR_VI_BUF_EMPTY DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY) #define ERR_VI_BUF_FULL DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL) #define ERR_VI_SYS_NOTREADY DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY) #define ERR_VI_BUSY DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY) #define ERR_VI_FAILED_NOTENABLE DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_NOTENABLE) #define ERR_VI_FAILED_NOTDISABLE DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_NOTDISABLE) #define ERR_VI_CFG_TIMEOUT DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_TIMEOUT) #define ERR_VI_NORM_UNMATCH DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_NORM_UNMATCH) #define ERR_VI_INVALID_PHYCHNID DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_INVALID_PHYCHNID) #define ERR_VI_FAILED_NOTBIND DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_FAILED_NOTBIND) #define ERR_VI_FAILED_BINDED DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_FAILED_BINDED) #define ERR_VI_UNEXIST DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_UNEXIST) #define ERR_VI_EXIST DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, VI_ERR_PRIV_EXIST) #define ERR_VI_SAMESTATE DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_SAMESTATE) #define ERR_VI_INVALIDSTATE DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INVALIDSTATE) #define ERR_VI_INCORRECT_STATE_TRANSITION DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INCORRECT_STATE_TRANSITION) #define ERR_VI_INCORRECT_STATE_OPERATION DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_INCORRECT_STATE_OPERATION) #define ERR_VI_EIS_EFUSE_ERR DEF_ERR(MOD_ID_VIU, EN_ERR_LEVEL_ERROR, EN_ERR_EFUSE_ERROR) //typedef unsigned char AW_U8; //typedef unsigned short AW_U16; //typedef unsigned int AW_U32; // //typedef signed char AW_S8; //typedef short AW_S16; //typedef int AW_S32; // typedef AW_S32 AW_DEV; // typedef AW_S32 AW_CHN; //typedef unsigned long long AW_U64; //typedef long long AW_S64; //typedef void AW_VOID; /* typedef enum { AW_FALSE = 0, AW_TRUE = 1, } AW_BOOL; */ /* * intf format */ typedef enum awVI_INTF_E { VI_IF_INTLV = 0x00, /* 1SEG DATA in one channel */ VI_IF_SPL = 0x01, /* 2SEG 1SEG Y in one channel , 1SEG UV in second channel */ VI_IF_PL = 0x02, /* 3SEG YUV444 */ VI_IF_PL_SPL = 0x03, /* 3SEG YUV444 to 2SEG YUV422 */ VI_IF_CCIR656_1CH = 0x04, /* 1SEG ccir656 1ch */ VI_IF_CCIR656_1CH_SPL = 0x05, /* 2SEG ccir656 1ch */ VI_IF_CCIR656_1CH_PL = 0x06, /* 3SEG ccir656 1ch */ VI_IF_CCIR656_1CH_PL_SPL = 0x07, /* 3SEG to 2SEG ccir656 1ch */ VI_IF_CCIR656_16BIT = 0x08, /* 16BIT ccir656 1ch */ VI_IF_CCIR656_2CH = 0x0c, /* D7~D0:ccir656 2ch */ VI_IF_CCIR656_4CH = 0x0d, /* D7~D0:ccir656 4ch */ VI_IF_MIPI = 0x80, /* MIPI VI */ } VI_INTF_E; /* * data width */ typedef enum awVI_DATA_WIDTH_E { VI_8BIT = 0, VI_10BIT = 1, VI_12BIT = 2, VI_16BIT = 3, } VI_DATA_WIDTH_E; /* * input data format */ typedef enum awVI_INPUT_FMT_E { VI_RAW = 0, /* raw stream */ VI_BAYER = 1, /* byer rgb242 */ VI_CCIR656 = 2, /* ccir656 */ VI_YUV422 = 3, /* yuv422 */ VI_YUV420 = 4, /* yuv420 */ VI_YUV422_16 = 4, /* yuv422 16 bit */ VI_YUV444 = 4, /* yuv444 24 bit */ VI_CCIR656_2CH = 5, /* ccir656 2 channel */ VI_CCIR656_4CH = 7, /* ccir656 4 channel */ } VI_INPUT_FMT_E; /* * output data format */ typedef enum awVI_OUTPUT_FMT_E { /* only when input is raw */ VI_FIELD_RAW_8 = 0, VI_FIELD_RAW_10 = 1, VI_FIELD_RAW_12 = 2, VI_FIELD_RGB565 = 4, VI_FIELD_RGB888 = 5, VI_FIELD_PRGB888 = 6, VI_FRAME_RAW_8 = 8, VI_FRAME_RAW_10 = 9, VI_FRAME_RAW_12 = 10, VI_FRAME_RGB565 = 12, VI_FRAME_RGB888 = 13, VI_FRAME_PRGB888 = 14, /* only when input is bayer */ VI_PLANAR_RGB242 = 0, /* planar rgb242 */ /* only when input is ccir656 */ VI_FIELD_PLANAR_YUV422 = 0, /* parse a field(odd or even) into planar yuv420 */ VI_FIELD_PLANAR_YUV420 = 1, /* parse a field(odd or even) into planar yuv420 */ VI_FRAME_PLANAR_YUV420 = 2, VI_FRAME_PLANAR_YUV422 = 3, VI_FIELD_UV_CB_YUV422 = 4, /* parse and reconstruct evry 2 fields(odd and even) into a frame, format is planar yuv420 */ VI_FIELD_UV_CB_YUV420 = 5, VI_FRAME_UV_CB_YUV420 = 6, VI_FRAME_UV_CB_YUV422 = 7, VI_FIELD_MB_YUV422 = 8, VI_FIELD_MB_YUV420 = 9, VI_FRAME_MB_YUV422 = 10, VI_FRAME_MB_YUV420 = 11, VI_FIELD_UV_CB_YUV422_10 = 12, VI_FIELD_UV_CB_YUV420_10 = 13, VI_INTLC_INTLV_YUV422 = 15, /* only when input is yuv422 */ VI_PLANAR_YUV422 = 0, /* parse yuv422 into planar yuv422 */ VI_PLANAR_YUV420 = 1, /* parse yuv422 into planar yuv420 */ VI_UV_CB_YUV422 = 4, VI_UV_CB_YUV420 = 5, VI_MB_YUV422 = 8, VI_MB_YUV420 = 9, /* only when input is yuv444 */ VI_FIELD_PLANAR_YUV444 = 0, /* parse a field(odd or even) into planar yuv444 */ VI_FIELD_UV_CB_YUV444_YUV422 = 1, /* parse a field(odd or even) into planar yuv422 */ VI_FRAME_PLANAR_YUV444 = 2, VI_FRAME_UV_CB_YUV444_YUV422 = 3, } VI_OUTPUT_FMT_E; /* * field sequenc or polarity */ typedef enum awVI_FIELD_E { /* For Embedded Sync timing*/ VI_FIELD_TF = 0, /* top filed first */ VI_FIELD_BF = 1, /* bottom field first */ /* For External Sync timing */ VI_FIELD_NEG = 0, /* field negtive indicates odd field */ VI_FIELD_POS = 1, /* field postive indicates odd field */ } VI_FIELD_E; /* * input field selection, only when input is ccir656 */ typedef enum awVI_FIELD_SEL_E { VI_ODD, /* odd field */ VI_EVEN, /* even field */ VI_EITHER, /* either field */ } VI_FIELD_SEL_E; /* * input source type */ typedef enum awVI_SRC_TYPE_E { VI_PROGRESSIVE = 0, /* progressive */ VI_INTERLACE = 1, /* interlace */ } VI_SRC_TYPE_E; /* * input data sequence */ typedef enum awVI_INPUT_SEQ_E { /* only when input is yuv422 */ VI_YUYV = 0, VI_YVYU, VI_UYVY, VI_VYUY, /* only when input is byer */ VI_RGRG = 0, /* first line sequence is RGRG... */ VI_GRGR, /* first line sequence is GRGR... */ VI_BGBG, /* first line sequence is BGBG... */ VI_GBGB, /* first line sequence is GBGB... */ } VI_INPUT_SEQ_E; /* * input reference signal polarity */ typedef enum awVI_REF_POL_E { VI_LOW, /* active low */ VI_HIGH, /* active high */ } VI_REF_POL_E; /* * input data valid of the input clock edge type */ typedef enum awVI_EDGE_POL_E { VI_FALLING, /* active falling */ VI_RISING, /* active rising */ } VI_EDGE_POL_E; /* * vi interface configuration */ typedef struct awVI_INTF_CFG_S { VI_SRC_TYPE_E src_type; /* interlaced or progressive */ VI_DATA_WIDTH_E data_width; /* vi data width */ VI_INTF_E interface; /* vi interface */ } VI_INTF_CFG_S; /* * vi timing configuration */ typedef struct awVI_TIMING_CFG_S { VI_FIELD_E field; /* top or bottom field first / field polarity */ VI_REF_POL_E vref; /* input vref signal polarity */ VI_REF_POL_E href; /* input href signal polarity */ VI_EDGE_POL_E sample; /* input data valid of the input clock edge type */ } VI_TIMING_CFG_S; typedef struct awVI_CROP_RECT_S { AW_U32 u32LengthH; AW_U32 u32LengthV; AW_U32 u32LengthY; AW_U32 u32LengthC; AW_U32 u32StartH; AW_U32 u32StartV; } VI_CROP_RECT_S; /* * vi mode configuration */ typedef struct awVI_FMT_CFG_S { VI_INPUT_FMT_E input_fmt; /* input data format */ VI_OUTPUT_FMT_E output_fmt; /* output data format */ VI_FIELD_SEL_E field_sel; /* input field selection */ VI_INPUT_SEQ_E input_seq; /* input data sequence */ VI_DATA_WIDTH_E data_width; /* vi data width */ VI_CROP_RECT_S stCropRect; /* vi Crop config */ } VI_FMT_CFG_S; typedef struct awVI_DEV_ATTR_S { VI_INTF_CFG_S stIntfCfg; VI_FMT_CFG_S stFmtCfg; VI_TIMING_CFG_S stTimingCfg; } VI_DEV_ATTR_S; /* * vi buffer */ typedef enum awVI_BUF_SEL_E { VI_BUF_0_A = 0, /* FIFO for Y address A */ VI_BUF_0_B, /* FIFO for Y address B */ VI_BUF_1_A, /* FIFO for Cb address A */ VI_BUF_1_B, /* FIFO for Cb address B */ VI_BUF_2_A, /* FIFO for Cr address A */ VI_BUF_2_B, /* FIFO for Cr address B */ } VI_BUF_SEL_E; /* * vi buffer configs */ typedef struct awVI_BUFFER_CFG_S { VI_BUF_SEL_E enBufSel; AW_U64 u64Addr; } VI_BUFFER_CFG_S; /* * vi capture status */ typedef struct awVI_CAPTURE_STATUS_S { AW_BOOL picture_in_progress; AW_BOOL video_in_progress; } VI_CAPTURE_STATUS_S; typedef enum awVI_CAP_MODE_E { VI_SCAP = 1, VI_VCAP, } VI_CAP_MODE_E; /* * vi interrupt */ typedef enum awVI_INT_SEL_E { VI_INT_CAPTURE_DONE = 0X1, VI_INT_FRAME_DONE = 0X2, VI_INT_BUF_0_OVERFLOW = 0X4, VI_INT_BUF_1_OVERFLOW = 0X8, VI_INT_BUF_2_OVERFLOW = 0X10, VI_INT_PROTECTION_ERROR = 0X20, VI_INT_HBLANK_OVERFLOW = 0X40, VI_INT_VSYNC_TRIG = 0X80, VI_INT_ALL = 0XFF, } VI_INT_SEL_E; typedef struct awANTISHAKE_KMAT_S { float KmatK1; float KmatK2; float KmatKx; float KmatKy; } ANTISHAKE_KMAT_S; typedef struct awANTISHAKE_ATTR_S { int frame_width; int frame_height; int frame_width_strie; int frame_height_strie; int number_of_input_buffers; int number_of_output_buffers; int operation_mode; int rq; int style; /* * we got default k-mat values for imx317 in SDK. * but if you have other sensors, you should set * ,and fill . * the important thing is: you must be responsible for your own values. */ bool use_custom_kmat; ANTISHAKE_KMAT_S antishake_kmat; } ANTISHAKE_ATTR_S; /* * shut time mode enum */ typedef enum awVI_SHUTTIME_MODE_E { VI_SHUTTIME_MODE_AUTO = 0, /* fix fps to last current normal value */ VI_SHUTTIME_MODE_PREVIEW, /* same fps than AUTO, but has smaller exposure time */ VI_SHUTTIME_MODE_NIGHT_VIEW, /* more than 1S time interval */ } VI_SHUTTIME_MODE_E; /* *@VI_SHUTTIME_RESET_MANUAL: user should reset the exposure time into normal. do not use it now. *@VI_SHUTTIME_RESET_AUTO_NOW: user don't care reset action, someone else will do it. * reset action will be executed immediately after long exposure was set. sensor like imx317 *@VI_SHUTTIME_RESET_AUTO_DELAY: same as the previous one, but reset action will be * executed after get the long exposure video frame. adapt sensor like imx278 */ typedef enum awVI_SHUTTIME_RESET_E { VI_SHUTTIME_RESET_AUTO_DELAY = 0, // VI_SHUTTIME_RESET_MANUAL, VI_SHUTTIME_RESET_AUTO_NOW, } VI_SHUTTIME_RESET_E; /* * vi shutter time configuration *@iTime: frame interval:[1/500S]->[iTime=500] [1/125S]->[iTime=125] * [1S]->[iTime=-1] [5S]->[iTime=-5] *@iExpValue: not use until now *@iGainValue: not use until now *@bResetAuto: if this value is set, user needn't care auto resume the shutter time. *@iShutterMode: * [VI_SHUTTIME_MODE_AUTO]: auto shutter(30fps,auto exp_abs) * [VI_SHUTTIME_MODE_PREVIEW]: preview mode(fps>=30) * [VI_SHUTTIME_MODE_NIGHT_VIEW]: night view mode(fps<30) */ typedef struct awVI_SHUTTIME_CFG_S { int iTime; int iExpValue; int iGainValue; VI_SHUTTIME_RESET_E eResetMode; VI_SHUTTIME_MODE_E eShutterMode; } VI_SHUTTIME_CFG_S; typedef struct VI_CROP_CFG_S { BOOL bEnable; /* Crop region enable */ RECT_S Rect; /* Crop region. */ } VI_CROP_CFG_S; typedef struct awVI_ATTR_S { enum v4l2_buf_type type; enum v4l2_memory memtype; struct v4l2_pix_format_mplane format; unsigned int nbufs; unsigned int nplanes; unsigned int fps; unsigned int capturemode; //V4L2_MODE_VIDEO unsigned int use_current_win; //0:config ISP param again; 1:use current ISP param, maybe deprecated. unsigned int wdr_mode; unsigned int drop_frame_num; // drop frames number after enable vipp device(default 0). unsigned char mOnlineEnable; /* 1: online, 0: offline.*/ enum dma_buffer_num mOnlineShareBufNum; /* only for online. Number of share buffers of CSI and VE, support 1/2.*/ enum mipi_pix_num pixel_num; /* mipi pix num(default 0).*/ unsigned char tdm_speed_down_en; /* 1:tdm speed down, 0:tdm normal speed(default 0).*/ VI_CROP_CFG_S mCropCfg; /* config vipp crop params.*/ BOOL mbEncppEnable; /*enable Encpp sharp, FALSE:disable, TRUE:enable, default value:FALSE. if mpp venc enable Encpp sharp, set TRUE.*/ BOOL mbWidthStrideDisable; /* disable width stride(default 0, means enable).*/ unsigned int tdm_rxbuf_cnt; unsigned char large_dma_merge_en; BOOL mbDataFromYuvSensorEnable; /* specify whether the current vi device data is sourced from the yuv sensor, FALSE:disable, TRUE:enable, default: FALSE */ } VI_ATTR_S; typedef struct { BOOL mbRecvInIdleState; //receive input frames in idle, executing, pause state. int mCacheFrameNum; //max frame number cached in virChn. 0: cache all, >0:cache number. int mCachePolicy; //0:keep the old frames and discard current frame(default), 1:keep the latest frames and discard the old frames. } ViVirChnAttrS; struct rect { AW_U32 left; AW_U32 top; AW_U32 width; AW_U32 height; }; #if 0 typedef struct awVI_OsdMaskRegion { int clipcount; /* number of clips */ int chromakey; //V4L2_PIX_FMT_RGB32 in mode overlay; color value in mode cover. int global_alpha; void *bitmap[64]; //!=NULL:overlay; NULL:cover struct rect region[64]; /* overlay or cover win */ } VI_OsdMaskRegion; #endif typedef struct awVI_Params { VI_DEV mDev; VI_CHN mChn; VI_ATTR_S *pstAttr; VIDEO_FRAME_INFO_S *pstFrameInfo; AW_S32 s32MilliSec; //AW_U32 mOnOff; //VI_OsdMaskRegion *pstOsdMaskRegion; } VI_Params; #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /*_AW_COMMON_VI_H_*/