diff --git a/Rules.make b/Rules.make index e49dd1d..608d04e 100644 --- a/Rules.make +++ b/Rules.make @@ -10,7 +10,8 @@ #SENSOR_TYPE=OMNIVISION_OV4689_MIPI_4M_30FPS #SENSOR_TYPE=SMARTSENS_SC2135_DC_1080P_30FPS #SENSOR_TYPE=SONY_IMX226_LVDS_12M_30FPS -SENSOR_TYPE=SONY_IMX274_MIPI_8M_30FPS +#SENSOR_TYPE=SONY_IMX274_MIPI_8M_30FPS +SENSOR_TYPE=SONY_IMX327_MIPI_1080P_30FPS export SENSOR_TYPE HIARCH=hi3516av200 @@ -42,6 +43,11 @@ else ifeq ($(SENSOR_TYPE), SONY_IMX226_LVDS_12M_30FPS) else ifeq ($(SENSOR_TYPE), SONY_IMX274_MIPI_8M_30FPS) SENSOR_PATH := $(PLATFORM)/sensor/sony_imx274_mipi SENSOR_LIB=$(PLATFORM)/sensor/sony_imx274_mipi/libsns_imx274.a + CFLAGS += -DSNS_IMX274_MIPI_SINGLE +else ifeq ($(SENSOR_TYPE), SONY_IMX327_MIPI_1080P_30FPS) + SENSOR_PATH := $(PLATFORM)/sensor/sony_imx327_mipi + SENSOR_LIB=$(PLATFORM)/sensor/sony_imx327_mipi/libsns_imx327.a + CFLAGS += -DSNS_IMX327_MIPI_SINGLE endif export SENSOR_PATH diff --git a/app/rtsp_server/rtsp_server.c b/app/rtsp_server/rtsp_server.c index ca79dd0..dc9bb08 100644 --- a/app/rtsp_server/rtsp_server.c +++ b/app/rtsp_server/rtsp_server.c @@ -44,7 +44,7 @@ void init_signals(void) signal(SIGPIPE, SIG_IGN); } -int get_audio_frame_cb(char *frame, unsigned long len, double timestamp) +int get_audio_frame_cb(unsigned char *frame, unsigned long len, double timestamp) { if (gHndMainFramePool) { @@ -59,7 +59,7 @@ int get_audio_frame_cb(char *frame, unsigned long len, double timestamp) return 0; } -int get_video_frame_cb(int stream, char *frame, unsigned long len, int key, double pts, SAL_ENCODE_TYPE_E encode_type) +int get_video_frame_cb(int stream, unsigned char *frame, unsigned long len, int key, double pts, SAL_ENCODE_TYPE_E encode_type) { FRAME_TYPE_E type = FRAME_TYPE_INVALID; if (encode_type == SAL_ENCODE_TYPE_H264) @@ -83,7 +83,7 @@ int get_video_frame_cb(int stream, char *frame, unsigned long len, int key, doub return 0; } -int get_jpeg_frame_cb(char *frame, int len) +int get_jpeg_frame_cb(unsigned char *frame, int len) { return 0; } @@ -119,9 +119,9 @@ int main(int argc, char** argv) memset(&video, 0, sizeof(video)); video.cb = get_video_frame_cb; video.stream[0].enable = 1; - video.stream[0].width = 3840; - video.stream[0].height = 2160; - video.stream[0].framerate = 15; + video.stream[0].width = 1920; //3840; + video.stream[0].height = 1080; //2160; + video.stream[0].framerate = 30; video.stream[0].bitrate = 2500; video.stream[0].gop = 2 * video.stream[0].framerate; video.stream[0].bitrate_ctl = SAL_BITRATE_CONTROL_CBR; @@ -129,12 +129,12 @@ int main(int argc, char** argv) video.stream[1].enable = 1; video.stream[1].width = 640; - video.stream[1].height = 360; - video.stream[1].framerate = 15; + video.stream[1].height = 480; + video.stream[1].framerate = 30; video.stream[1].bitrate = 500; video.stream[1].gop = 2 * video.stream[1].framerate; video.stream[1].bitrate_ctl = SAL_BITRATE_CONTROL_CBR; - video.stream[1].encode_type = SAL_ENCODE_TYPE_H265; + video.stream[1].encode_type = SAL_ENCODE_TYPE_H264; ret = sal_sys_init(&video); CHECK(ret == 0, -1, "Error with: %#x\n", ret); DBG("sys video init done.\n"); @@ -154,17 +154,14 @@ int main(int argc, char** argv) CHECK(ret == 0, -1, "Error with: %#x\n", ret); DBG("sys audio init done.\n"); - - //ret = sal_dr_init(); + //extern int sal_pc_init(); + //ret = sal_pc_init(); //CHECK(ret == 0, -1, "Error with: %#x\n", ret); - - /* ret = sal_osd_init(); - CHECK(ret == 0, -1, "Error with: %#x\n", ret);*/ + handle hndRtsps = rtsps_init(554); CHECK(hndRtsps, -1, "Error with: %#x\n", hndRtsps); - while (!test_exit) { usleep(1); diff --git a/hi3516av200.make b/hi3516av200.make index a5a316a..662a5a0 100644 --- a/hi3516av200.make +++ b/hi3516av200.make @@ -10,7 +10,8 @@ #SENSOR_TYPE=OMNIVISION_OV4689_MIPI_4M_30FPS #SENSOR_TYPE=SMARTSENS_SC2135_DC_1080P_30FPS #SENSOR_TYPE=SONY_IMX226_LVDS_12M_30FPS -SENSOR_TYPE=SONY_IMX274_MIPI_8M_30FPS +#SENSOR_TYPE=SONY_IMX274_MIPI_8M_30FPS +SENSOR_TYPE=SONY_IMX327_MIPI_1080P_30FPS export SENSOR_TYPE HIARCH=hi3516av200 @@ -42,6 +43,11 @@ else ifeq ($(SENSOR_TYPE), SONY_IMX226_LVDS_12M_30FPS) else ifeq ($(SENSOR_TYPE), SONY_IMX274_MIPI_8M_30FPS) SENSOR_PATH := $(PLATFORM)/sensor/sony_imx274_mipi SENSOR_LIB=$(PLATFORM)/sensor/sony_imx274_mipi/libsns_imx274.a + CFLAGS += -DSNS_IMX274_MIPI_SINGLE +else ifeq ($(SENSOR_TYPE), SONY_IMX327_MIPI_1080P_30FPS) + SENSOR_PATH := $(PLATFORM)/sensor/sony_imx327_mipi + SENSOR_LIB=$(PLATFORM)/sensor/sony_imx327_mipi/libsns_imx327.a + CFLAGS += -DSNS_IMX327_MIPI_SINGLE endif export SENSOR_PATH @@ -69,7 +75,7 @@ LIBS+=$(PLATFORM)/common_lib/libturbojpeg.a LIBS+=$(PLATFORM)/common_lib/libmp4v2.a export LIBS -CFLAGS += -g -Wall -fPIC +CFLAGS += -g -Wall -fPIC -Os CFLAGS += -mcpu=cortex-a17.cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations CFLAGS += -DSENSOR_TYPE=$(SENSOR_TYPE) CFLAGS += -D$(HIARCH) diff --git a/sal_curl.c b/sal_curl.c index 61e2ddd..937e8c3 100644 --- a/sal_curl.c +++ b/sal_curl.c @@ -52,8 +52,9 @@ typedef struct curl_wrapper_s } curl_wrapper_s; -static size_t _Onrecv(void* buffer, size_t size, size_t nmemb, curl_wrapper_s* pstCurlWrapper) +static size_t _Onrecv(void* buffer, size_t size, size_t nmemb, const void* _pstCurlWrapper) { + curl_wrapper_s* pstCurlWrapper = (curl_wrapper_s*)_pstCurlWrapper; DBG("buffer=%p, size=%u, nmemb=%u, pstCurlWrapper=%p\n", buffer, size, nmemb, pstCurlWrapper); int s32Ret; @@ -75,8 +76,9 @@ static size_t _Onrecv(void* buffer, size_t size, size_t nmemb, curl_wrapper_s* p return -1; } -static size_t _OnRecv2mem(void* buffer, size_t size, size_t nmemb, curl_wrapper_s* pstCurlWrapper) +static size_t _OnRecv2mem(void* buffer, size_t size, size_t nmemb, const void* _pstCurlWrapper) { + curl_wrapper_s* pstCurlWrapper = (curl_wrapper_s*)_pstCurlWrapper; //DBG("buffer=%p, size=%u, nmemb=%u, pstCurlWrapper=%p\n", buffer, size, nmemb, pstCurlWrapper); //int s32Ret = -1; @@ -136,8 +138,9 @@ static size_t _OnRecv2mem(void* buffer, size_t size, size_t nmemb, curl_wrapper_ return -1; } -static size_t _Onsend(void *buffer, size_t size, size_t nmemb, curl_wrapper_s* pstCurlWrapper) +static size_t _Onsend(void *buffer, size_t size, size_t nmemb, const void* _pstCurlWrapper) { + curl_wrapper_s* pstCurlWrapper = (curl_wrapper_s*)_pstCurlWrapper; //DBG("buffer=%p, size=%u, nmemb=%u, pstCurlWrapper=%p\n", buffer, size, nmemb, pstCurlWrapper); int s32Ret; @@ -158,8 +161,9 @@ static size_t _Onsend(void *buffer, size_t size, size_t nmemb, curl_wrapper_s* p return -1; } -static size_t _OnDlProgress(curl_wrapper_s* pstCurlWrapper, double dltotal, double dlnow, double ultotal, double ulnow) +static int _OnDlProgress(const void* _pstCurlWrapper, double dltotal, double dlnow, double ultotal, double ulnow) { + curl_wrapper_s* pstCurlWrapper = (curl_wrapper_s*)_pstCurlWrapper; //DBG("pstCurlWrapper=%p, dltotal=%d, dlnow=%d, ultotal=%d, ulnow=%d\n", pstCurlWrapper, (int)dltotal, (int)dlnow, (int)ultotal, (int)ulnow); if(pstCurlWrapper->bRunning == 0 && dlnow != dltotal) @@ -200,8 +204,9 @@ static size_t _OnDlProgress(curl_wrapper_s* pstCurlWrapper, double dltotal, doub return tRet; } -static size_t _OnUlProgress(curl_wrapper_s* pstCurlWrapper, double dltotal, double dlnow, double ultotal, double ulnow) +static int _OnUlProgress(const void* _pstCurlWrapper, double dltotal, double dlnow, double ultotal, double ulnow) { + curl_wrapper_s* pstCurlWrapper = (curl_wrapper_s*)_pstCurlWrapper; //DBG("pstCurlWrapper=%p, dltotal=%d, dlnow=%d, ultotal=%d, ulnow=%d\n", pstCurlWrapper, (int)dltotal, (int)dlnow, (int)ultotal, (int)ulnow); //todo:why no using this func? @@ -264,8 +269,9 @@ static void* _Proc(void* _pArgs) return NULL; } -static size_t _OnHttpPostHead(void* buffer, size_t size, size_t nmemb, curl_wrapper_s* pstCurlWrapper) +static size_t _OnHttpPostHead(void* buffer, size_t size, size_t nmemb, const void* _pstCurlWrapper) { + curl_wrapper_s* pstCurlWrapper = (curl_wrapper_s*)_pstCurlWrapper; //DBG("pstCurlWrapper=%p, size=%d, nmemb=%d, buffer=\"%s\"\n", pstCurlWrapper, size, nmemb, (char*)buffer); ASSERT(pstCurlWrapper->u32PostRecvCurr < pstCurlWrapper->u32PostRecvTotal, "u32PostRecvTotal %u, u32PostRecvCurr %u\n", pstCurlWrapper->u32PostRecvTotal, pstCurlWrapper->u32PostRecvCurr); @@ -281,10 +287,11 @@ static size_t _OnHttpPostHead(void* buffer, size_t size, size_t nmemb, curl_wrap return s32NeedCopy; } -static size_t _OnHttpPostRecv(void* buffer, size_t size, size_t nmemb, curl_wrapper_s* pstCurlWrapper) +static size_t _OnHttpPostRecv(const void* buffer, size_t size, size_t nmemb, const void* _pstCurlWrapper) { + curl_wrapper_s* pstCurlWrapper = (curl_wrapper_s*)_pstCurlWrapper; // DBG("pstCurlWrapper=%p, size=%d, nmemb=%d\n", pstCurlWrapper, size, nmemb); - + ASSERT(pstCurlWrapper->u32PostRecvCurr < pstCurlWrapper->u32PostRecvTotal, "u32PostRecvTotal %u, u32PostRecvCurr %u\n", pstCurlWrapper->u32PostRecvTotal, pstCurlWrapper->u32PostRecvCurr); size_t s32NeedCopy = size * nmemb; @@ -298,12 +305,13 @@ static size_t _OnHttpPostRecv(void* buffer, size_t size, size_t nmemb, curl_wrap return s32NeedCopy; } -static size_t _OnHttpPostProgress(curl_wrapper_s* pstCurlWrapper, double dltotal, double dlnow, double ultotal, double ulnow) +static int _OnHttpPostProgress(const void* _pstCurlWrapper, double dltotal, double dlnow, double ultotal, double ulnow) { + curl_wrapper_s* pstCurlWrapper = (curl_wrapper_s*)_pstCurlWrapper; // DBG("pstCurlWrapper=%p, dltotal=%f, dlnow=%f, ultotal=%f, ulnow=%f\n", pstCurlWrapper, dltotal, dlnow, ultotal, ulnow); // DBG("bRunning=%d\n", pstCurlWrapper->bRunning); - + //todo:why no using this func? if(pstCurlWrapper->bRunning == 0) { @@ -484,7 +492,7 @@ int curl_wrapper_StartHttpPost(handle _hndCurlWrapper, char* _szUrl, unsigned ch curl_easy_setopt(pstCurlWrapper->pstCurl, CURLOPT_POST, 1L); // curl_easy_setopt(pstCurlWrapper->pstCurl, CURLOPT_TIMEOUT, 5); // curl_easy_setopt(pstCurlWrapper->pstCurl, CURLOPT_CONNECTTIMEOUT, 120); - curl_easy_setopt(pstCurlWrapper->pstCurl, CURLOPT_POSTFIELDS, pstCurlWrapper->pu8PostSend); + curl_easy_setopt(pstCurlWrapper->pstCurl, CURLOPT_POSTFIELDS, (void*)pstCurlWrapper->pu8PostSend); curl_easy_setopt(pstCurlWrapper->pstCurl, CURLOPT_POSTFIELDSIZE, pstCurlWrapper->u32PostSendCurr); curl_easy_setopt(pstCurlWrapper->pstCurl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)pstCurlWrapper->u32PostSendCurr); diff --git a/sal_frame_pool.c b/sal_frame_pool.c index e25db29..03df154 100644 --- a/sal_frame_pool.c +++ b/sal_frame_pool.c @@ -77,7 +77,7 @@ int frame_pool_destroy(handle hndFramePool) return 0; } -int frame_pool_add(handle hndFramePool, char *frame, unsigned long len, FRAME_TYPE_E type, int key, double pts) +int frame_pool_add(handle hndFramePool, unsigned char *frame, unsigned long len, FRAME_TYPE_E type, int key, double pts) { CHECK(NULL != hndFramePool, -1, "invalid parameter with: %#x\n", hndFramePool); @@ -87,7 +87,7 @@ int frame_pool_add(handle hndFramePool, char *frame, unsigned long len, FRAME_TY ret = pthread_mutex_lock(&pstFramePool->mutex); CHECK(ret == 0 , -1, "error with %s\n", strerror(errno)); - if (list_size(pstFramePool->hndlist) >= pstFramePool->capacity) + while (list_size(pstFramePool->hndlist) >= pstFramePool->capacity) { frame_info_s* frame_info = list_front(pstFramePool->hndlist); if (frame_info->reference <= 0) // @@ -96,6 +96,10 @@ int frame_pool_add(handle hndFramePool, char *frame, unsigned long len, FRAME_TY ret = list_pop_front(pstFramePool->hndlist); CHECK(ret == 0, -1, "error with %#x\n", ret); } + else + { + break; + } } frame_info_s frame_info_new; @@ -321,8 +325,7 @@ int frame_pool_unregister(handle hndReader) } /* -*可能存在frame_pool_register成功后过了很久才frame_pool_get,导致pstLastFrame已经被删除了 -*的风险,list_next会返回NULL,所以frame_pool_get一直会返回NULL +*可能存在frame_pool_register成功后过了很久才frame_pool_get,导致pstLastFrame已经被删除了的风险,list_next会返回NULL *frame_pool_get取的速度比add的速度快是会返回NULL的 */ frame_info_s* frame_pool_get(handle hndReader) diff --git a/sal_frame_pool.h b/sal_frame_pool.h index 30a26b1..288d711 100644 --- a/sal_frame_pool.h +++ b/sal_frame_pool.h @@ -63,7 +63,7 @@ int frame_pool_destroy(handle hndFramePool); 输出参数: 无 返 回 值: 成功返回0,失败返回小于0 */ -int frame_pool_add(handle hndFramePool, char *frame, unsigned long len, FRAME_TYPE_E type, int key, double pts); +int frame_pool_add(handle hndFramePool, unsigned char *frame, unsigned long len, FRAME_TYPE_E type, int key, double pts); /* 函 数 名: frame_pool_register diff --git a/sal_rtsp_process.c b/sal_rtsp_process.c index 055a34c..bb09897 100644 --- a/sal_rtsp_process.c +++ b/sal_rtsp_process.c @@ -94,6 +94,10 @@ typedef struct RTSP_SERVER_S int client_Aport[2]; //send rtp rtcp int server_Afd[2]; int server_Aport[2]; //recv rtp rtcp + + //调用select的最后时间,用以控制调用间隔 + struct timeval last_rw_tcp; + struct timeval last_rw_udp; } RTSP_SERVER_S; @@ -1686,20 +1690,13 @@ void* rtsp_process(void* _pstSession) stRtspServer.bASupport = 0; CHECK(stRtspServer.bVSupport || stRtspServer.bASupport, NULL, "Error with: %#x %#x\n", stRtspServer.bVSupport, stRtspServer.bASupport); + int rw_time_interval = 0; char* data = NULL; int len = 0; while (pclient->running) { - if (stRtspServer.enStatus == RTSP_SERVER_STATUS_RTSP || stRtspServer.enStatus == RTSP_SERVER_STATUS_TEARDOWN) + if (stRtspServer.enStatus == RTSP_SERVER_STATUS_RTSP) { - u32ExpectTimeout = GENERAL_RWTIMEOUT; - u32Timeout = select_rtimeout(stRtspServer.hndSocket); - GOTO(u32Timeout < u32ExpectTimeout, _EXIT, "Read Timeout %u, expect %u\n", u32Timeout, u32ExpectTimeout); - - u32ExpectTimeout = GENERAL_RWTIMEOUT; - u32Timeout = select_wtimeout(stRtspServer.hndSocket); - GOTO(u32Timeout < u32ExpectTimeout, _EXIT, "Write Timeout %u, expect %u\n", u32Timeout, u32ExpectTimeout); - do { data = NULL; @@ -1725,21 +1722,17 @@ void* rtsp_process(void* _pstSession) ret = select_rw(stRtspServer.hndSocket); GOTO(ret == 0, _EXIT, "Error with: %#x\n", ret); + + u32ExpectTimeout = GENERAL_RWTIMEOUT; + u32Timeout = select_rtimeout(stRtspServer.hndSocket); + GOTO(u32Timeout < u32ExpectTimeout, _EXIT, "Read Timeout %u, expect %u\n", u32Timeout, u32ExpectTimeout); + + u32ExpectTimeout = GENERAL_RWTIMEOUT; + u32Timeout = select_wtimeout(stRtspServer.hndSocket); + GOTO(u32Timeout < u32ExpectTimeout, _EXIT, "Write Timeout %u, expect %u\n", u32Timeout, u32ExpectTimeout); } else if (stRtspServer.enStatus == RTSP_SERVER_STATUS_RTP) { - if (stRtspServer.enTranType == TRANS_TYPE_TCP) - { - u32ExpectTimeout = GENERAL_RWTIMEOUT; - u32Timeout = select_wtimeout(stRtspServer.hndSocket); - GOTO(u32Timeout < u32ExpectTimeout, _EXIT, "Write Timeout %u, expect %u\n", u32Timeout, u32ExpectTimeout); - } - else if (stRtspServer.enTranType == TRANS_TYPE_UDP) - { - ret = _RecvRtcpOverUdp(&stRtspServer); - GOTO(ret == 0, _EXIT, "Error with: %#x\n", ret); - } - do { data = NULL; @@ -1762,7 +1755,7 @@ void* rtsp_process(void* _pstSession) } } while (data != NULL && pclient->running); - + frame_info_s* frame = frame_pool_get(stRtspServer.hndReader); if (frame) { @@ -1787,14 +1780,41 @@ void* rtsp_process(void* _pstSession) } else { - //WRN("Get AVframe failed\n"); - //usleep(20*1000); + //WRN("failed to get AVframe\n"); + usleep(1); } + + rw_time_interval = (stRtspServer.enTranType == TRANS_TYPE_TCP) ? 1 : 100; + u32Timeout = util_time_pass(&stRtspServer.last_rw_tcp); + if (u32Timeout > rw_time_interval) + { + ret = util_time_abs(&stRtspServer.last_rw_tcp); + GOTO(ret == 0, _EXIT, "Error with: %#x\n", ret); - ret = select_rw(stRtspServer.hndSocket); - GOTO(ret == 0, _EXIT, "Error with: %#x\n", ret); + ret = select_rw(stRtspServer.hndSocket); + GOTO(ret == 0, _EXIT, "Error with: %#x\n", ret); + } + + if (stRtspServer.enTranType == TRANS_TYPE_TCP) + { + u32ExpectTimeout = GENERAL_RWTIMEOUT; + u32Timeout = select_wtimeout(stRtspServer.hndSocket); + GOTO(u32Timeout < u32ExpectTimeout, _EXIT, "Write Timeout %u, expect %u\n", u32Timeout, u32ExpectTimeout); + } + else if (stRtspServer.enTranType == TRANS_TYPE_UDP) + { + u32Timeout = util_time_pass(&stRtspServer.last_rw_udp); + if (u32Timeout > 100) + { + ret = util_time_abs(&stRtspServer.last_rw_udp); + GOTO(ret == 0, _EXIT, "Error with: %#x\n", ret); + + ret = _RecvRtcpOverUdp(&stRtspServer); + GOTO(ret == 0, _EXIT, "Error with: %#x\n", ret); + } + } } - else if (RTSP_SERVER_STATUS_ERROR == stRtspServer.enStatus) + else if (RTSP_SERVER_STATUS_ERROR == stRtspServer.enStatus || stRtspServer.enStatus == RTSP_SERVER_STATUS_TEARDOWN) { WRN("EXIT: RTSP ERROR\n"); while (pclient->running && !select_wlist_empty(stRtspServer.hndSocket)) diff --git a/soc/hi3516av200/hi3516av200.vcproj b/soc/hi3516av200/hi3516av200.vcproj index 2bb7b8a..f7c028d 100644 --- a/soc/hi3516av200/hi3516av200.vcproj +++ b/soc/hi3516av200/hi3516av200.vcproj @@ -538,6 +538,10 @@ RelativePath=".\sal_lsadc.h" > + + @@ -550,6 +554,10 @@ RelativePath=".\sal_overlay.h" > + + @@ -594,6 +602,10 @@ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > + + @@ -706,6 +718,10 @@ RelativePath=".\sal_lsadc.c" > + + @@ -718,6 +734,10 @@ RelativePath=".\sal_overlay.c" > + + diff --git a/soc/hi3516av200/hi_comm.h b/soc/hi3516av200/hi_comm.h index a5373a8..c04aefc 100644 --- a/soc/hi3516av200/hi_comm.h +++ b/soc/hi3516av200/hi_comm.h @@ -82,6 +82,7 @@ typedef enum sample_vi_mode_e SONY_IMX290_LVDS_1080P_30FPS, SONY_IMX226_LVDS_12M_30FPS, SONY_IMX274_MIPI_8M_30FPS, + SONY_IMX327_MIPI_1080P_30FPS, PANASONIC_MN34222_MIPI_1080P_30FPS, OMNIVISION_OV9712_DC_720P_30FPS, OMNIVISION_OV9732_DC_720P_30FPS, diff --git a/soc/hi3516av200/mpp_include/hi_sns_ctrl.h b/soc/hi3516av200/mpp_include/hi_sns_ctrl.h index bdc173b..3cc43a8 100644 --- a/soc/hi3516av200/mpp_include/hi_sns_ctrl.h +++ b/soc/hi3516av200/mpp_include/hi_sns_ctrl.h @@ -64,6 +64,7 @@ extern ISP_SNS_OBJ_S stSnsImx326Obj; extern ISP_SNS_OBJ_S stSnsImx326SlaveObj; extern ISP_SNS_OBJ_S stSnsImx226Obj; extern ISP_SNS_OBJ_S stSnsImx274Obj; +extern ISP_SNS_OBJ_S stSnsImx327Obj; extern ISP_SNS_OBJ_S stSnsImx290Obj; extern ISP_SNS_OBJ_S stSnsOv4689SlaveObj; extern ISP_SNS_OBJ_S stSnsOv4689Obj; diff --git a/soc/hi3516av200/sal_audio.c b/soc/hi3516av200/sal_audio.c index 65f19b1..94a106e 100644 --- a/soc/hi3516av200/sal_audio.c +++ b/soc/hi3516av200/sal_audio.c @@ -520,7 +520,7 @@ static AUDIO_SOUND_MODE_E get_sound_mode() return enSoundmode; } -static int aenc_write_cb(char *frame, unsigned long len, double pts) +static int aenc_write_cb(unsigned char *frame, unsigned long len, double pts) { double timestamp = pts/1000; @@ -641,7 +641,7 @@ static HI_VOID * audio_thread(void * pParam) if (stStream.u32Len > header_size) { - s32Ret = aenc_write_cb((HI_CHAR *)stStream.pStream+header_size, stStream.u32Len-header_size, stStream.u64TimeStamp); + s32Ret = aenc_write_cb(stStream.pStream+header_size, stStream.u32Len-header_size, stStream.u64TimeStamp); CHECK(s32Ret == HI_SUCCESS, NULL, "Error with %#x.\n", s32Ret); } diff --git a/soc/hi3516av200/sal_audio.h b/soc/hi3516av200/sal_audio.h index 4e0d076..d12a3e7 100644 --- a/soc/hi3516av200/sal_audio.h +++ b/soc/hi3516av200/sal_audio.h @@ -19,7 +19,7 @@ extern "C"{ pts 时间戳(us) 绝对时间 返 回 值: 成功返回0,失败返回小于0 */ -typedef int (*sal_audio_cb)(char *frame, unsigned long len, double pts); +typedef int (*sal_audio_cb)(unsigned char *frame, unsigned long len, double pts); typedef struct sal_audio_s diff --git a/soc/hi3516av200/sal_av.c b/soc/hi3516av200/sal_av.c index 29db2aa..0ddbeb1 100644 --- a/soc/hi3516av200/sal_av.c +++ b/soc/hi3516av200/sal_av.c @@ -39,7 +39,7 @@ typedef struct sal_av_args int lowdelay_enable; // 低延迟模式 int onebuffer_enable; // 单vb模式,需结合低延迟模式才有效 int onestream_enable;//单包模式/多包模式 - char* multiple_buffer; //多包模式下需要使用buffer来拼合一个帧 + unsigned char* multiple_buffer; //多包模式下需要使用buffer来拼合一个帧 int online_enable; int running; @@ -85,7 +85,17 @@ static VI_DEV_ATTR_S DEV_ATTR_MIPI_BASE = /* bRever */ HI_FALSE, /* DEV CROP */ - {0, 0, 1920, 1080} + {0, 0, 1920, 1080}, + { + { + {1920, 1080}, + HI_FALSE, + }, + { + VI_REPHASE_MODE_NONE, + VI_REPHASE_MODE_NONE + } + } }; static VI_DEV_ATTR_EX_S DEV_ATTR_LVDS_BASE_EX = @@ -496,6 +506,46 @@ combo_dev_attr_t DEV_COMBO_IMX274_MIPI_12BIT_4K_WDR = } }; +combo_dev_attr_t MIPI_4lane_SENSOR_IMX327_1080P_12BIT_NOWDR_ATTR = +{ + .devno = 0, + .input_mode = INPUT_MODE_MIPI, /* input mode */ + .phy_clk_share = PHY_CLK_SHARE_NONE, + .img_rect = {0, 0, 1920, 1080}, + + .mipi_attr = + { + .raw_data_type = RAW_DATA_12BIT, + .wdr_mode = HI_WDR_MODE_NONE, + .lane_id = {0, 1, 2, 3, -1, -1, -1, -1} + } +}; + +combo_dev_attr_t MIPI_4lane_SENSOR_IMX327_1080P_10BIT_2WDR1_ATTR = +{ + .devno = 0, + .input_mode = INPUT_MODE_MIPI, + .phy_clk_share = PHY_CLK_SHARE_NONE, + .img_rect = {0, 0, 1920, 1080}, + + .mipi_attr = + { + .raw_data_type = RAW_DATA_10BIT, + .wdr_mode = HI_MIPI_WDR_MODE_DOL, + .lane_id = {0, 1, 2, 3, -1, -1, -1, -1} + } +}; + +const ISP_SNS_OBJ_S* g_pstSnsObj[2] = +{ +#if defined(SNS_IMX274_MIPI_SINGLE) + &stSnsImx274Obj, NULL +#elif defined(SNS_IMX327_MIPI_SINGLE) + &stSnsImx327Obj, NULL +#else + NULL, NULL +#endif +}; static int sys_vb_size(int width, int height, int align_width) { @@ -679,6 +729,14 @@ static int vi_set_mipi(SAMPLE_VI_CONFIG_S* pstViConfig) memcpy(&stcomboDevAttr, &DEV_COMBO_IMX274_MIPI_12BIT_4K_WDR, sizeof(stcomboDevAttr)); } } + else if (pstViConfig->enViMode == SONY_IMX327_MIPI_1080P_30FPS) + { + memcpy(&stcomboDevAttr, &MIPI_4lane_SENSOR_IMX327_1080P_12BIT_NOWDR_ATTR, sizeof(stcomboDevAttr)); + if (pstViConfig->enWDRMode != WDR_MODE_NONE) + { + memcpy(&stcomboDevAttr, &MIPI_4lane_SENSOR_IMX327_1080P_10BIT_2WDR1_ATTR, sizeof(stcomboDevAttr)); + } + } else { DBG("Unknown sensor type: %d.\n", pstViConfig->enViMode); @@ -778,6 +836,14 @@ static int vi_set_dev(VI_DEV ViDev, SAMPLE_VI_CONFIG_S* pstViConfig) memcpy(&stViDevAttr, &DEV_ATTR_IMX274_MIPI_12BIT_4K_WDR, sizeof(stViDevAttr)); } } + else if (g_av_args->sensor_type == SONY_IMX327_MIPI_1080P_30FPS) + { + memcpy(&stViDevAttr, &DEV_ATTR_MIPI_BASE, sizeof(stViDevAttr)); + if (pstViConfig->enWDRMode != WDR_MODE_NONE) + { + memcpy(&stViDevAttr, &DEV_ATTR_MIPI_BASE, sizeof(stViDevAttr)); + } + } else { DBG("Unknown sensor %d.\n", g_av_args->sensor_type); @@ -948,20 +1014,9 @@ static int isp_init(WDR_MODE_E enWDRMode) stAwbLib.s32Id = 0; strcpy(stAwbLib.acLibName, HI_AWB_LIB_NAME); - ISP_SNS_OBJ_S* pstSnsObj = NULL; - - if (g_av_args->sensor_type == SONY_IMX226_LVDS_12M_30FPS) - { - //extern ISP_SNS_OBJ_S stSnsImx226Obj; - //pstSnsObj = &stSnsImx226Obj; - } - if (g_av_args->sensor_type == SONY_IMX274_MIPI_8M_30FPS) - { - extern ISP_SNS_OBJ_S stSnsImx274Obj; - pstSnsObj = &stSnsImx274Obj; - } - + ISP_SNS_OBJ_S* pstSnsObj = g_pstSnsObj[0]; CHECK(pstSnsObj != NULL, HI_FAILURE, "Error with %#x.\n", pstSnsObj); + s32Ret = pstSnsObj->pfnRegisterCallback(IspDev, &stAeLib, &stAwbLib); CHECK(s32Ret == HI_SUCCESS, HI_FAILURE, "Error with %#x.\n", s32Ret); @@ -1027,6 +1082,10 @@ static int isp_init(WDR_MODE_E enWDRMode) { stPubAttr.enBayer = BAYER_RGGB; } + else if (g_av_args->sensor_type == SONY_IMX327_MIPI_1080P_30FPS) + { + stPubAttr.enBayer = BAYER_RGGB; + } else { DBG("Unknown sensor %d.\n", g_av_args->sensor_type); @@ -1748,7 +1807,7 @@ static int venc_pipe_write(int stream_id, const void* frame, int len) return 0; } -static int venc_write_cb(int stream_id, unsigned long long pts, char *data, int len, int keyFrame, SAL_ENCODE_TYPE_E encode_type) +static int venc_write_cb(int stream_id, unsigned long long pts, unsigned char *data, int len, int keyFrame, SAL_ENCODE_TYPE_E encode_type) { double timestamp = pts/1000; @@ -1806,7 +1865,7 @@ static int venc_one_pack(VENC_CHN i, VENC_STREAM_S* pstStream, VENC_CHN_STAT_S* CHECK(0, HI_FAILURE, "Error with %#x.\n", -1); } - s32Ret = venc_write_cb(i, pstStream->pstPack->u64PTS, (char*)frame_addr, frame_len, isKey, stream->encode_type); + s32Ret = venc_write_cb(i, pstStream->pstPack->u64PTS, frame_addr, frame_len, isKey, stream->encode_type); CHECK(s32Ret == HI_SUCCESS, HI_FAILURE, "Error with %#x.\n", s32Ret); s32Ret = HI_MPI_VENC_ReleaseStream(i, pstStream); @@ -1818,7 +1877,7 @@ static int venc_one_pack(VENC_CHN i, VENC_STREAM_S* pstStream, VENC_CHN_STAT_S* static int venc_multiple_pack(VENC_CHN i, VENC_STREAM_S* pstStream, VENC_CHN_STAT_S* pstStat) { HI_S32 s32Ret = HI_FAILURE; - char* buffer = g_av_args->multiple_buffer; + unsigned char* buffer = g_av_args->multiple_buffer; //DBG("u32CurPacks: %u\n", pstStat->u32CurPacks); pstStream->pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * pstStat->u32CurPacks); @@ -2082,6 +2141,8 @@ int sal_sys_init(sal_video_s* video) //imx274 //himm 0x1201004c 0x00094C43;vi0 clk = 600M //himm 0x12010054 0x00008043;isp clk = vi clk(600M) + //imx327 + //himm 0x12010040: 0x00001818;sensor clk 37.125MHz g_av_args = (sal_av_args*)malloc(sizeof(sal_av_args)); CHECK(g_av_args != NULL, HI_FAILURE, "malloc %d bytes failed.\n", sizeof(sal_av_args)); diff --git a/soc/hi3516av200/sensor/sony_imx327_mipi/Makefile b/soc/hi3516av200/sensor/sony_imx327_mipi/Makefile new file mode 100644 index 0000000..a2951d6 --- /dev/null +++ b/soc/hi3516av200/sensor/sony_imx327_mipi/Makefile @@ -0,0 +1,33 @@ +# +# sensor lib Makefile +# +export TOP_DIR=../../../../ +include ../../../../Rules.make + +TARGETS := libsns_imx327.a +TARGETS_SO := libsns_imx327.so + +SRC :=$(wildcard *.c) +SRC += $(wildcard *.cpp) + +OBJS := $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(SRC))) + +CXXFLAGS := -Wall -I./ +CXXFLAGS += -I../../mpp_include + +all:$(TARGETS) $(TARGETS_SO) + +$(TARGETS):$(OBJS) + $(AR) rcs $@ $^ +$(TARGETS_SO):$(OBJS) + $(CC) -shared -fPIC -o $@ $^ + +%.o: %.cpp + $(CXX) -c $(CXXFLAGS) -o $@ $< + +%.o: %.c + $(CC) -c $(CXXFLAGS) -o $@ $< + +clean: + rm -r $(TARGETS) $(TARGETS_SO);rm *.o + diff --git a/soc/hi3516av200/sensor/sony_imx327_mipi/imx327_cmos.c b/soc/hi3516av200/sensor/sony_imx327_mipi/imx327_cmos.c new file mode 100644 index 0000000..892a201 --- /dev/null +++ b/soc/hi3516av200/sensor/sony_imx327_mipi/imx327_cmos.c @@ -0,0 +1,1967 @@ +#if !defined(__IMX327_CMOS_H_) +#define __IMX327_CMOS_H_ + +#include +#include +#include +#include "hi_comm_sns.h" +#include "hi_comm_video.h" +#include "hi_sns_ctrl.h" +#include "mpi_isp.h" +#include "mpi_ae.h" +#include "mpi_awb.h" +#include "mpi_af.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C"{ +#endif +#endif /* End of #ifdef __cplusplus */ + + +#define IMX327_ID 327 + +/**************************************************************************** + * global variables * + ****************************************************************************/ +ISP_SNS_STATE_S g_astimx327[ISP_MAX_DEV_NUM] = {{0}}; +static ISP_SNS_STATE_S *g_apstSnsState[ISP_MAX_DEV_NUM] = {&g_astimx327[0], &g_astimx327[1]}; +ISP_SNS_COMMBUS_U g_aunImx327BusInfo[ISP_MAX_DEV_NUM] = { + [0] = { .s8I2cDev = 0}, + [1] = { .s8I2cDev = 1} +}; +static ISP_FSWDR_MODE_E genFSWDRMode[ISP_MAX_DEV_NUM] = {ISP_FSWDR_NORMAL_MODE,ISP_FSWDR_NORMAL_MODE}; +static HI_U32 gu32MaxTimeGetCnt[ISP_MAX_DEV_NUM] = {0,0}; + +static HI_U32 g_au32InitExposure[ISP_MAX_DEV_NUM] = {0}; +static HI_U32 g_au32LinesPer500ms[ISP_MAX_DEV_NUM] = {0}; +static HI_U16 g_au16InitWBGain[ISP_MAX_DEV_NUM][3] = {{0}}; +static HI_U16 g_au16SampleRgain[ISP_MAX_DEV_NUM] = {0}; +static HI_U16 g_au16SampleBgain[ISP_MAX_DEV_NUM] = {0}; + +extern const unsigned int imx327_i2c_addr; +extern unsigned int imx327_addr_byte; +extern unsigned int imx327_data_byte; + +typedef struct hiIMX327_STATE_S +{ + HI_U8 u8Hcg; + HI_U32 u32BRL; + HI_U32 u32RHS1_MAX; + HI_U32 u32RHS2_MAX; +} IMX327_STATE_S; + +IMX327_STATE_S g_astimx327State[ISP_MAX_DEV_NUM] = {{0}}; + +extern void imx327_init(ISP_DEV IspDev); +extern void imx327_exit(ISP_DEV IspDev); +extern void imx327_standby(ISP_DEV IspDev); +extern void imx327_restart(ISP_DEV IspDev); +extern int imx327_write_register(ISP_DEV IspDev, int addr, int data); +extern int imx327_read_register(ISP_DEV IspDev, int addr); + +#define IMX327_FULL_LINES_MAX (0x3FFFF) +#define IMX327_FULL_LINES_MAX_2TO1_WDR (0x8AA) // considering the YOUT_SIZE and bad frame +#define IMX327_FULL_LINES_MAX_3TO1_WDR (0x7FC) + +/*****Imx327 Register Address*****/ +#define IMX327_SHS1_ADDR (0x3020) +#define IMX327_SHS2_ADDR (0x3024) +#define IMX327_SHS3_ADDR (0x3028) +#define IMX327_GAIN_ADDR (0x3014) +#define IMX327_HCG_ADDR (0x3009) +#define IMX327_VMAX_ADDR (0x3018) +#define IMX327_HMAX_ADDR (0x301c) +#define IMX327_RHS1_ADDR (0x3030) +#define IMX327_RHS2_ADDR (0x3034) +#define IMX327_Y_OUT_SIZE_ADDR (0x3418) + +#define IMX327_INCREASE_LINES (1) /* make real fps less than stand fps because NVR require*/ + +#define IMX327_VMAX_1080P30_LINEAR (1125+IMX327_INCREASE_LINES) +#define IMX327_VMAX_1080P60TO30_WDR (1125+IMX327_INCREASE_LINES) +#define IMX327_VMAX_1080P120TO30_WDR (1125+IMX327_INCREASE_LINES) + +//sensor fps mode +#define IMX327_SENSOR_1080P_30FPS_LINEAR_MODE (1) +#define IMX327_SENSOR_1080P_30FPS_3t1_WDR_MODE (2) +#define IMX327_SENSOR_1080P_30FPS_2t1_WDR_MODE (3) + +HI_S32 cmos_get_ae_default(ISP_DEV IspDev,AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if (HI_NULL == pstAeSnsDft) + { + printf("null pointer when get ae default value!\n"); + return - 1; + } + + memset(&pstAeSnsDft->stAERouteAttr, 0, sizeof(ISP_AE_ROUTE_S)); + + pstAeSnsDft->u32FullLinesStd = g_apstSnsState[IspDev]->u32FLStd; + pstAeSnsDft->u32FlickerFreq = 50*256; + pstAeSnsDft->u32FullLinesMax = IMX327_FULL_LINES_MAX; + + pstAeSnsDft->stIntTimeAccu.enAccuType = AE_ACCURACY_LINEAR; + pstAeSnsDft->stIntTimeAccu.f32Accuracy = 1; + pstAeSnsDft->stIntTimeAccu.f32Offset = 0; + + pstAeSnsDft->stAgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stAgainAccu.f32Accuracy = 1; + + pstAeSnsDft->stDgainAccu.enAccuType = AE_ACCURACY_TABLE; + pstAeSnsDft->stDgainAccu.f32Accuracy = 1; + + pstAeSnsDft->u32ISPDgainShift = 8; + pstAeSnsDft->u32MinISPDgainTarget = 1 << pstAeSnsDft->u32ISPDgainShift; + pstAeSnsDft->u32MaxISPDgainTarget = 2 << pstAeSnsDft->u32ISPDgainShift; + + if(g_au32LinesPer500ms[IspDev] == 0) + { + pstAeSnsDft->u32LinesPer500ms = g_apstSnsState[IspDev]->u32FLStd*30/2; + } + else + { + pstAeSnsDft->u32LinesPer500ms = g_au32LinesPer500ms[IspDev]; + } + + + pstAeSnsDft->enMaxIrisFNO = ISP_IRIS_F_NO_1_0; + pstAeSnsDft->enMinIrisFNO = ISP_IRIS_F_NO_32_0; + + pstAeSnsDft->bAERouteExValid = HI_FALSE; + pstAeSnsDft->stAERouteAttr.u32TotalNum = 0; + pstAeSnsDft->stAERouteAttrEx.u32TotalNum = 0; + + switch(g_apstSnsState[IspDev]->enWDRMode) + { + default: + case WDR_MODE_NONE: /*linear mode*/ + pstAeSnsDft->au8HistThresh[0] = 0xd; + pstAeSnsDft->au8HistThresh[1] = 0x28; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u32MaxAgain = 62564; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = pstAeSnsDft->u32MaxAgain; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 38577; + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = 20013; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + + pstAeSnsDft->u8AeCompensation = 0x38; + pstAeSnsDft->enAeExpMode = AE_EXP_HIGHLIGHT_PRIOR; + + pstAeSnsDft->u32InitExposure = g_au32InitExposure[IspDev] ? g_au32InitExposure[IspDev] : 148859; + + pstAeSnsDft->u32MaxIntTime = g_apstSnsState[IspDev]->u32FLStd - 2; + pstAeSnsDft->u32MinIntTime = 1; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = 1; + break; + + case WDR_MODE_2To1_LINE: + pstAeSnsDft->au8HistThresh[0] = 0xC; + pstAeSnsDft->au8HistThresh[1] = 0x18; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + + pstAeSnsDft->u32MaxIntTime = g_apstSnsState[IspDev]->u32FLStd - 2; + pstAeSnsDft->u32MinIntTime = 2; + + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = pstAeSnsDft->u32MinIntTime; + + pstAeSnsDft->u32MaxAgain = 62564; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = 62564; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 38577; + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = 20013; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + + pstAeSnsDft->u32InitExposure = g_au32InitExposure[IspDev] ? g_au32InitExposure[IspDev] : 16462; + + if(ISP_FSWDR_LONG_FRAME_MODE == genFSWDRMode[IspDev]) + { + pstAeSnsDft->u8AeCompensation = 56; + pstAeSnsDft->enAeExpMode = AE_EXP_HIGHLIGHT_PRIOR; + } + else + { + pstAeSnsDft->u32MaxDgainTarget = 8153; + pstAeSnsDft->u32MaxISPDgainTarget = 267; + pstAeSnsDft->u8AeCompensation = 24; + pstAeSnsDft->enAeExpMode = AE_EXP_LOWLIGHT_PRIOR; + pstAeSnsDft->u16ManRatioEnable = HI_TRUE; + pstAeSnsDft->au32Ratio[0] = 0x400; + pstAeSnsDft->au32Ratio[1] = 0x40; + pstAeSnsDft->au32Ratio[2] = 0x40; + } + break; + + case WDR_MODE_3To1_LINE: + pstAeSnsDft->au8HistThresh[0] = 0xC; + pstAeSnsDft->au8HistThresh[1] = 0x18; + pstAeSnsDft->au8HistThresh[2] = 0x60; + pstAeSnsDft->au8HistThresh[3] = 0x80; + + pstAeSnsDft->u32MaxIntTime = g_apstSnsState[IspDev]->u32FLStd - 2; + pstAeSnsDft->u32MinIntTime = 3; + pstAeSnsDft->u32MaxIntTimeTarget = 65535; + pstAeSnsDft->u32MinIntTimeTarget = pstAeSnsDft->u32MinIntTime; + + pstAeSnsDft->u32MaxAgain = 62564; + pstAeSnsDft->u32MinAgain = 1024; + pstAeSnsDft->u32MaxAgainTarget = 62564; + pstAeSnsDft->u32MinAgainTarget = pstAeSnsDft->u32MinAgain; + + pstAeSnsDft->u32MaxDgain = 38577; + pstAeSnsDft->u32MinDgain = 1024; + pstAeSnsDft->u32MaxDgainTarget = 20013; + pstAeSnsDft->u32MinDgainTarget = pstAeSnsDft->u32MinDgain; + + pstAeSnsDft->u32InitExposure = g_au32InitExposure[IspDev] ? g_au32InitExposure[IspDev] : 7436; + + if(ISP_FSWDR_LONG_FRAME_MODE == genFSWDRMode[IspDev]) + { + pstAeSnsDft->u8AeCompensation = 56; + pstAeSnsDft->enAeExpMode = AE_EXP_HIGHLIGHT_PRIOR; + } + else + { + pstAeSnsDft->u32MaxDgainTarget = 8153; + pstAeSnsDft->u32MaxISPDgainTarget = 267; + pstAeSnsDft->u8AeCompensation = 24; + pstAeSnsDft->enAeExpMode = AE_EXP_LOWLIGHT_PRIOR; + pstAeSnsDft->u16ManRatioEnable = HI_TRUE; + pstAeSnsDft->au32Ratio[0] = 0x200; + pstAeSnsDft->au32Ratio[1] = 0x200; + pstAeSnsDft->au32Ratio[2] = 0x40; + } + break; + + } + + return 0; +} + + +/* the function of sensor set fps */ +HI_VOID cmos_fps_set(ISP_DEV IspDev, HI_FLOAT f32Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + + HI_U32 u32VMAX = IMX327_VMAX_1080P30_LINEAR; + + switch (g_apstSnsState[IspDev]->u8ImgMode) + { + case IMX327_SENSOR_1080P_30FPS_2t1_WDR_MODE: + if ((f32Fps <= 30) && (f32Fps >= 16.5)) + { + u32VMAX = IMX327_VMAX_1080P60TO30_WDR * 30 / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + u32VMAX = (u32VMAX > IMX327_FULL_LINES_MAX_2TO1_WDR) ? IMX327_FULL_LINES_MAX_2TO1_WDR : u32VMAX; + break; + + case IMX327_SENSOR_1080P_30FPS_3t1_WDR_MODE: + if ((f32Fps <= 30) && (f32Fps >= 16.5)) + { + u32VMAX = IMX327_VMAX_1080P120TO30_WDR * 30 / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + u32VMAX = (u32VMAX > IMX327_FULL_LINES_MAX_3TO1_WDR) ? IMX327_FULL_LINES_MAX_3TO1_WDR : u32VMAX; + break; + + case IMX327_SENSOR_1080P_30FPS_LINEAR_MODE: + if ((f32Fps <= 30) && (f32Fps >= 0.5)) + { + u32VMAX = IMX327_VMAX_1080P30_LINEAR * 30 / f32Fps; + } + else + { + printf("Not support Fps: %f\n", f32Fps); + return; + } + u32VMAX = (u32VMAX > IMX327_FULL_LINES_MAX) ? IMX327_FULL_LINES_MAX : u32VMAX; + break; + + default: + return; + break; + } + + if (WDR_MODE_NONE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u32Data = (u32VMAX & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u32Data = ((u32VMAX & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u32Data = ((u32VMAX & 0xF0000) >> 16); + } + else + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[8].u32Data = (u32VMAX & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[9].u32Data = ((u32VMAX & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[10].u32Data = ((u32VMAX & 0xF0000) >> 16); + } + + if (WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->u32FLStd = u32VMAX * 2; + //printf("gu32FullLinesStd:%d\n",g_apstSnsState[IspDev]->u32FLStd); + + /* + RHS1 limitation: + 2n + 5 + RHS1 <= FSC - BRL*2 -21 + (2 * VMAX_IMX327_1080P30_WDR - 2 * gu32BRL - 21) - (((2 * VMAX_IMX327_1080P30_WDR - 2 * 1109 - 21) - 5) %2) + */ + + g_astimx327State[IspDev].u32RHS1_MAX = (u32VMAX - g_astimx327State[IspDev].u32BRL) * 2 - 21; + + } + + else if (WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->u32FLStd = u32VMAX * 4; + + //printf("u32VMAX:%d gu32FullLinesStd:%d\n",u32VMAX,g_apstSnsState[IspDev]->u32FLStd); + + /* + RHS2 limitation: + 3n + 14 + RHS2 <= FSC - BRL*3 -25 + */ + g_astimx327State[IspDev].u32RHS2_MAX = u32VMAX*4 - g_astimx327State[IspDev].u32BRL * 3 - 25; + + } + else + { + g_apstSnsState[IspDev]->u32FLStd = u32VMAX; + } + + pstAeSnsDft->f32Fps = f32Fps; + pstAeSnsDft->u32LinesPer500ms = g_apstSnsState[IspDev]->u32FLStd * f32Fps / 2; + pstAeSnsDft->u32FullLinesStd = g_apstSnsState[IspDev]->u32FLStd; + pstAeSnsDft->u32MaxIntTime = g_apstSnsState[IspDev]->u32FLStd - 2; + g_apstSnsState[IspDev]->au32FL[0] = g_apstSnsState[IspDev]->u32FLStd; + pstAeSnsDft->u32FullLines = g_apstSnsState[IspDev]->au32FL[0]; + + return; + +} + +HI_VOID cmos_slow_framerate_set(ISP_DEV IspDev,HI_U32 u32FullLines, + AE_SENSOR_DEFAULT_S *pstAeSnsDft) +{ + if(WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + u32FullLines = (u32FullLines > 2*IMX327_FULL_LINES_MAX_2TO1_WDR) ? 2*IMX327_FULL_LINES_MAX_2TO1_WDR : u32FullLines; + g_apstSnsState[IspDev]->au32FL[0] = (u32FullLines >> 1) << 1; + g_astimx327State[IspDev].u32RHS1_MAX = g_apstSnsState[IspDev]->au32FL[0] - g_astimx327State[IspDev].u32BRL * 2 - 21; + } + else if(WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + u32FullLines = (u32FullLines > 4*IMX327_FULL_LINES_MAX_3TO1_WDR) ? 4*IMX327_FULL_LINES_MAX_3TO1_WDR : u32FullLines; + g_apstSnsState[IspDev]->au32FL[0] = (u32FullLines >> 2) << 2; + g_astimx327State[IspDev].u32RHS2_MAX = g_apstSnsState[IspDev]->au32FL[0] - g_astimx327State[IspDev].u32BRL * 3 - 25; + } + else + { + u32FullLines = (u32FullLines > IMX327_FULL_LINES_MAX) ? IMX327_FULL_LINES_MAX : u32FullLines; + g_apstSnsState[IspDev]->au32FL[0] = u32FullLines; + } + + if(WDR_MODE_NONE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u32Data = (g_apstSnsState[IspDev]->au32FL[0] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u32Data = ((g_apstSnsState[IspDev]->au32FL[0] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u32Data = ((g_apstSnsState[IspDev]->au32FL[0] & 0xF0000) >> 16); + } + else if(WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[8].u32Data = ((g_apstSnsState[IspDev]->au32FL[0]>>1) & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[9].u32Data = (((g_apstSnsState[IspDev]->au32FL[0]>>1) & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[10].u32Data = (((g_apstSnsState[IspDev]->au32FL[0]>>1) & 0xF0000) >> 16); + } + else if(WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[8].u32Data = ((g_apstSnsState[IspDev]->au32FL[0]>>2) & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[9].u32Data = (((g_apstSnsState[IspDev]->au32FL[0]>>2) & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[10].u32Data = (((g_apstSnsState[IspDev]->au32FL[0]>>2) & 0xF0000) >> 16); + } + else + { + } + + pstAeSnsDft->u32FullLines = g_apstSnsState[IspDev]->au32FL[0]; + pstAeSnsDft->u32MaxIntTime = g_apstSnsState[IspDev]->au32FL[0] - 2; + + return; +} + +/* while isp notify ae to update sensor regs, ae call these funcs. */ +HI_VOID cmos_inttime_update(ISP_DEV IspDev,HI_U32 u32IntTime) +{ + static HI_BOOL bFirst[ISP_MAX_DEV_NUM] ={1, 1}; + HI_U32 u32Value = 0; + + static HI_U8 u8Count[ISP_MAX_DEV_NUM] = {0}; + + static HI_U32 u32ShortIntTime[ISP_MAX_DEV_NUM] = {0}; + static HI_U32 u32ShortIntTime1[ISP_MAX_DEV_NUM] = {0}; + static HI_U32 u32ShortIntTime2[ISP_MAX_DEV_NUM] = {0}; + static HI_U32 u32LongIntTime[ISP_MAX_DEV_NUM] = {0}; + + static HI_U32 u32RHS1[ISP_MAX_DEV_NUM] = {0}; + static HI_U32 u32RHS2[ISP_MAX_DEV_NUM] = {0}; + + static HI_U32 u32SHS1[ISP_MAX_DEV_NUM] = {0}; + static HI_U32 u32SHS2[ISP_MAX_DEV_NUM] = {0}; + static HI_U32 u32SHS3[ISP_MAX_DEV_NUM] = {0}; + + HI_U32 u32YOUTSIZE; + + if (WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + //printf("bFirst = %d\n",bFirst[IspDev]); + if (bFirst[IspDev]) /* short exposure */ + { + g_apstSnsState[IspDev]->au32WDRIntTime[0] = u32IntTime; + u32ShortIntTime[IspDev] = u32IntTime; + //printf("u32ShortIntTime = %d \n",u32ShortIntTime[IspDev]); + bFirst[IspDev] = HI_FALSE; + } + + else /* long exposure */ + { + g_apstSnsState[IspDev]->au32WDRIntTime[1] = u32IntTime; + u32LongIntTime[IspDev] = u32IntTime; + + u32SHS2[IspDev] = g_apstSnsState[IspDev]->au32FL[1] - u32LongIntTime[IspDev] - 1; + + //allocate the RHS1 + u32SHS1[IspDev] = (u32ShortIntTime[IspDev] % 2) + 2; + u32RHS1[IspDev] = u32ShortIntTime[IspDev] + u32SHS1[IspDev] + 1; + + + u32YOUTSIZE=(1097+(u32RHS1[IspDev]-1)/2+7)*2; + u32YOUTSIZE=(u32YOUTSIZE>=0x1FFF)?0x1FFF:u32YOUTSIZE; + //printf("u32ShortIntTime = %d u32SHS1 = %d \n",u32ShortIntTime[IspDev],u32SHS1); + //printf("IspDev = %d RHS1 = %d u32YOUTSIZE = %d \n",IspDev,u32RHS1[IspDev], u32YOUTSIZE); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[0].u32Data = (u32SHS1[IspDev] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[1].u32Data = ((u32SHS1[IspDev] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[2].u32Data = ((u32SHS1[IspDev] & 0xF0000) >> 16); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u32Data = (u32SHS2[IspDev] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u32Data = ((u32SHS2[IspDev] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u32Data = ((u32SHS2[IspDev] & 0xF0000) >> 16); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[11].u32Data = (u32RHS1[IspDev] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[12].u32Data = ((u32RHS1[IspDev] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[13].u32Data = ((u32RHS1[IspDev] & 0xF0000) >> 16); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[14].u32Data = (u32YOUTSIZE & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[15].u32Data = ((u32YOUTSIZE & 0x1F00) >> 8); + + bFirst[IspDev] = HI_TRUE; + } + } + + + else if(WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + if (0 == u8Count[IspDev]) /* short exposure */ + { + g_apstSnsState[IspDev]->au32WDRIntTime[0] = u32IntTime; + u32ShortIntTime1[IspDev] = u32IntTime; + u8Count[IspDev]++; + } + else if (1 == u8Count[IspDev]) /* short short exposure */ + { + g_apstSnsState[IspDev]->au32WDRIntTime[1] = u32IntTime; + u32ShortIntTime2[IspDev] = u32IntTime; + u8Count[IspDev]++; + } + else /* long exposure */ + { + g_apstSnsState[IspDev]->au32WDRIntTime[2] = u32IntTime; + u32LongIntTime[IspDev] = u32IntTime; + u32SHS3[IspDev] = g_apstSnsState[IspDev]->au32FL[1] - u32LongIntTime[IspDev] -1; + + //allocate the RHS1 and RHS2 + u32SHS1[IspDev] = (3 - (u32ShortIntTime2[IspDev] % 3)) + 3; + u32RHS1[IspDev] = u32ShortIntTime2[IspDev] + u32SHS1[IspDev] + 1; + u32SHS2[IspDev] = u32RHS1[IspDev] + (3 - (u32ShortIntTime1[IspDev] % 3)) + 3; + u32RHS2[IspDev] = u32ShortIntTime1[IspDev] + u32SHS2[IspDev] + 1; + + u32YOUTSIZE=(1097+(u32RHS2[IspDev]-2)/3+9)*3; + u32YOUTSIZE=(u32YOUTSIZE>=0x1FFF)?0x1FFF:u32YOUTSIZE; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[0].u32Data = (u32SHS1[IspDev] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[1].u32Data = ((u32SHS1[IspDev] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[2].u32Data = ((u32SHS1[IspDev] & 0xF0000) >> 16); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u32Data = (u32SHS2[IspDev] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u32Data = ((u32SHS2[IspDev] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u32Data = ((u32SHS2[IspDev] & 0xF0000) >> 16); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[11].u32Data = (u32RHS1[IspDev] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[12].u32Data = ((u32RHS1[IspDev] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[13].u32Data = ((u32RHS1[IspDev] & 0xF0000) >> 16); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[14].u32Data = (u32RHS2[IspDev] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[15].u32Data = ((u32RHS2[IspDev] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[16].u32Data = ((u32RHS2[IspDev] & 0xF0000) >> 16); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[17].u32Data = (u32SHS3[IspDev] & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[18].u32Data = ((u32SHS3[IspDev] & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[19].u32Data = ((u32SHS3[IspDev] & 0xF0000) >> 16); + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[20].u32Data = (u32YOUTSIZE & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[21].u32Data = ((u32YOUTSIZE & 0x1F00) >> 8); + + u8Count[IspDev] = 0; + } + } + else + { + u32Value = g_apstSnsState[IspDev]->au32FL[0] - u32IntTime - 1; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[0].u32Data = (u32Value & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[1].u32Data = ((u32Value & 0xFF00) >> 8); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[2].u32Data = ((u32Value & 0x30000) >> 16); + + bFirst[IspDev] = HI_TRUE; + } + + return; + +} + +static HI_U32 gain_table[262]= +{ + 1024,1059,1097,1135,1175,1217,1259,1304,1349,1397,1446,1497,1549,1604,1660,1719,1779,1842,1906, + 1973,2043,2048,2119,2194,2271,2351,2434,2519,2608,2699,2794,2892,2994,3099,3208,3321,3438,3559, + 3684,3813,3947,4086,4229,4378,4532,4691,4856,5027,5203,5386,5576,5772,5974,6184,6402,6627,6860, + 7101,7350,7609,7876,8153,8439,8736,9043,9361,9690,10030,10383,10748,11125,11516,11921,12340,12774, + 13222,13687,14168,14666,15182,15715,16267,16839,17431,18043,18677,19334,20013,20717,21445,22198, + 22978,23786,24622,25487,26383,27310,28270,29263,30292,31356,32458,33599,34780,36002,37267,38577, + 39932,41336,42788,44292,45849,47460,49128,50854,52641,54491,56406,58388,60440,62564,64763,67039, + 69395,71833,74358,76971,79676,82476,85374,88375,91480,94695,98023,101468,105034,108725,112545, + 116501,120595,124833,129220,133761,138461,143327,148364,153578,158975,164562,170345,176331,182528, + 188942,195582,202455,209570,216935,224558,232450,240619,249074,257827,266888,276267,285976,296026, + 306429,317197,328344,339883,351827,364191,376990,390238,403952,418147,432842,448053,463799,480098, + 496969,514434,532512,551226,570597,590649,611406,632892,655133,678156,701988,726657,752194,778627, + 805990,834314,863634,893984,925400,957921,991585,1026431,1062502,1099841,1138491,1178500,1219916, + 1262786,1307163,1353100,1400651,1449872,1500824,1553566,1608162,1664676,1723177,1783733,1846417, + 1911304,1978472,2048000,2119971,2194471,2271590,2351418,2434052,2519590,2608134,2699789,2794666, + 2892876,2994538,3099773,3208706,3321467,3438190,3559016,3684087,3813554,3947571,4086297,4229898, + 4378546,4532417,4691696,4856573,5027243,5203912,5386788,5576092,5772048,5974890,6184861,6402210, + 6627198,6860092,7101170,7350721,7609041,7876439,8153234 +}; + +HI_VOID cmos_again_calc_table(ISP_DEV IspDev,HI_U32 *pu32AgainLin, HI_U32 *pu32AgainDb) +{ + int i; + + if (*pu32AgainLin >= gain_table[120]) + { + *pu32AgainLin = gain_table[120]; + *pu32AgainDb = 120; + return ; + } + + for (i = 1; i < 121; i++) + { + if (*pu32AgainLin < gain_table[i]) + { + *pu32AgainLin = gain_table[i - 1]; + *pu32AgainDb = i - 1; + break; + } + } + return; +} + +HI_VOID cmos_dgain_calc_table(ISP_DEV IspDev,HI_U32 *pu32DgainLin, HI_U32 *pu32DgainDb) +{ + int i; + + if((HI_NULL == pu32DgainLin) ||(HI_NULL == pu32DgainDb)) + { + printf("null pointer when get ae sensor gain info value!\n"); + return; + } + + if (*pu32DgainLin >= gain_table[106]) + { + *pu32DgainLin = gain_table[106]; + *pu32DgainDb = 106; + return ; + } + + for (i = 1; i < 106; i++) + { + if (*pu32DgainLin < gain_table[i]) + { + *pu32DgainLin = gain_table[i - 1]; + *pu32DgainDb = i - 1; + break; + } + } + + return; +} + +HI_VOID cmos_gains_update(ISP_DEV IspDev,HI_U32 u32Again, HI_U32 u32Dgain) +{ + HI_U32 u32HCG = g_astimx327State[IspDev].u8Hcg; + HI_U32 u32Tmp; + + if(u32Again >= 21) + { + u32HCG = u32HCG | 0x10; // bit[4] HCG .Reg0x3009[7:0] + u32Again = u32Again - 21; + } + + u32Tmp=u32Again+u32Dgain; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[3].u32Data = (u32Tmp & 0xFF); + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[4].u32Data = (u32HCG & 0xFF); + + + return; +} + +HI_VOID cmos_get_inttime_max(ISP_DEV IspDev,HI_U16 u16ManRatioEnable, HI_U32 *au32Ratio, HI_U32 *au32IntTimeMax, HI_U32 *au32IntTimeMin, HI_U32 *pu32LFMaxIntTime) +{ + HI_U32 i = 0; + HI_U32 u32IntTimeMaxTmp0 = 0; + HI_U32 u32IntTimeMaxTmp = 0; + HI_U32 u32RHS2_Max=0; + HI_U32 u32RatioTmp = 0x40; + HI_U32 u32ShortTimeMinLimit = 0; + + u32ShortTimeMinLimit = (WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) ? 2 : ((WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) ? 3 : 2); + + if((HI_NULL == au32Ratio) || (HI_NULL == au32IntTimeMax) || (HI_NULL == au32IntTimeMin)) + { + printf("null pointer when get ae sensor ExpRatio/IntTimeMax/IntTimeMin value!\n"); + return; + } + + if(WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + /* limitation for line base WDR + + SHS1 limitation: + 2 or more + RHS1 - 2 or less + + SHS2 limitation: + RHS1 + 2 or more + FSC - 2 or less + + RHS1 Limitation + 2n + 5 (n = 0,1,2...) + RHS1 <= FSC - BRL * 2 - 21 + + short exposure time = RHS1 - (SHS1 + 1) <= RHS1 - 3 + long exposure time = FSC - (SHS2 + 1) <= FSC - (RHS1 + 3) + ExposureShort + ExposureLong <= FSC - 6 + short exposure time <= (FSC - 6) / (ratio + 1) + */ + if(ISP_FSWDR_LONG_FRAME_MODE == genFSWDRMode[IspDev]) + { + u32IntTimeMaxTmp0 = g_apstSnsState[IspDev]->au32FL[1] - 6 - g_apstSnsState[IspDev]->au32WDRIntTime[0]; + u32IntTimeMaxTmp = g_apstSnsState[IspDev]->au32FL[0] - 10; + u32IntTimeMaxTmp = (u32IntTimeMaxTmp0 < u32IntTimeMaxTmp) ? u32IntTimeMaxTmp0 : u32IntTimeMaxTmp; + au32IntTimeMax[0] = u32IntTimeMaxTmp; + au32IntTimeMin[0] = u32ShortTimeMinLimit; + return; + } + else + { + u32IntTimeMaxTmp0 = ((g_apstSnsState[IspDev]->au32FL[1] - 6 - g_apstSnsState[IspDev]->au32WDRIntTime[0]) * 0x40) / DIV_0_TO_1(au32Ratio[0]); + u32IntTimeMaxTmp = ((g_apstSnsState[IspDev]->au32FL[0] - 6) * 0x40) / DIV_0_TO_1(au32Ratio[0] + 0x40); + u32IntTimeMaxTmp = (u32IntTimeMaxTmp0 < u32IntTimeMaxTmp) ? u32IntTimeMaxTmp0 : u32IntTimeMaxTmp; + u32IntTimeMaxTmp = (u32IntTimeMaxTmp > (g_astimx327State[IspDev].u32RHS1_MAX- 3))? (g_astimx327State[IspDev].u32RHS1_MAX - 3) : u32IntTimeMaxTmp; + u32IntTimeMaxTmp = (0 == u32IntTimeMaxTmp)? 1: u32IntTimeMaxTmp; + } + + } + else if(WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + /* limitation for DOL 3t1 + + SHS1 limitation: + 3 or more + RHS1 - 2 or less + + RHS1 Limitation + 3n + 7 (n = 0,1,2...) + + SHS2 limitation: + RHS1 + 3 or more + RHS2 - 2 or less + + RHS2 Limitation + 3n + 14 (n = 0,1,2...) + RHS2 <= FSC - BRL * 3 - 25 + + SHS3 limitation: + RHS2 + 3 or more + FSC - 2 or less + + short exposure time 1 = RHS1 - (SHS1 + 1) <= RHS1 - 4 + short exposure time 2 = RHS2 - (SHS2 + 1) <= RHS2 - (RHS1 + 4) + short exposure time 2 <= (RHS2 - 8) / (ratio[0] + 1) + long exposure time = FSC - (SHS3 + 1) <= FSC - (RHS2 + 4) + short exposure time 1 + short exposure time 2 + long exposure time <= FSC -12 + short exposure time 2 <= (FSC - 12) / (ratio[0]*ratio[1] + ratio[0] + 1) + */ + if(ISP_FSWDR_LONG_FRAME_MODE == genFSWDRMode[IspDev]) + { + /* when change LongFrameMode, the first 2 frames must limit the MaxIntTime to avoid flicker */ + if(gu32MaxTimeGetCnt[IspDev] < 2) + { + u32IntTimeMaxTmp0 = g_apstSnsState[IspDev]->au32FL[1] - 100 - g_apstSnsState[IspDev]->au32WDRIntTime[0] - g_apstSnsState[IspDev]->au32WDRIntTime[1]; + } + else + { + u32IntTimeMaxTmp0 = g_apstSnsState[IspDev]->au32FL[1] - 16 - g_apstSnsState[IspDev]->au32WDRIntTime[0] - g_apstSnsState[IspDev]->au32WDRIntTime[1]; + } + u32IntTimeMaxTmp = g_apstSnsState[IspDev]->au32FL[0] - 24; + u32IntTimeMaxTmp = (u32IntTimeMaxTmp0 < u32IntTimeMaxTmp) ? u32IntTimeMaxTmp0 : u32IntTimeMaxTmp; + au32IntTimeMax[0] = u32IntTimeMaxTmp; + au32IntTimeMin[0] = u32ShortTimeMinLimit; + gu32MaxTimeGetCnt[IspDev]++; + return; + } + else + { + u32IntTimeMaxTmp0 = ((g_apstSnsState[IspDev]->au32FL[1] - 16 - g_apstSnsState[IspDev]->au32WDRIntTime[0] - g_apstSnsState[IspDev]->au32WDRIntTime[1]) * 0x40*0x40) / (au32Ratio[0]*au32Ratio[1]); + u32IntTimeMaxTmp = ((g_apstSnsState[IspDev]->au32FL[0] - 16) * 0x40*0x40) / (au32Ratio[0]*au32Ratio[1] + au32Ratio[0]*0x40 + 0x40*0x40); + u32IntTimeMaxTmp = (u32IntTimeMaxTmp0 < u32IntTimeMaxTmp) ? u32IntTimeMaxTmp0 : u32IntTimeMaxTmp; + u32RHS2_Max = ((g_astimx327State[IspDev].u32RHS2_MAX-8)*0x40)/(au32Ratio[0]+0x40); + u32IntTimeMaxTmp = (u32IntTimeMaxTmp > u32RHS2_Max)? (u32RHS2_Max) : u32IntTimeMaxTmp; + u32IntTimeMaxTmp = (0 == u32IntTimeMaxTmp)? 1: u32IntTimeMaxTmp; + } + + } + else + { + } + + if(u32IntTimeMaxTmp >= u32ShortTimeMinLimit) + { + if (IS_LINE_WDR_MODE(g_apstSnsState[IspDev]->enWDRMode)) + { + au32IntTimeMax[0] = u32IntTimeMaxTmp; + au32IntTimeMax[1] = au32IntTimeMax[0] * au32Ratio[0] >> 6; + au32IntTimeMax[2] = au32IntTimeMax[1] * au32Ratio[1] >> 6; + au32IntTimeMax[3] = au32IntTimeMax[2] * au32Ratio[2] >> 6; + au32IntTimeMin[0] = u32ShortTimeMinLimit; + au32IntTimeMin[1] = au32IntTimeMin[0] * au32Ratio[0] >> 6; + au32IntTimeMin[2] = au32IntTimeMin[1] * au32Ratio[1] >> 6; + au32IntTimeMin[3] = au32IntTimeMin[2] * au32Ratio[2] >> 6; + } + else + { + } + } + else + { + if(1 == u16ManRatioEnable) + { + printf("Manaul ExpRatio is too large!\n"); + return; + } + else + { + u32IntTimeMaxTmp = u32ShortTimeMinLimit; + + if (WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + u32RatioTmp = 0xFFF; + au32IntTimeMax[0] = u32IntTimeMaxTmp; + au32IntTimeMax[1] = au32IntTimeMax[0] * u32RatioTmp >> 6; + } + else if (WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + for(i = 0x40; i <= 0xFFF; i++) + { + if((u32IntTimeMaxTmp + (u32IntTimeMaxTmp*i >> 6) + (u32IntTimeMaxTmp*i*i >> 12)) > (g_apstSnsState[IspDev]->au32FL[0] - 12)) + { + u32RatioTmp = i - 1; + break; + } + } + au32IntTimeMax[0] = u32IntTimeMaxTmp; + au32IntTimeMax[1] = au32IntTimeMax[0] * u32RatioTmp >> 6; + au32IntTimeMax[2] = au32IntTimeMax[1] * u32RatioTmp >> 6; + } + else + { + } + au32IntTimeMin[0] = au32IntTimeMax[0]; + au32IntTimeMin[1] = au32IntTimeMax[1]; + au32IntTimeMin[2] = au32IntTimeMax[2]; + au32IntTimeMin[3] = au32IntTimeMax[3]; + } + } + + return; + +} + +/* Only used in LINE_WDR mode */ +HI_VOID cmos_ae_fswdr_attr_set(ISP_DEV IspDev,AE_FSWDR_ATTR_S *pstAeFSWDRAttr) +{ + genFSWDRMode[IspDev] = pstAeFSWDRAttr->enFSWDRMode; + gu32MaxTimeGetCnt[IspDev] = 0; +} + + +HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default; + pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set; + pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; + pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update; + pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update; + pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table; + pstExpFuncs->pfn_cmos_dgain_calc_table = cmos_dgain_calc_table; + pstExpFuncs->pfn_cmos_get_inttime_max = cmos_get_inttime_max; + pstExpFuncs->pfn_cmos_ae_fswdr_attr_set = cmos_ae_fswdr_attr_set; + + return 0; +} + +static AWB_CCM_S g_stAwbCcm = +{ + 4900, + { + 0x1CE, 0x80BF, 0x800F, + 0x8052,0x184, 0x8032, + 0x5, 0x80D1, 0x1CC + }, + 3770, + { + 0x1CB, 0x80AF, 0x801C, + 0x806D, 0x18C, 0x801F, + 0x11, 0x80EE, 0x1DD + }, + 2640, + { + 0x1B4, 0x80AA, 0x800A, + 0x8091, 0x1A1, 0x8010, + 0x0, 0x80DB, 0x1DB + } +}; + +static AWB_CCM_S g_stAwbCcmWDR = +{ + 4900, + { + 0x1CE, 0x80BF, 0x800F, + 0x8052,0x184, 0x8032, + 0x5, 0x80D1, 0x1CC + }, + 3770, + { + 0x1CB, 0x80AF, 0x801C, + 0x806D, 0x18C, 0x801F, + 0x11, 0x80EE, 0x1DD + }, + 2640, + { + 0x1B4, 0x80AA, 0x800A, + 0x8091, 0x1A1, 0x8010, + 0x0, 0x80DB, 0x1DB + } +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTable = +{ + /* bvalid */ + 1, + + /*1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768*/ + /* saturation */ + {0x80,0x7a,0x78,0x74,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x38,0x38,0x38,0x38,0x38} +}; + +static AWB_AGC_TABLE_S g_stAwbAgcTableFSWDR = +{ + /* bvalid */ + 1, + + /* saturation */ + {0x78,0x78,0x6e,0x64,0x5E,0x58,0x50,0x48,0x40,0x38,0x38,0x38,0x38,0x38,0x38,0x38} +}; + +/* Rgain and Bgain of the golden sample */ +#define GOLDEN_RGAIN 0 +#define GOLDEN_BGAIN 0 + +HI_S32 cmos_get_awb_default(ISP_DEV IspDev,AWB_SENSOR_DEFAULT_S *pstAwbSnsDft) +{ + if (HI_NULL == pstAwbSnsDft) + { + printf("null pointer when get awb default value!\n"); + return -1; + } + + memset(pstAwbSnsDft, 0, sizeof(AWB_SENSOR_DEFAULT_S)); + pstAwbSnsDft->u16WbRefTemp = 4900; + + pstAwbSnsDft->au16GainOffset[0] = 0x1C3; + pstAwbSnsDft->au16GainOffset[1] = 0x100; + pstAwbSnsDft->au16GainOffset[2] = 0x100; + pstAwbSnsDft->au16GainOffset[3] = 0x1D4; + + pstAwbSnsDft->as32WbPara[0] = -37; + pstAwbSnsDft->as32WbPara[1] = 293; + pstAwbSnsDft->as32WbPara[2] = 0; + pstAwbSnsDft->as32WbPara[3] = 179537; + pstAwbSnsDft->as32WbPara[4] = 128; + pstAwbSnsDft->as32WbPara[5] = -123691; + + pstAwbSnsDft->u16GoldenRgain = GOLDEN_RGAIN; + pstAwbSnsDft->u16GoldenBgain = GOLDEN_BGAIN; + + switch (g_apstSnsState[IspDev]->enWDRMode) + { + default: + case WDR_MODE_NONE: + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTable, sizeof(AWB_AGC_TABLE_S)); + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcm, sizeof(AWB_CCM_S)); + break; + case WDR_MODE_2To1_LINE: + case WDR_MODE_3To1_LINE: + memcpy(&pstAwbSnsDft->stAgcTbl, &g_stAwbAgcTableFSWDR, sizeof(AWB_AGC_TABLE_S)); + memcpy(&pstAwbSnsDft->stCcm, &g_stAwbCcmWDR, sizeof(AWB_CCM_S)); + break; + } + + pstAwbSnsDft->u16SampleRgain = g_au16SampleRgain[IspDev]; + pstAwbSnsDft->u16SampleBgain = g_au16SampleBgain[IspDev]; + pstAwbSnsDft->u16InitRgain = g_au16InitWBGain[IspDev][0]; + pstAwbSnsDft->u16InitGgain = g_au16InitWBGain[IspDev][1]; + pstAwbSnsDft->u16InitBgain = g_au16InitWBGain[IspDev][2]; + + pstAwbSnsDft->u8AWBRunInterval = 2; + + return 0; +} + +HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs) +{ + memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S)); + + pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default; + + return 0; +} + + +static ISP_CMOS_AGC_TABLE_S g_stIspAgcTable = +{ + /* bvalid */ + 1, + + /* snr_thresh */ + {0x08,0x0c,0x10,0x14,0x18,0x20,0x28,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30}, + + /* demosaic_np_offset */ + {0x0,0xa,0x12,0x1a,0x20,0x28,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30}, + + /* ge_strength */ + {0x55,0x55,0x55,0x55,0x55,0x55,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37} + +}; + +static ISP_CMOS_BAYER_SHARPEN_S g_stIspBayerSharpen = +{ + /* bvalid */ + 1, + + /* ShpAlgSel = 1 is Demosaic SharpenEx, else Demosaic sharpen. */ + 0, + + /* sharpen_alt_d to Sharpen */ + {0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x40,0x30,0x20,0x10}, + + /* sharpen_alt_ud to Sharpen */ + {0x3a,0x36,0x32,0x30,0x2c,0x30,0x30,0x30,0x28,0x24,0x24,0x20,0x20,0x20,0x10,0x10}, + + /* demosaic_lum_thresh to Sharpen */ + {0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x40,0x30,0x20,0x20,0x20,0x20,0x20,0x20}, + + /* SharpenHF to SharpenEx */ + {0x30,0x30,0x30,0x30,0x30,0x30,0x2c,0x28,0x20,0x18,0x14,0x10,0x10,0x10,0x10,0x10}, + + /* SharpenMF to SharpenEx */ + {0x30,0x30,0x30,0x30,0x28,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10}, + + /* SharpenLF to SharpenEx */ + {0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}, + + /* SadAmplifier to SharpenEx */ + {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10} + +}; + + +static ISP_CMOS_BAYER_SHARPEN_S g_stIspBayerSharpenFSWDR = +{ + /* bvalid */ + 1, + + /* ShpAlgSel = 1 is Demosaic SharpenEx, else Demosaic sharpen. */ + 0, + + /* sharpen_alt_d to Sharpen */ + {0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x40,0x30,0x20,0x10}, + + /* sharpen_alt_ud to Sharpen */ + {0x48,0x46,0x42,0x40,0x40,0x40,0x40,0x40,0x40,0x3c,0x38,0x32,0x28,0x20,0x10,0x10}, + + /* demosaic_lum_thresh to Sharpen */ + {0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x40,0x30,0x20,0x20,0x20,0x20,0x20,0x20}, + + /* SharpenHF to SharpenEx */ + {0x30,0x30,0x30,0x30,0x30,0x30,0x2c,0x28,0x20,0x18,0x14,0x10,0x10,0x10,0x10,0x10}, + + /* SharpenMF to SharpenEx */ + {0x30,0x30,0x30,0x30,0x28,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10}, + + /* SharpenLF to SharpenEx */ + {0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}, + + /* SadAmplifier to SharpenEx */ + {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10} + +}; + + +static ISP_CMOS_YUV_SHARPEN_S g_stIspYuvSharpen = +{ + /* bvalid */ + 1, + + /* 100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800 */ + + /* bEnLowLumaShoot */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1}, + + /* TextureSt */ + {50, 48, 46, 44, 48, 56, 56, 56, 48, 36, 20, 8, 4, 4, 4, 4}, + + /* EdgeSt */ + {64, 64, 64, 64, 64, 64, 56, 56, 56, 48, 48, 48, 48, 32, 20, 20}, + + /* OverShoot */ + {64, 64, 64, 64, 72, 72, 72, 72, 72, 64, 64, 56, 50, 40, 30, 30}, + + /* UnderShoot */ + {64, 64, 64, 64, 72, 72, 72, 72, 72, 64, 64, 56, 50, 40, 30, 30}, + + /* TextureThd */ + {80, 80, 80, 80, 80, 80, 90, 90, 90, 100, 100, 100, 100, 100, 110, 110}, + + /* EdgeThd */ + {0, 0, 5, 10, 10, 10, 16, 20, 30, 40, 50, 50, 60, 60, 60, 60}, + + /* JagCtrl */ + {63, 38, 20, 18, 16, 12, 10, 8, 8, 4, 4, 4, 2, 2, 2, 2}, + + /* SaltCtrl */ + {50, 50, 50, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 50, 50, 50}, + + /* PepperCtrl */ + {0, 0, 0, 20, 60, 60, 60, 80, 120, 160, 180, 180, 180, 180, 180, 180}, + + /* DetailCtrl */ + {150, 150, 135, 135, 130, 130, 130, 130, 120, 120, 120, 120, 100, 50, 50, 50}, + + /* LumaThd */ + { + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, /* LumaThd0 */ + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, /* LumaThd1 */ + {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, /* LumaThd2 */ + {90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90} /* LumaThd3 */ + }, + + /* LumaWgt */ + { + {160, 160, 160, 150, 140, 130, 120, 110, 100, 100, 90, 90, 80, 80, 80, 80}, + {200, 200, 200, 180, 170, 160, 150, 150, 150, 150, 120, 120, 120, 120, 120, 120}, + {240, 240, 240, 200, 200, 190, 180, 180, 180, 180, 160, 160, 160, 160, 160, 160}, + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, + } +}; + + +static ISP_CMOS_YUV_SHARPEN_S g_stIspYuvSharpenFSWDR = +{ + /* bvalid */ + 1, + + /* 100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800, 409600, 819200, 1638400, 3276800 */ + + /* bEnLowLumaShoot */ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1}, + + /* TextureSt */ + {50, 48, 46, 44, 48, 56, 56, 56, 48, 36, 20, 8, 4, 4, 4, 4}, + + /* EdgeSt */ + {64, 64, 64, 64, 64, 64, 56, 56, 56, 48, 48, 48, 48, 32, 20, 20}, + + /* OverShoot */ + {32, 36, 40, 48, 48, 48, 44, 40, 40, 32, 32, 28, 25, 20, 20, 20}, + + /* UnderShoot */ + {32, 36, 40, 48, 48, 48, 44, 40, 40, 32, 32, 28, 25, 20, 20, 20}, + + /* TextureThd */ + {20, 24, 28, 32, 36, 40, 48, 56, 64, 128, 156, 156, 156, 160, 160, 160}, + + /* EdgeThd */ + {0, 0, 0, 10, 10, 10, 16, 32, 64, 128, 156, 156, 156, 160, 160, 160}, + + /* JagCtrl */ + {24, 22, 20, 18, 16, 12, 10, 8, 8, 4, 4, 4, 2, 2, 2, 2}, + + /* SaltCtrl */ + {50, 50, 50, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 50, 50, 50}, + + /* PepperCtrl */ + {0, 0, 0, 20, 60, 60, 60, 80, 120, 160, 180, 180, 180, 180, 180, 180}, + + /* DetailCtrl */ + {140, 140, 135, 135, 130, 130, 130, 130, 120, 120, 120, 120, 100, 50, 50, 50}, + + /* LumaThd */ + { + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, /* LumaThd0 */ + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, /* LumaThd1 */ + {65, 65, 65, 65, 65, 65, 70, 75, 80, 80, 80, 80, 80, 80, 80, 80}, /* LumaThd2 */ + {90, 90, 90, 90, 90, 90, 100, 110, 120, 120, 120, 120, 120, 120, 120, 120} /* LumaThd3 */ + }, + + /* LumaWgt */ + { + {160, 160, 160, 150, 120, 80, 40, 20, 10, 10, 10, 10, 10, 10, 10, 10}, + {200, 200, 200, 180, 160, 120, 80, 60, 40, 40, 40, 40, 40, 40, 40, 40}, + {240, 240, 240, 200, 200, 180, 160, 140, 128, 128, 128, 128, 128, 128, 128, 128}, + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255}, + } +}; + + +static ISP_CMOS_AGC_TABLE_S g_stIspAgcTableFSWDR = +{ + /* bvalid */ + 1, + + /* snr_thresh */ + {0x8,0xC,0x10,0x14,0x18,0x20,0x28,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30}, + + /* demosaic_np_offset */ + {0x0,0xa,0x12,0x1a,0x20,0x28,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30}, + + /* ge_strength */ + {0x55,0x55,0x55,0x55,0x55,0x55,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37}, +}; + +static ISP_CMOS_NOISE_TABLE_S g_stIspNoiseTable = +{ + /* bvalid */ + 1, + + /* nosie_profile_weight_lut */ + { + 0,0,0,0,0,0,0,8,14,18,21,24,26,27,28,30,31,32,33,34,34,36,36,37,38,38,39,39, + 40,40,41,41,42,42,42,43,43,44,44,44,45,45,45,46,46,46,46,47,47,47,48,48,48,48,49,49,49, + 49,49,50,50,50,50,51,51,51,51,51,51,52,52,52,52,52,53,53,53,53,53,53,53,54,54,54,54,54, + 54,55,55,55,55,55,55,55,55,56,56,56,56,56,56,56,56,57,57,57,57,57,57,57,57,57,58,58,58, + 58,58,58,58,58,58,59,59,59,59,59,59,59 + }, + + /* demosaic_weight_lut */ + { + 0,8,14,18,21,24,26,27,28,30,31,32,33,34,34,36,36,37,38,38,39,39,40,40,41,41,42,42,42, + 43,43,44,44,44,45,45,45,46,46,46,46,47,47,47,48,48,48,48,49,49,49,49,49,50,50,50,50, + 51,51,51,51,51,51,52,52,52,52,52,53,53,53,53,53,53,53,54,54,54,54,54,54,55,55,55,55, + 55,55,55,55,56,56,56,56,56,56,56,56,57,57,57,57,57,57,57,57,57,58,58,58,58,58,58,58, + 58,58,59,59,59,59,59,59,59,59,59,59,59,59,59 + } +}; + +static ISP_CMOS_NOISE_TABLE_S g_stIspNoiseTableFSWDR = +{ + /* bvalid */ + 1, + + /* nosie_profile_weight_lut */ + { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,7,10,13,15,18,21,23,26,29,31,34,37,39,42,45 + }, + + /* demosaic_weight_lut */ + { + 0,2,15,20,24,27,30,32,33,35,36,37,38,39,40,41,42,42,43,44,44,45,45,46, + 46,47,47,48,48,49,49,49,50,50,50,51,51,51,52,52,52,53,53,53,53,54,54,54,54,55,55, + 55,55,56,56,56,56,56,57,57,57,57,57,58,58,58,58,58,59,59,59,59,59,59,59,60,60,60, + 60,60,60,61,61,61,61,61,61,61,62,62,62,62,62,62,62,62,63,63,63,63,63,63,63,63,63, + 64,64,64,64,64,64,64,64,64,65,65,65,65,65,65,65,65,65,65,65,65,65,65 + } +}; + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaic = +{ + /* bvalid */ + 1, + + /*vh_slope*/ + 0xac, + + /*aa_slope*/ + 0xaa, + + /*va_slope*/ + 0xa8, + + /*uu_slope*/ + 0x55, + + /*sat_slope*/ + 0x5d, + + /*ac_slope*/ + 0xa0, + + /*fc_slope*/ + 0x80, + + /*vh_thresh*/ + 0x00, + + /*aa_thresh*/ + 0x00, + + /*va_thresh*/ + 0x00, + + /*uu_thresh*/ + 0x08, + + /*sat_thresh*/ + 0x00, + + /*ac_thresh*/ + 0x1b3 + +}; + +static ISP_CMOS_DEMOSAIC_S g_stIspDemosaicFSWDR = +{ + /* bvalid */ + 1, + + /*vh_slope*/ + 0xac, + + /*aa_slope*/ + 0xaa, + + /*va_slope*/ + 0xa8, + + /*uu_slope*/ + 0x55, + + /*sat_slope*/ + 0x5d, + + /*ac_slope*/ + 0xa0, + + /*fc_slope*/ + 0x80, + + /*vh_thresh*/ + 0x00, + + /*aa_thresh*/ + 0x00, + + /*va_thresh*/ + 0x00, + + /*uu_thresh*/ + 0x00, + + /*sat_thresh*/ + 0x00, + + /*ac_thresh*/ + 0x1b3 +}; + +static ISP_CMOS_GAMMA_S g_stIspGamma = +{ + /* bvalid */ + 1, + + {0 ,120 ,220 ,310 ,390 ,470 ,540 ,610 ,670 ,730 ,786 ,842 ,894 ,944 ,994 ,1050, + 1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568, + 1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907, + 1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184, + 2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422, + 2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570,2583,2596,2609,2621,2634, + 2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825, + 2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001, + 3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165, + 3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318, + 3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463, + 3471,3480,3489,3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600, + 3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730, + 3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855, + 3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974, + 3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095} +}; + +static ISP_CMOS_GAMMA_S g_stIspGammaFSWDR = +{ + /* bvalid */ + 1, + + {0 ,120 ,220 ,310 ,390 ,470 ,540 ,610 ,670 ,730 ,786 ,842 ,894 ,944 ,994 ,1050, + 1096,1138,1178,1218,1254,1280,1314,1346,1378,1408,1438,1467,1493,1519,1543,1568, + 1592,1615,1638,1661,1683,1705,1726,1748,1769,1789,1810,1830,1849,1869,1888,1907, + 1926,1945,1963,1981,1999,2017,2034,2052,2069,2086,2102,2119,2136,2152,2168,2184, + 2200,2216,2231,2247,2262,2277,2292,2307,2322,2337,2351,2366,2380,2394,2408,2422, + 2436,2450,2464,2477,2491,2504,2518,2531,2544,2557,2570,2583,2596,2609,2621,2634, + 2646,2659,2671,2683,2696,2708,2720,2732,2744,2756,2767,2779,2791,2802,2814,2825, + 2837,2848,2859,2871,2882,2893,2904,2915,2926,2937,2948,2959,2969,2980,2991,3001, + 3012,3023,3033,3043,3054,3064,3074,3085,3095,3105,3115,3125,3135,3145,3155,3165, + 3175,3185,3194,3204,3214,3224,3233,3243,3252,3262,3271,3281,3290,3300,3309,3318, + 3327,3337,3346,3355,3364,3373,3382,3391,3400,3409,3418,3427,3436,3445,3454,3463, + 3471,3480,3489,3498,3506,3515,3523,3532,3540,3549,3557,3566,3574,3583,3591,3600, + 3608,3616,3624,3633,3641,3649,3657,3665,3674,3682,3690,3698,3706,3714,3722,3730, + 3738,3746,3754,3762,3769,3777,3785,3793,3801,3808,3816,3824,3832,3839,3847,3855, + 3862,3870,3877,3885,3892,3900,3907,3915,3922,3930,3937,3945,3952,3959,3967,3974, + 3981,3989,3996,4003,4010,4018,4025,4032,4039,4046,4054,4061,4068,4075,4082,4089,4095} + +}; + +HI_U32 cmos_get_isp_default(ISP_DEV IspDev,ISP_CMOS_DEFAULT_S *pstDef) +{ + if (HI_NULL == pstDef) + { + printf("null pointer when get isp default value!\n"); + return -1; + } + + memset(pstDef, 0, sizeof(ISP_CMOS_DEFAULT_S)); + + switch (g_apstSnsState[IspDev]->enWDRMode) + { + default: + case WDR_MODE_NONE: + pstDef->stDrc.bEnable = HI_FALSE; + pstDef->stDrc.u32BlackLevel = 0x00; + pstDef->stDrc.u32WhiteLevel = 0xD0000; + pstDef->stDrc.u32SlopeMax = 0x30; + pstDef->stDrc.u32SlopeMin = 0x0; + pstDef->stDrc.u32VarianceSpace = 0x4; + pstDef->stDrc.u32VarianceIntensity = 0x2; + pstDef->stDrc.u32Asymmetry = 0x08; + pstDef->stDrc.u32BrightEnhance = 0xE6; + pstDef->stDrc.bFilterMux = 0x1; + pstDef->stDrc.u32Svariance = 0x6; + pstDef->stDrc.u32BrightPr = 0xA0; + pstDef->stDrc.u32Contrast = 0xA0; + pstDef->stDrc.u32DarkEnhance = 0x9000; + + memcpy(&pstDef->stAgcTbl, &g_stIspAgcTable, sizeof(ISP_CMOS_AGC_TABLE_S)); + memcpy(&pstDef->stNoiseTbl, &g_stIspNoiseTable, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_stIspDemosaic, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stBayerSharpen, &g_stIspBayerSharpen, sizeof(ISP_CMOS_BAYER_SHARPEN_S)); + memcpy(&pstDef->stYuvSharpen, &g_stIspYuvSharpen, sizeof(ISP_CMOS_YUV_SHARPEN_S)); + memcpy(&pstDef->stGamma, &g_stIspGamma, sizeof(ISP_CMOS_GAMMA_S)); + break; + + case WDR_MODE_2To1_LINE: + pstDef->stDrc.bEnable = HI_TRUE; + pstDef->stDrc.u32BlackLevel = 0x00; + pstDef->stDrc.u32WhiteLevel = 0xB0000; + pstDef->stDrc.u32SlopeMax = 0x60; + pstDef->stDrc.u32SlopeMin = 0xD0; + pstDef->stDrc.u32VarianceSpace = 0x06; + pstDef->stDrc.u32VarianceIntensity = 0x08; + pstDef->stDrc.u32Asymmetry = 0x08; + pstDef->stDrc.u32BrightEnhance = 0xE6; + pstDef->stDrc.bFilterMux = 0x1; + pstDef->stDrc.u32Svariance = 0xC; + pstDef->stDrc.u32BrightPr = 0x94; + pstDef->stDrc.u32Contrast = 0x80; + pstDef->stDrc.u32DarkEnhance = 0x6000; + + pstDef->stWDRAttr.au32ExpRatio[0] = 0x400; + pstDef->stWDRAttr.au32ExpRatio[1] = 0x40; + pstDef->stWDRAttr.au32ExpRatio[2] = 0x40; + + memcpy(&pstDef->stAgcTbl, &g_stIspAgcTableFSWDR, sizeof(ISP_CMOS_AGC_TABLE_S)); + memcpy(&pstDef->stNoiseTbl, &g_stIspNoiseTableFSWDR, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_stIspDemosaicFSWDR, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stBayerSharpen, &g_stIspBayerSharpenFSWDR, sizeof(ISP_CMOS_BAYER_SHARPEN_S)); + memcpy(&pstDef->stYuvSharpen, &g_stIspYuvSharpenFSWDR, sizeof(ISP_CMOS_YUV_SHARPEN_S)); + memcpy(&pstDef->stGamma, &g_stIspGammaFSWDR, sizeof(ISP_CMOS_GAMMA_S)); + break; + + case WDR_MODE_3To1_LINE: + pstDef->stDrc.bEnable = HI_TRUE; + pstDef->stDrc.u32BlackLevel = 0x00; + pstDef->stDrc.u32WhiteLevel = 0xB0000; + pstDef->stDrc.u32SlopeMax = 0x60; + pstDef->stDrc.u32SlopeMin = 0xD0; + pstDef->stDrc.u32VarianceSpace = 0x06; + pstDef->stDrc.u32VarianceIntensity = 0x08; + pstDef->stDrc.u32Asymmetry = 0x08; + pstDef->stDrc.u32BrightEnhance = 0xE6; + pstDef->stDrc.bFilterMux = 0x1; + pstDef->stDrc.u32Svariance = 0xC; + pstDef->stDrc.u32BrightPr = 0x94; + pstDef->stDrc.u32Contrast = 0x80; + pstDef->stDrc.u32DarkEnhance = 0x6000; + + pstDef->stWDRAttr.au32ExpRatio[0] = 0x200; + pstDef->stWDRAttr.au32ExpRatio[1] = 0x200; + pstDef->stWDRAttr.au32ExpRatio[2] = 0x40; + + memcpy(&pstDef->stAgcTbl, &g_stIspAgcTableFSWDR, sizeof(ISP_CMOS_AGC_TABLE_S)); + memcpy(&pstDef->stNoiseTbl, &g_stIspNoiseTableFSWDR, sizeof(ISP_CMOS_NOISE_TABLE_S)); + memcpy(&pstDef->stDemosaic, &g_stIspDemosaicFSWDR, sizeof(ISP_CMOS_DEMOSAIC_S)); + memcpy(&pstDef->stBayerSharpen, &g_stIspBayerSharpenFSWDR, sizeof(ISP_CMOS_BAYER_SHARPEN_S)); + memcpy(&pstDef->stYuvSharpen, &g_stIspYuvSharpenFSWDR, sizeof(ISP_CMOS_YUV_SHARPEN_S)); + memcpy(&pstDef->stGamma, &g_stIspGammaFSWDR, sizeof(ISP_CMOS_GAMMA_S)); + break; + + } + + pstDef->stSensorMaxResolution.u32MaxWidth = 1920; + pstDef->stSensorMaxResolution.u32MaxHeight = 1080; + pstDef->stSensorMode.u32SensorID = IMX327_ID; + pstDef->stSensorMode.u8SensorMode = g_apstSnsState[IspDev]->u8ImgMode; + + return 0; +} + +HI_U32 cmos_get_isp_black_level(ISP_DEV IspDev,ISP_CMOS_BLACK_LEVEL_S *pstBlackLevel) +{ + HI_S32 i; + + if (HI_NULL == pstBlackLevel) + { + printf("null pointer when get isp black level value!\n"); + return -1; + } + + /* Don't need to update black level when iso change */ + pstBlackLevel->bUpdate = HI_FALSE; + + /* black level of linear mode */ + if (WDR_MODE_NONE == g_apstSnsState[IspDev]->enWDRMode) + { + for (i=0; i<4; i++) + { + pstBlackLevel->au16BlackLevel[i] = 0x3c; // 240 + } + } + + /* black level of DOL mode */ + else + { + pstBlackLevel->au16BlackLevel[0] = 0xF0; + pstBlackLevel->au16BlackLevel[1] = 0xF0; + pstBlackLevel->au16BlackLevel[2] = 0xF0; + pstBlackLevel->au16BlackLevel[3] = 0xF0; + } + + + return 0; + +} + +HI_VOID cmos_set_pixel_detect(ISP_DEV IspDev,HI_BOOL bEnable) +{ + + HI_U32 u32FullLines_5Fps, u32MaxIntTime_5Fps; + + if (WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + return; + } + + else if(WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + return; + } + + else + { + if (IMX327_SENSOR_1080P_30FPS_LINEAR_MODE == g_apstSnsState[IspDev]->u8ImgMode) + { + u32FullLines_5Fps = (IMX327_VMAX_1080P30_LINEAR * 30) / 5; + } + + else + { + return; + } + } + + //u32FullLines_5Fps = (u32FullLines_5Fps > IMX327_FULL_LINES_MAX) ? IMX327_FULL_LINES_MAX : u32FullLines_5Fps; + u32MaxIntTime_5Fps = 4; + + if (bEnable) /* setup for ISP pixel calibration mode */ + { + imx327_write_register (IspDev,IMX327_GAIN_ADDR,0x00); + + imx327_write_register (IspDev,IMX327_VMAX_ADDR, u32FullLines_5Fps & 0xFF); + imx327_write_register (IspDev,IMX327_VMAX_ADDR + 1, (u32FullLines_5Fps & 0xFF00) >> 8); + imx327_write_register (IspDev,IMX327_VMAX_ADDR + 2, (u32FullLines_5Fps & 0xF0000) >> 16); + + imx327_write_register (IspDev,IMX327_SHS1_ADDR, u32MaxIntTime_5Fps & 0xFF); + imx327_write_register (IspDev,IMX327_SHS1_ADDR + 1, (u32MaxIntTime_5Fps & 0xFF00) >> 8); + imx327_write_register (IspDev,IMX327_SHS1_ADDR + 2, (u32MaxIntTime_5Fps & 0xF0000) >> 16); + + } + else /* setup for ISP 'normal mode' */ + { + g_apstSnsState[IspDev]->u32FLStd = (g_apstSnsState[IspDev]->u32FLStd > 0x1FFFF) ? 0x1FFFF : g_apstSnsState[IspDev]->u32FLStd; + imx327_write_register (IspDev,IMX327_VMAX_ADDR, g_apstSnsState[IspDev]->u32FLStd & 0xFF); + imx327_write_register (IspDev,IMX327_VMAX_ADDR + 1, (g_apstSnsState[IspDev]->u32FLStd & 0xFF00) >> 8); + imx327_write_register (IspDev,IMX327_VMAX_ADDR + 2, (g_apstSnsState[IspDev]->u32FLStd & 0xF0000) >> 16); + g_apstSnsState[IspDev]->bSyncInit = HI_FALSE; + } + + return; +} + +HI_VOID cmos_set_wdr_mode(ISP_DEV IspDev,HI_U8 u8Mode) +{ + g_apstSnsState[IspDev]->bSyncInit = HI_FALSE; + + switch(u8Mode) + { + case WDR_MODE_NONE: + g_apstSnsState[IspDev]->enWDRMode = WDR_MODE_NONE; + g_apstSnsState[IspDev]->u32FLStd = IMX327_VMAX_1080P30_LINEAR; + g_apstSnsState[IspDev]->u8ImgMode = IMX327_SENSOR_1080P_30FPS_LINEAR_MODE; + g_astimx327State[IspDev].u8Hcg = 0x2; + printf("linear mode\n"); + break; + + case WDR_MODE_2To1_LINE: + g_apstSnsState[IspDev]->enWDRMode = WDR_MODE_2To1_LINE; + g_apstSnsState[IspDev]->u32FLStd = (IMX327_VMAX_1080P60TO30_WDR * 60) / 25; + g_apstSnsState[IspDev]->u8ImgMode = IMX327_SENSOR_1080P_30FPS_2t1_WDR_MODE; + g_astimx327State[IspDev].u32BRL = 1109; + g_astimx327State[IspDev].u8Hcg = 0x1; + printf("2to1 line WDR 1080p mode(60fps->30fps)\n"); + break; + + + case WDR_MODE_3To1_LINE: + g_apstSnsState[IspDev]->enWDRMode = WDR_MODE_3To1_LINE; + g_apstSnsState[IspDev]->u32FLStd = (IMX327_VMAX_1080P120TO30_WDR * 120) / 25; + g_apstSnsState[IspDev]->u8ImgMode = IMX327_SENSOR_1080P_30FPS_3t1_WDR_MODE; + g_astimx327State[IspDev].u32BRL = 1109; + g_astimx327State[IspDev].u8Hcg = 0x0; + printf("3to1 line WDR 1080p mode(120fps->30fps)\n"); + break; + + default: + printf("NOT support this mode!\n"); + return; + break; + } + + g_apstSnsState[IspDev]->au32FL[0]= g_apstSnsState[IspDev]->u32FLStd; + g_apstSnsState[IspDev]->au32FL[1] = g_apstSnsState[IspDev]->au32FL[0]; + memset(g_apstSnsState[IspDev]->au32WDRIntTime, 0, sizeof(g_apstSnsState[IspDev]->au32WDRIntTime)); + + return; +} + +HI_U32 cmos_get_sns_regs_info(ISP_DEV IspDev,ISP_SNS_REGS_INFO_S *pstSnsRegsInfo) +{ + HI_S32 i; + + if (HI_NULL == pstSnsRegsInfo) + { + printf("null pointer when get sns reg info!\n"); + return -1; + } + + if ((HI_FALSE == g_apstSnsState[IspDev]->bSyncInit) || (HI_FALSE == pstSnsRegsInfo->bConfig)) + { + g_apstSnsState[IspDev]->astRegsInfo[0].enSnsType = ISP_SNS_I2C_TYPE; + g_apstSnsState[IspDev]->astRegsInfo[0].unComBus.s8I2cDev = g_aunImx327BusInfo[IspDev].s8I2cDev; + g_apstSnsState[IspDev]->astRegsInfo[0].u8Cfg2ValidDelayMax = 2; + g_apstSnsState[IspDev]->astRegsInfo[0].u32RegNum = 8; + + if (WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->astRegsInfo[0].u32RegNum += 8; + g_apstSnsState[IspDev]->astRegsInfo[0].u8Cfg2ValidDelayMax = 2; + } + + else if ((WDR_MODE_2To1_FRAME_FULL_RATE == g_apstSnsState[IspDev]->enWDRMode) || (WDR_MODE_2To1_FRAME == g_apstSnsState[IspDev]->enWDRMode)) + { + g_apstSnsState[IspDev]->astRegsInfo[0].u32RegNum += 3; + g_apstSnsState[IspDev]->astRegsInfo[0].u8Cfg2ValidDelayMax = 2; + } + + else if (WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->astRegsInfo[0].u32RegNum += 14; + g_apstSnsState[IspDev]->astRegsInfo[0].u8Cfg2ValidDelayMax = 2; + } + + + for (i=0; iastRegsInfo[0].u32RegNum; i++) + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[i].bUpdate = HI_TRUE; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[i].u8DevAddr = imx327_i2c_addr; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[i].u32AddrByteNum = imx327_addr_byte; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[i].u32DataByteNum = imx327_data_byte; + } + + //Linear Mode Regs + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[0].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[0].u32RegAddr = IMX327_SHS1_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[1].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[1].u32RegAddr = IMX327_SHS1_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[2].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[2].u32RegAddr = IMX327_SHS1_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[3].u8DelayFrmNum = 0; //make shutter and gain effective at the same time + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[3].u32RegAddr = IMX327_GAIN_ADDR; //gain + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[4].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[4].u32RegAddr = IMX327_HCG_ADDR; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u32RegAddr = IMX327_VMAX_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u32RegAddr = IMX327_VMAX_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u32RegAddr = IMX327_VMAX_ADDR + 2; + + //DOL 2t1 Mode Regs + if (WDR_MODE_2To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[0].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[1].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[2].u8DelayFrmNum = 0; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u32RegAddr = IMX327_SHS2_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u32RegAddr = IMX327_SHS2_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u32RegAddr = IMX327_SHS2_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[8].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[8].u32RegAddr = IMX327_VMAX_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[9].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[9].u32RegAddr = IMX327_VMAX_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[10].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[10].u32RegAddr = IMX327_VMAX_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[11].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[11].u32RegAddr = IMX327_RHS1_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[12].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[12].u32RegAddr = IMX327_RHS1_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[13].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[13].u32RegAddr = IMX327_RHS1_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[14].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[14].u32RegAddr = IMX327_Y_OUT_SIZE_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[15].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[15].u32RegAddr = IMX327_Y_OUT_SIZE_ADDR + 1; + + } + + //DOL 3t1 Mode Regs + else if (WDR_MODE_3To1_LINE == g_apstSnsState[IspDev]->enWDRMode) + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[0].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[1].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[2].u8DelayFrmNum = 0; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[5].u32RegAddr = IMX327_SHS2_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[6].u32RegAddr = IMX327_SHS2_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[7].u32RegAddr = IMX327_SHS2_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[8].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[8].u32RegAddr = IMX327_VMAX_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[9].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[9].u32RegAddr = IMX327_VMAX_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[10].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[10].u32RegAddr = IMX327_VMAX_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[11].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[11].u32RegAddr = IMX327_RHS1_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[12].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[12].u32RegAddr = IMX327_RHS1_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[13].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[13].u32RegAddr = IMX327_RHS1_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[14].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[14].u32RegAddr = IMX327_RHS2_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[15].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[15].u32RegAddr = IMX327_RHS2_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[16].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[16].u32RegAddr = IMX327_RHS2_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[17].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[17].u32RegAddr = IMX327_SHS3_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[18].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[18].u32RegAddr = IMX327_SHS3_ADDR + 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[19].u8DelayFrmNum = 0; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[19].u32RegAddr = IMX327_SHS3_ADDR + 2; + + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[20].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[20].u32RegAddr = IMX327_Y_OUT_SIZE_ADDR; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[21].u8DelayFrmNum = 1; + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[21].u32RegAddr = IMX327_Y_OUT_SIZE_ADDR + 1; + + } + + g_apstSnsState[IspDev]->bSyncInit = HI_TRUE; + + + } + else + { + for (i=0; iastRegsInfo[0].u32RegNum; i++) + { + if (g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[i].u32Data == g_apstSnsState[IspDev]->astRegsInfo[1].astI2cData[i].u32Data) + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[i].bUpdate = HI_FALSE; + } + + else + { + g_apstSnsState[IspDev]->astRegsInfo[0].astI2cData[i].bUpdate = HI_TRUE; + } + } + } + + pstSnsRegsInfo->bConfig = HI_FALSE; + memcpy(pstSnsRegsInfo, &g_apstSnsState[IspDev]->astRegsInfo[0], sizeof(ISP_SNS_REGS_INFO_S)); + memcpy(&g_apstSnsState[IspDev]->astRegsInfo[1], &g_apstSnsState[IspDev]->astRegsInfo[0], sizeof(ISP_SNS_REGS_INFO_S)); + + g_apstSnsState[IspDev]->au32FL[1] = g_apstSnsState[IspDev]->au32FL[0]; + + return 0; +} + +HI_S32 cmos_set_image_mode(ISP_DEV IspDev,ISP_CMOS_SENSOR_IMAGE_MODE_S *pstSensorImageMode) +{ + HI_U8 u8SensorImageMode = g_apstSnsState[IspDev]->u8ImgMode; + + g_apstSnsState[IspDev]->bSyncInit = HI_FALSE; + + if (HI_NULL == pstSensorImageMode ) + { + printf("null pointer when set image mode\n"); + return -1; + } + + if ((pstSensorImageMode->u16Width <= 1920) && (pstSensorImageMode->u16Height <= 1080)) + { + } + else + { + printf("Not support! Width:%d, Height:%d, Fps:%f, WDRMode:%d\n", + pstSensorImageMode->u16Width, + pstSensorImageMode->u16Height, + pstSensorImageMode->f32Fps, + g_apstSnsState[IspDev]->enWDRMode); + + return -1; + } + + if ((HI_TRUE == g_apstSnsState[IspDev]->bInit) && (u8SensorImageMode == g_apstSnsState[IspDev]->u8ImgMode)) + { + /* Don't need to switch SensorImageMode */ + return -1; + } + + return 0; +} + +HI_VOID sensor_global_init(ISP_DEV IspDev) +{ + g_apstSnsState[IspDev]->bInit = HI_FALSE; + g_apstSnsState[IspDev]->bSyncInit = HI_FALSE; + g_apstSnsState[IspDev]->u8ImgMode = IMX327_SENSOR_1080P_30FPS_LINEAR_MODE; + g_apstSnsState[IspDev]->enWDRMode = WDR_MODE_NONE; + g_apstSnsState[IspDev]->u32FLStd = IMX327_VMAX_1080P30_LINEAR; + g_apstSnsState[IspDev]->au32FL[0] = IMX327_VMAX_1080P30_LINEAR; + g_apstSnsState[IspDev]->au32FL[1] = IMX327_VMAX_1080P30_LINEAR; + + memset(&g_apstSnsState[IspDev]->astRegsInfo[0], 0, sizeof(ISP_SNS_REGS_INFO_S)); + memset(&g_apstSnsState[IspDev]->astRegsInfo[1], 0, sizeof(ISP_SNS_REGS_INFO_S)); +} + +HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc) +{ + memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S)); + + pstSensorExpFunc->pfn_cmos_sensor_init = imx327_init; + pstSensorExpFunc->pfn_cmos_sensor_exit = imx327_exit; + pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init; + pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode; + pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode; + + pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default; + pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level; + pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect; + pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info; + + return 0; +} + +/**************************************************************************** + * callback structure * + ****************************************************************************/ + +int imx327_set_bus_info(ISP_DEV IspDev, ISP_SNS_COMMBUS_U unSNSBusInfo) +{ + g_aunImx327BusInfo[IspDev].s8I2cDev = unSNSBusInfo.s8I2cDev; + + return 0; +} + +int sensor_register_callback(ISP_DEV IspDev, ALG_LIB_S *pstAeLib, ALG_LIB_S *pstAwbLib) +{ + HI_S32 s32Ret; + ISP_SENSOR_REGISTER_S stIspRegister; + AE_SENSOR_REGISTER_S stAeRegister; + AWB_SENSOR_REGISTER_S stAwbRegister; + + cmos_init_sensor_exp_function(&stIspRegister.stSnsExp); + s32Ret = HI_MPI_ISP_SensorRegCallBack(IspDev, IMX327_ID, &stIspRegister); + if (s32Ret) + { + printf("sensor register callback function failed!\n"); + return s32Ret; + } + + cmos_init_ae_exp_function(&stAeRegister.stSnsExp); + s32Ret = HI_MPI_AE_SensorRegCallBack(IspDev, pstAeLib, IMX327_ID, &stAeRegister); + if (s32Ret) + { + printf("sensor register callback function to ae lib failed!\n"); + return s32Ret; + } + + cmos_init_awb_exp_function(&stAwbRegister.stSnsExp); + s32Ret = HI_MPI_AWB_SensorRegCallBack(IspDev, pstAwbLib, IMX327_ID, &stAwbRegister); + if (s32Ret) + { + printf("sensor register callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_unregister_callback(ISP_DEV IspDev, ALG_LIB_S *pstAeLib, ALG_LIB_S *pstAwbLib) +{ + HI_S32 s32Ret; + + s32Ret = HI_MPI_ISP_SensorUnRegCallBack(IspDev, IMX327_ID); + if (s32Ret) + { + printf("sensor unregister callback function failed!\n"); + return s32Ret; + } + + s32Ret = HI_MPI_AE_SensorUnRegCallBack(IspDev, pstAeLib, IMX327_ID); + if (s32Ret) + { + printf("sensor unregister callback function to ae lib failed!\n"); + return s32Ret; + } + + s32Ret = HI_MPI_AWB_SensorUnRegCallBack(IspDev, pstAwbLib, IMX327_ID); + if (s32Ret) + { + printf("sensor unregister callback function to awb lib failed!\n"); + return s32Ret; + } + + return 0; +} + +int sensor_set_init(ISP_DEV IspDev, ISP_INIT_ATTR_S *pstInitAttr) +{ + g_au32InitExposure[IspDev] = pstInitAttr->u32Exposure; + g_au32LinesPer500ms[IspDev] = pstInitAttr->u32LinesPer500ms; + g_au16InitWBGain[IspDev][0] = pstInitAttr->u16WBRgain; + g_au16InitWBGain[IspDev][1] = pstInitAttr->u16WBGgain; + g_au16InitWBGain[IspDev][2] = pstInitAttr->u16WBBgain; + g_au16SampleRgain[IspDev] = pstInitAttr->u16SampleRgain; + g_au16SampleBgain[IspDev] = pstInitAttr->u16SampleBgain; + + return 0; +} + +ISP_SNS_OBJ_S stSnsImx327Obj = +{ + .pfnRegisterCallback = sensor_register_callback, + .pfnUnRegisterCallback = sensor_unregister_callback, + .pfnStandby = imx327_standby, + .pfnRestart = imx327_restart, + .pfnWriteReg = imx327_write_register, + .pfnReadReg = imx327_read_register, + .pfnSetBusInfo = imx327_set_bus_info, + .pfnSetInit = sensor_set_init +}; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ + +#endif /* __IMX327_CMOS_H_ */ diff --git a/soc/hi3516av200/sensor/sony_imx327_mipi/imx327_sensor_ctl.c b/soc/hi3516av200/sensor/sony_imx327_mipi/imx327_sensor_ctl.c new file mode 100644 index 0000000..836b7fa --- /dev/null +++ b/soc/hi3516av200/sensor/sony_imx327_mipi/imx327_sensor_ctl.c @@ -0,0 +1,1364 @@ +#include +#include +#include +#include +#include +#include + +#include "hi_comm_video.h" +#include "hi_sns_ctrl.h" + +#ifdef HI_GPIO_I2C +#include "gpioi2c_ex.h" +#else +#include "hi_i2c.h" +#endif + +const unsigned char imx327_i2c_addr = 0x34; /* I2C Address of IMX327 */ +const unsigned int imx327_addr_byte = 2; +const unsigned int imx327_data_byte = 1; +static int g_fd[ISP_MAX_DEV_NUM] = {-1, -1}; + +extern ISP_SNS_STATE_S g_astimx327[ISP_MAX_DEV_NUM]; +extern ISP_SNS_COMMBUS_U g_aunImx327BusInfo[]; + + +//sensor fps mode +#define IMX327_SENSOR_1080P_30FPS_LINEAR_MODE (1) +#define IMX327_SENSOR_1080P_30FPS_3t1_WDR_MODE (2) +#define IMX327_SENSOR_1080P_30FPS_2t1_WDR_MODE (3) + +int imx327_i2c_init(ISP_DEV IspDev) +{ + char acDevFile[16] = {0}; + HI_U8 u8DevNum; + + if(g_fd[IspDev] >= 0) + { + return 0; + } +#ifdef HI_GPIO_I2C + int ret; + + g_fd[IspDev] = open("/dev/gpioi2c_ex", 0); + if(g_fd[IspDev] < 0) + { + printf("Open gpioi2c_ex error!\n"); + return -1; + } +#else + int ret; + + u8DevNum = g_aunImx327BusInfo[IspDev].s8I2cDev; + snprintf_s(acDevFile, sizeof(acDevFile), sizeof(acDevFile)-1, "/dev/i2c-%d", u8DevNum); + + g_fd[IspDev] = open(acDevFile, O_RDWR); + if(g_fd[IspDev] < 0) + { + printf("Open /dev/i2c-%d error!\n", IspDev); + return -1; + } + + ret = ioctl(g_fd[IspDev], I2C_SLAVE_FORCE, (imx327_i2c_addr>>1)); + if (ret < 0) + { + printf("CMD_SET_DEV error!\n"); + return ret; + } +#endif + + return 0; +} + +int imx327_i2c_exit(ISP_DEV IspDev) +{ + if (g_fd[IspDev] >= 0) + { + close(g_fd[IspDev]); + g_fd[IspDev] = -1; + return 0; + } + return -1; +} + +int imx327_read_register(ISP_DEV IspDev,int addr) +{ + // TODO: + + return 0; +} + +#ifdef __HuaweiLite__ +int imx327_write_register(ISP_DEV IspDev,int addr, int data) +{ + if (0 > g_fd[IspDev]) + { + return 0; + } +#ifdef HI_GPIO_I2C + i2c_data.dev_addr = imx327_i2c_addr; + i2c_data.reg_addr = addr; + i2c_data.addr_byte_num = imx327_addr_byte; + i2c_data.data = data; + i2c_data.data_byte_num = imx327_data_byte; + ret = ioctl(g_fd[IspDev], GPIO_I2C_WRITE, &i2c_data); + if (ret) + { + printf("GPIO-I2C write faild!\n"); + return ret; + } +#else + int idx = 0; + int ret; + char buf[8]; + buf[idx++] = addr & 0xff; + if (imx327_addr_byte == 2) + { + ret = ioctl(g_fd[IspDev], I2C_16BIT_REG, 1); + buf[idx++] = (addr >> 8) & 0xff; + } + else + { + //ret = ioctl(g_fd[IspDev], I2C_16BIT_REG, 0); + } + buf[idx++] = data & 0xff; + if (imx327_data_byte == 2) + { + //ret = ioctl(g_fd[IspDev], I2C_16BIT_DATA, 1); + //buf[idx++] = (data >> 8) & 0xff; + } + else + { + ret = ioctl(g_fd[IspDev], I2C_16BIT_DATA, 0); + } + ret = write(g_fd[IspDev], buf, imx327_addr_byte + imx327_data_byte); + if(ret < 0) + { + printf("I2C_WRITE error!\n"); + return -1; + } +#endif + return 0; +} +#else +int imx327_write_register(ISP_DEV IspDev,int addr, int data) +{ + if (0 > g_fd[IspDev]) + { + return 0; + } + +#ifdef HI_GPIO_I2C + i2c_data.dev_addr = imx327_i2c_addr; + i2c_data.reg_addr = addr; + i2c_data.addr_byte_num = imx327_addr_byte; + i2c_data.data = data; + i2c_data.data_byte_num = imx327_data_byte; + + ret = ioctl(g_fd[IspDev], GPIO_I2C_WRITE, &i2c_data); + + if (ret) + { + printf("GPIO-I2C write faild!\n"); + return ret; + } +#else + int idx = 0; + int ret; + char buf[8]; + + if (imx327_addr_byte == 2) + { + buf[idx] = (addr >> 8) & 0xff; + idx++; + buf[idx] = addr & 0xff; + idx++; + } + else + { + //buf[idx] = addr & 0xff; + //idx++; + } + + if (imx327_data_byte == 2) + { + //buf[idx] = (data >> 8) & 0xff; + //idx++; + //buf[idx] = data & 0xff; + //idx++; + } + else + { + buf[idx] = data & 0xff; + idx++; + } + + ret = write(g_fd[IspDev], buf, imx327_addr_byte + imx327_data_byte); + if(ret < 0) + { + printf("I2C_WRITE error!\n"); + return -1; + } + +#endif + return 0; +} +#endif + +static void delay_ms(int ms) { + hi_usleep(ms*1000); +} + +void imx327_prog(ISP_DEV IspDev,int* rom) +{ + int i = 0; + while (1) { + int lookup = rom[i++]; + int addr = (lookup >> 16) & 0xFFFF; + int data = lookup & 0xFFFF; + if (addr == 0xFFFE) { + delay_ms(data); + } else if (addr == 0xFFFF) { + return; + } else { + imx327_write_register(IspDev,addr, data); + } + } +} + +void imx327_standby(ISP_DEV IspDev) +{ + // TODO: + return; +} + +void imx327_restart(ISP_DEV IspDev) +{ + // TODO: + return; +} + +void imx327_wdr_1080p30_2to1_init(ISP_DEV IspDev); +void imx327_wdr_1080p60_2to1_init(ISP_DEV IspDev); +void imx327_wdr_1080p120_2to1_init(ISP_DEV IspDev); +void imx327_wdr_720p60_2to1_init(ISP_DEV IspDev); +void imx327_wdr_1080p30_3to1_init(ISP_DEV IspDev); +void imx327_wdr_1080p120_3to1_init(ISP_DEV IspDev); +void imx327_wdr_720p60_3to1_init(ISP_DEV IspDev); +void imx327_linear_1080p30_init(ISP_DEV IspDev); + + +void imx327_init(ISP_DEV IspDev) +{ + HI_U32 i; + WDR_MODE_E enWDRMode; + HI_BOOL bInit; + + bInit = g_astimx327[IspDev].bInit; + enWDRMode = g_astimx327[IspDev].enWDRMode; + imx327_i2c_init(IspDev); + + /* When sensor first init, config all registers */ + if (HI_FALSE == bInit) + { + if (WDR_MODE_2To1_LINE == enWDRMode) + { + imx327_wdr_1080p60_2to1_init(IspDev); + } + else if (WDR_MODE_3To1_LINE == enWDRMode) + { + imx327_wdr_1080p120_3to1_init(IspDev); + } + else + { + imx327_linear_1080p30_init(IspDev); + } + } + /* When sensor switch mode(linear<->WDR or resolution), config different registers(if possible) */ + else + { + if(WDR_MODE_2To1_LINE == enWDRMode) + { + imx327_wdr_1080p60_2to1_init(IspDev); + } + + else if(WDR_MODE_3To1_LINE == enWDRMode) + { + imx327_wdr_1080p120_3to1_init(IspDev); + } + + else + { + imx327_linear_1080p30_init(IspDev); + } + } + + for (i=0; i15fps) init success!=====\n"); + + return; + +} + +void imx327_wdr_1080p60_2to1_init(ISP_DEV IspDev) +{ + #if 0 + imx327_write_register (IspDev,0x3000, 0x01); /* standby */ + imx327_write_register (IspDev,0x3002, 0x00); /* XTMSTA */ + + imx327_write_register (IspDev,0x3005, 0x01); + imx327_write_register (IspDev,0x3007, 0x00); + imx327_write_register (IspDev,0x3009, 0x01); + imx327_write_register (IspDev,0x300a, 0xf0); + imx327_write_register (IspDev,0x300c, 0x11); + imx327_write_register (IspDev,0x300f, 0x00); + imx327_write_register (IspDev,0x3010, 0x21); + imx327_write_register (IspDev,0x3012, 0x64); + imx327_write_register (IspDev,0x3016, 0x09); + imx327_write_register (IspDev,0x3018, 0x65); + imx327_write_register (IspDev,0x3019, 0x04); + + imx327_write_register (IspDev,0x301c, 0x98); /* HMAX */ + imx327_write_register (IspDev,0x301d, 0x08); /* HMAX */ + + imx327_write_register (IspDev,0x3045, 0x05); + imx327_write_register (IspDev,0x3046, 0x01); + imx327_write_register (IspDev,0x304b, 0x0a); + + imx327_write_register (IspDev,0x305c, 0x18); + imx327_write_register (IspDev,0x305d, 0x03); + imx327_write_register (IspDev,0x305e, 0x20); + imx327_write_register (IspDev,0x305f, 0x01); + + imx327_write_register (IspDev,0x3070, 0x02); + imx327_write_register (IspDev,0x3071, 0x11); + + imx327_write_register (IspDev,0x309b, 0x10); + imx327_write_register (IspDev,0x309c, 0x22); + + imx327_write_register (IspDev,0x30a2, 0x02); + imx327_write_register (IspDev,0x30a6, 0x20); + imx327_write_register (IspDev,0x30a8, 0x20); + + imx327_write_register (IspDev,0x30aa, 0x20); + imx327_write_register (IspDev,0x30ac, 0x20); + imx327_write_register (IspDev,0x30b0, 0x43); + + imx327_write_register (IspDev,0x3106, 0x11); + imx327_write_register (IspDev,0x3119, 0x9e); + imx327_write_register (IspDev,0x311c, 0x1e); + imx327_write_register (IspDev,0x311e, 0x08); + + imx327_write_register (IspDev,0x3128, 0x05); + imx327_write_register (IspDev,0x3129, 0x00); + imx327_write_register (IspDev,0x313d, 0x83); + imx327_write_register (IspDev,0x3150, 0x03); + + imx327_write_register (IspDev,0x315e, 0x1a); + imx327_write_register (IspDev,0x3164, 0x1a); + imx327_write_register (IspDev,0x317c, 0x00); + imx327_write_register (IspDev,0x317e, 0x00); + imx327_write_register (IspDev,0x31ec, 0x00); + + imx327_write_register (IspDev,0x32b8, 0x50); + imx327_write_register (IspDev,0x32b9, 0x10); + imx327_write_register (IspDev,0x32ba, 0x00); + imx327_write_register (IspDev,0x32bb, 0x04); + + imx327_write_register (IspDev,0x32c8, 0x50); + imx327_write_register (IspDev,0x32c9, 0x10); + imx327_write_register (IspDev,0x32ca, 0x00); + imx327_write_register (IspDev,0x32cb, 0x04); + + imx327_write_register (IspDev,0x332c, 0xd3); + imx327_write_register (IspDev,0x332d, 0x10); + imx327_write_register (IspDev,0x332e, 0x0d); + + imx327_write_register (IspDev,0x3358, 0x06); + imx327_write_register (IspDev,0x3359, 0xe1); + imx327_write_register (IspDev,0x335a, 0x11); + + imx327_write_register (IspDev,0x3360, 0x1e); + imx327_write_register (IspDev,0x3361, 0x61); + imx327_write_register (IspDev,0x3362, 0x10); + + imx327_write_register (IspDev,0x33b0, 0x50); + imx327_write_register (IspDev,0x33b2, 0x1a); + imx327_write_register (IspDev,0x33b3, 0x04); + + imx327_write_register (IspDev,0x3405, 0x10); + imx327_write_register (IspDev,0x3407, 0x03); + imx327_write_register (IspDev,0x3414, 0x0a); + imx327_write_register (IspDev,0x3415, 0x00); + imx327_write_register (IspDev,0x3418, 0xb2); + imx327_write_register (IspDev,0x3419, 0x08); + + imx327_write_register (IspDev,0x3441, 0x0c); + imx327_write_register (IspDev,0x3442, 0x0c); + imx327_write_register (IspDev,0x3443, 0x03); + imx327_write_register (IspDev,0x3444, 0x20); + imx327_write_register (IspDev,0x3445, 0x25); + imx327_write_register (IspDev,0x3446, 0x57); + imx327_write_register (IspDev,0x3447, 0x00); + imx327_write_register (IspDev,0x3448, 0x37); + imx327_write_register (IspDev,0x3449, 0x00); + imx327_write_register (IspDev,0x344a, 0x1f); + + imx327_write_register (IspDev,0x344b, 0x00); + imx327_write_register (IspDev,0x344c, 0x1f); + imx327_write_register (IspDev,0x344d, 0x00); + imx327_write_register (IspDev,0x344e, 0x1f); + imx327_write_register (IspDev,0x344f, 0x00); + imx327_write_register (IspDev,0x3450, 0x77); + imx327_write_register (IspDev,0x3451, 0x00); + imx327_write_register (IspDev,0x3452, 0x1f); + imx327_write_register (IspDev,0x3453, 0x00); + imx327_write_register (IspDev,0x3454, 0x17); + imx327_write_register (IspDev,0x3455, 0x00); + imx327_write_register (IspDev,0x3472, 0x9c); + imx327_write_register (IspDev,0x3473, 0x07); + imx327_write_register (IspDev,0x3480, 0x49); + + imx327_write_register (IspDev,0x3000, 0x00); /* standby */ + delay_ms(20); + imx327_write_register (IspDev,0x3002, 0x00); /* master mode start */ + + printf("===Imx327 sensor 1080P30fps 12bit 2to1 WDR(60fps->30fps) init success!=====\n"); + + bSensorInit = HI_TRUE; + + return; + #endif + imx327_write_register (IspDev,0x3000, 0x01); /* standby */ + imx327_write_register (IspDev,0x3002, 0x01); /* XTMSTA */ + + imx327_write_register (IspDev,0x3005, 0x00); + imx327_write_register (IspDev,0x3007, 0x00); + imx327_write_register (IspDev,0x3009, 0x01); + imx327_write_register (IspDev,0x300a, 0x3c); + imx327_write_register (IspDev,0x300c, 0x11); + imx327_write_register (IspDev,0x300f, 0x00); + imx327_write_register (IspDev,0x3010, 0x21); + imx327_write_register (IspDev,0x3012, 0x64); + imx327_write_register (IspDev,0x3016, 0x09); + imx327_write_register (IspDev,0x3018, 0xC4); /* VMAX */ + imx327_write_register (IspDev,0x3019, 0x04); /* VMAX */ + imx327_write_register (IspDev,0x301c, 0xEC); /* HMAX */ + imx327_write_register (IspDev,0x301d, 0x07); /* HMAX */ + +#if 1 + imx327_write_register (IspDev,0x3020, 0x03); /* SHS1 */ + imx327_write_register (IspDev,0x3021, 0x00); + //imx327_write_register (IspDev,0x3022, 0x00); + imx327_write_register (IspDev,0x3024, 0x99); /* SHS2 */ + imx327_write_register (IspDev,0x3025, 0x00); + //imx327_write_register (IspDev,0x3025, 0x00); + imx327_write_register (IspDev,0x3028, 0x00); /* SHS3 */ + imx327_write_register (IspDev,0x3029, 0x00); + //imx327_write_register (IspDev,0x302A, 0x00); + imx327_write_register (IspDev,0x3030, 0x93); /* RHS1 */ + imx327_write_register (IspDev,0x3031, 0x00); + imx327_write_register (IspDev,0x3034, 0x00); /* RHS2 */ + imx327_write_register (IspDev,0x3035, 0x00); +#endif + + imx327_write_register (IspDev,0x3045, 0x05); + imx327_write_register (IspDev,0x3046, 0x00); + imx327_write_register (IspDev,0x304b, 0x0a); + imx327_write_register (IspDev,0x305c, 0x18); + imx327_write_register (IspDev,0x305d, 0x03); + imx327_write_register (IspDev,0x305e, 0x20); + imx327_write_register (IspDev,0x305f, 0x01); + imx327_write_register (IspDev,0x3070, 0x02); + imx327_write_register (IspDev,0x3071, 0x11); + imx327_write_register (IspDev,0x309b, 0x10); + imx327_write_register (IspDev,0x309c, 0x22); + imx327_write_register (IspDev,0x30a2, 0x02); + imx327_write_register (IspDev,0x30a6, 0x20); + imx327_write_register (IspDev,0x30a8, 0x20); + imx327_write_register (IspDev,0x30aa, 0x20); + imx327_write_register (IspDev,0x30ac, 0x20); + imx327_write_register (IspDev,0x30b0, 0x43); + + imx327_write_register (IspDev,0x3106, 0x11); + imx327_write_register (IspDev,0x3119, 0x9e); + imx327_write_register (IspDev,0x311c, 0x1e); + imx327_write_register (IspDev,0x311e, 0x08); + imx327_write_register (IspDev,0x3128, 0x05); + imx327_write_register (IspDev,0x3129, 0x1d); + imx327_write_register (IspDev,0x313d, 0x83); + imx327_write_register (IspDev,0x3150, 0x03); + imx327_write_register (IspDev,0x315e, 0x1a); + imx327_write_register (IspDev,0x3164, 0x1a); + imx327_write_register (IspDev,0x317c, 0x12); + imx327_write_register (IspDev,0x317e, 0x00); + imx327_write_register (IspDev,0x31ec, 0x37); + + imx327_write_register (IspDev,0x32b8, 0x50); + imx327_write_register (IspDev,0x32b9, 0x10); + imx327_write_register (IspDev,0x32ba, 0x00); + imx327_write_register (IspDev,0x32bb, 0x04); + imx327_write_register (IspDev,0x32c8, 0x50); + imx327_write_register (IspDev,0x32c9, 0x10); + imx327_write_register (IspDev,0x32ca, 0x00); + imx327_write_register (IspDev,0x32cb, 0x04); + + imx327_write_register (IspDev,0x332c, 0xd3); + imx327_write_register (IspDev,0x332d, 0x10); + imx327_write_register (IspDev,0x332e, 0x0d); + imx327_write_register (IspDev,0x3358, 0x06); + imx327_write_register (IspDev,0x3359, 0xe1); + imx327_write_register (IspDev,0x335a, 0x11); + imx327_write_register (IspDev,0x3360, 0x1e); + imx327_write_register (IspDev,0x3361, 0x61); + imx327_write_register (IspDev,0x3362, 0x10); + imx327_write_register (IspDev,0x33b0, 0x50); + imx327_write_register (IspDev,0x33b2, 0x1a); + imx327_write_register (IspDev,0x33b3, 0x04); + + imx327_write_register (IspDev,0x3405, 0x10); + imx327_write_register (IspDev,0x3407, 0x03); + imx327_write_register (IspDev,0x3414, 0x0a); + imx327_write_register (IspDev,0x3415, 0x00); + imx327_write_register (IspDev,0x3418, 0x32); /* Y_OUT_SIZE */ + imx327_write_register (IspDev,0x3419, 0x09); /* Y_OUT_SIZE */ + imx327_write_register (IspDev,0x3441, 0x0a); + imx327_write_register (IspDev,0x3442, 0x0a); + imx327_write_register (IspDev,0x3443, 0x03); + imx327_write_register (IspDev,0x3444, 0x20); + imx327_write_register (IspDev,0x3445, 0x25); + imx327_write_register (IspDev,0x3446, 0x57); + imx327_write_register (IspDev,0x3447, 0x00); + imx327_write_register (IspDev,0x3448, 0x37); + imx327_write_register (IspDev,0x3449, 0x00); + imx327_write_register (IspDev,0x344a, 0x1f); + imx327_write_register (IspDev,0x344b, 0x00); + imx327_write_register (IspDev,0x344c, 0x1f); + imx327_write_register (IspDev,0x344d, 0x00); + imx327_write_register (IspDev,0x344e, 0x1f); + imx327_write_register (IspDev,0x344f, 0x00); + imx327_write_register (IspDev,0x3450, 0x77); + imx327_write_register (IspDev,0x3451, 0x00); + imx327_write_register (IspDev,0x3452, 0x1f); + imx327_write_register (IspDev,0x3453, 0x00); + imx327_write_register (IspDev,0x3454, 0x17); + imx327_write_register (IspDev,0x3455, 0x00); + imx327_write_register (IspDev,0x3472, 0x9c); + imx327_write_register (IspDev,0x3473, 0x07); + imx327_write_register (IspDev,0x3480, 0x49); + + imx327_write_register (IspDev,0x3000, 0x00); /* standby */ + delay_ms(20); + imx327_write_register (IspDev,0x3002, 0x00); /* master mode start */ + + printf("===Imx327 sensor 1080P30fps 10bit 2to1 WDR(60fps->30fps) init success!=====\n"); + + return; + +} + +void imx327_wdr_1080p30_3to1_init(ISP_DEV IspDev) +{ + imx327_write_register (IspDev,0x3000, 0x01); /* standby */ + imx327_write_register (IspDev,0x3002, 0x01); /* XTMSTA */ + + //12bit + imx327_write_register (IspDev,0x3007, 0x00); + imx327_write_register (IspDev,0x300c, 0x21); + imx327_write_register (IspDev,0x300f, 0x00); + imx327_write_register (IspDev,0x3010, 0x21); + imx327_write_register (IspDev,0x3012, 0x64); + imx327_write_register (IspDev,0x3016, 0x09); + imx327_write_register (IspDev,0x3020, 0x04); + imx327_write_register (IspDev,0x3021, 0x00); + imx327_write_register (IspDev,0x3024, 0xF2); + imx327_write_register (IspDev,0x3025, 0x01); + imx327_write_register (IspDev,0x3028, 0x57); + imx327_write_register (IspDev,0x3029, 0x02); + imx327_write_register (IspDev,0x3030, 0xED); + imx327_write_register (IspDev,0x3031, 0x01); + imx327_write_register (IspDev,0x3034, 0x30); + imx327_write_register (IspDev,0x3035, 0x02); + imx327_write_register (IspDev,0x3045, 0x05); + imx327_write_register (IspDev,0x304b, 0x0a); + imx327_write_register (IspDev,0x305c, 0x18); + imx327_write_register (IspDev,0x305d, 0x03); + imx327_write_register (IspDev,0x305e, 0x20); + imx327_write_register (IspDev,0x305f, 0x01); + imx327_write_register (IspDev,0x3070, 0x02); + imx327_write_register (IspDev,0x3071, 0x11); + imx327_write_register (IspDev,0x309b, 0x10); + imx327_write_register (IspDev,0x309c, 0x22); + imx327_write_register (IspDev,0x30a2, 0x02); + imx327_write_register (IspDev,0x30a6, 0x20); + imx327_write_register (IspDev,0x30a8, 0x20); + imx327_write_register (IspDev,0x30aa, 0x20); + imx327_write_register (IspDev,0x30ac, 0x20); + imx327_write_register (IspDev,0x30b0, 0x43); + imx327_write_register (IspDev,0x3106, 0x33); + imx327_write_register (IspDev,0x3119, 0x9e); + imx327_write_register (IspDev,0x311c, 0x1e); + imx327_write_register (IspDev,0x311e, 0x08); + imx327_write_register (IspDev,0x3128, 0x05); + imx327_write_register (IspDev,0x313d, 0x83); + imx327_write_register (IspDev,0x3150, 0x03); + imx327_write_register (IspDev,0x315e, 0x1a); + imx327_write_register (IspDev,0x3164, 0x1a); + imx327_write_register (IspDev,0x317e, 0x00); + imx327_write_register (IspDev,0x32b8, 0x50); + imx327_write_register (IspDev,0x32b9, 0x10); + imx327_write_register (IspDev,0x32ba, 0x00); + imx327_write_register (IspDev,0x32bb, 0x04); + imx327_write_register (IspDev,0x32c8, 0x50); + imx327_write_register (IspDev,0x32c9, 0x10); + imx327_write_register (IspDev,0x32ca, 0x00); + imx327_write_register (IspDev,0x32cb, 0x04); + imx327_write_register (IspDev,0x332c, 0xd3); + imx327_write_register (IspDev,0x332d, 0x10); + imx327_write_register (IspDev,0x332e, 0x0d); + imx327_write_register (IspDev,0x3358, 0x06); + imx327_write_register (IspDev,0x3359, 0xe1); + imx327_write_register (IspDev,0x335a, 0x11); + imx327_write_register (IspDev,0x3360, 0x1e); + imx327_write_register (IspDev,0x3361, 0x61); + imx327_write_register (IspDev,0x3362, 0x10); + imx327_write_register (IspDev,0x33b0, 0x50); + imx327_write_register (IspDev,0x33b2, 0x1a); + imx327_write_register (IspDev,0x33b3, 0x04); + + imx327_write_register (IspDev,0x3418, 0x24); /**** Y_OUT_SIZE *****/ + imx327_write_register (IspDev,0x3419, 0x0F); + + imx327_write_register (IspDev,0x3444, 0x20); + imx327_write_register (IspDev,0x3445, 0x25); + imx327_write_register (IspDev,0x3480, 0x49); + + imx327_write_register (IspDev,0x3000, 0x00); /* standby */ + delay_ms(20); + imx327_write_register (IspDev,0x3002, 0x00); /* master mode start */ + + printf("===Imx327 imx327 1080P15fps 12bit 3to1 WDR(30fps->7p5fps) init success!=====\n"); + + return; + +} + +void imx327_wdr_720p60_2to1_init(ISP_DEV IspDev) +{ + imx327_write_register (IspDev,0x3000, 0x01); /* standby */ + imx327_write_register (IspDev,0x3002, 0x01); /* XTMSTA */ + + //12bit + imx327_write_register (IspDev,0x3005, 0x01); + imx327_write_register (IspDev,0x3007, 0x10); + imx327_write_register (IspDev,0x3009, 0x01); + imx327_write_register (IspDev,0x300a, 0xf0); + imx327_write_register (IspDev,0x300c, 0x11); + imx327_write_register (IspDev,0x300f, 0x00); + imx327_write_register (IspDev,0x3010, 0x21); + imx327_write_register (IspDev,0x3012, 0x64); + imx327_write_register (IspDev,0x3016, 0x09); + imx327_write_register (IspDev,0x3018, 0xee); + imx327_write_register (IspDev,0x3019, 0x02); + imx327_write_register (IspDev,0x301c, 0xe4); + imx327_write_register (IspDev,0x301d, 0x0c); + imx327_write_register (IspDev,0x3045, 0x05); + imx327_write_register (IspDev,0x3046, 0x01); + imx327_write_register (IspDev,0x304b, 0x0a); + + imx327_write_register (IspDev,0x305c, 0x20); //INCKSEL1 + imx327_write_register (IspDev,0x305d, 0x03); //INCKSEL2 + imx327_write_register (IspDev,0x305e, 0x20); //INCKSEL3 + imx327_write_register (IspDev,0x305f, 0x01); //INCKSEL4 + + imx327_write_register (IspDev,0x3070, 0x02); + imx327_write_register (IspDev,0x3071, 0x11); + imx327_write_register (IspDev,0x309b, 0x10); + imx327_write_register (IspDev,0x309c, 0x22); + imx327_write_register (IspDev,0x30a2, 0x02); + imx327_write_register (IspDev,0x30a6, 0x20); + imx327_write_register (IspDev,0x30a8, 0x20); + imx327_write_register (IspDev,0x30aa, 0x20); + imx327_write_register (IspDev,0x30ac, 0x20); + imx327_write_register (IspDev,0x30b0, 0x43); + + //Add + imx327_write_register (IspDev,0x3106, 0x11); + + imx327_write_register (IspDev,0x3119, 0x9e); + imx327_write_register (IspDev,0x311c, 0x1e); + imx327_write_register (IspDev,0x311e, 0x08); + imx327_write_register (IspDev,0x3128, 0x05); + imx327_write_register (IspDev,0x3129, 0x00); + imx327_write_register (IspDev,0x313d, 0x83); + imx327_write_register (IspDev,0x3150, 0x03); + imx327_write_register (IspDev,0x315e, 0x1a); + imx327_write_register (IspDev,0x3164, 0x1a); + imx327_write_register (IspDev,0x317c, 0x00); + imx327_write_register (IspDev,0x317e, 0x00); + imx327_write_register (IspDev,0x31ec, 0x00); + + imx327_write_register (IspDev,0x32b8, 0x50); + imx327_write_register (IspDev,0x32b9, 0x10); + imx327_write_register (IspDev,0x32ba, 0x00); + imx327_write_register (IspDev,0x32bb, 0x04); + imx327_write_register (IspDev,0x32c8, 0x50); + imx327_write_register (IspDev,0x32c9, 0x10); + imx327_write_register (IspDev,0x32ca, 0x00); + imx327_write_register (IspDev,0x32cb, 0x04); + + imx327_write_register (IspDev,0x332c, 0xd3); + imx327_write_register (IspDev,0x332d, 0x10); + imx327_write_register (IspDev,0x332e, 0x0d); + imx327_write_register (IspDev,0x3358, 0x06); + imx327_write_register (IspDev,0x3359, 0xe1); + imx327_write_register (IspDev,0x335a, 0x11); + imx327_write_register (IspDev,0x3360, 0x1e); + imx327_write_register (IspDev,0x3361, 0x61); + imx327_write_register (IspDev,0x3362, 0x10); + imx327_write_register (IspDev,0x33b0, 0x50); + imx327_write_register (IspDev,0x33b2, 0x1a); + imx327_write_register (IspDev,0x33b3, 0x04); + + imx327_write_register (IspDev,0x3405, 0x10); + imx327_write_register (IspDev,0x3407, 0x03); + imx327_write_register (IspDev,0x3414, 0x04); + imx327_write_register (IspDev,0x3418, 0xc6); + imx327_write_register (IspDev,0x3419, 0x05); + imx327_write_register (IspDev,0x3441, 0x0c); + imx327_write_register (IspDev,0x3442, 0x0c); + imx327_write_register (IspDev,0x3443, 0x03); + imx327_write_register (IspDev,0x3444, 0x20); + imx327_write_register (IspDev,0x3445, 0x25); + imx327_write_register (IspDev,0x3446, 0x4f); + imx327_write_register (IspDev,0x3447, 0x00); + imx327_write_register (IspDev,0x3448, 0x2f); + imx327_write_register (IspDev,0x3449, 0x00); + imx327_write_register (IspDev,0x344a, 0x17); + imx327_write_register (IspDev,0x344b, 0x00); + imx327_write_register (IspDev,0x344c, 0x17); + imx327_write_register (IspDev,0x344d, 0x00); + imx327_write_register (IspDev,0x344e, 0x17); + imx327_write_register (IspDev,0x344f, 0x00); + imx327_write_register (IspDev,0x3450, 0x57); + imx327_write_register (IspDev,0x3451, 0x00); + imx327_write_register (IspDev,0x3452, 0x17); + imx327_write_register (IspDev,0x3453, 0x00); + imx327_write_register (IspDev,0x3454, 0x17); + imx327_write_register (IspDev,0x3455, 0x00); + imx327_write_register (IspDev,0x3472, 0x1c); + imx327_write_register (IspDev,0x3473, 0x05); + imx327_write_register (IspDev,0x3480, 0x49); + + imx327_write_register (IspDev,0x3000, 0x00); /* standby */ + delay_ms(20); + imx327_write_register (IspDev,0x3002, 0x00); /* master mode start */ + + printf("===Imx327 imx327 720P30fps 12bit 2to1 WDR(60fps->30fps) init success!=====\n"); + + return; +} + +void imx327_wdr_720p60_3to1_init(ISP_DEV IspDev) +{ + imx327_write_register (IspDev,0x3000, 0x01); /* standby */ + imx327_write_register (IspDev,0x3002, 0x01); /* XTMSTA */ + + //12bit + imx327_write_register (IspDev,0x3005, 0x01); + imx327_write_register (IspDev,0x3007, 0x10); + imx327_write_register (IspDev,0x3009, 0x01); + imx327_write_register (IspDev,0x300a, 0xf0); + imx327_write_register (IspDev,0x300c, 0x31); + imx327_write_register (IspDev,0x300f, 0x00); + imx327_write_register (IspDev,0x3010, 0x21); + imx327_write_register (IspDev,0x3012, 0x64); + imx327_write_register (IspDev,0x3016, 0x09); + imx327_write_register (IspDev,0x3018, 0xee); + imx327_write_register (IspDev,0x3019, 0x02); + imx327_write_register (IspDev,0x301c, 0xe4); + imx327_write_register (IspDev,0x301d, 0x0c); + imx327_write_register (IspDev,0x3045, 0x05); + imx327_write_register (IspDev,0x3046, 0x01); + imx327_write_register (IspDev,0x304b, 0x0a); + + imx327_write_register (IspDev,0x305c, 0x20); //INCKSEL1 + imx327_write_register (IspDev,0x305d, 0x03); //INCKSEL2 + imx327_write_register (IspDev,0x305e, 0x20); //INCKSEL3 + imx327_write_register (IspDev,0x305f, 0x01); //INCKSEL4 + + imx327_write_register (IspDev,0x3070, 0x02); + imx327_write_register (IspDev,0x3071, 0x11); + imx327_write_register (IspDev,0x309b, 0x10); + imx327_write_register (IspDev,0x309c, 0x22); + imx327_write_register (IspDev,0x30a2, 0x02); + imx327_write_register (IspDev,0x30a6, 0x20); + imx327_write_register (IspDev,0x30a8, 0x20); + imx327_write_register (IspDev,0x30aa, 0x20); + imx327_write_register (IspDev,0x30ac, 0x20); + imx327_write_register (IspDev,0x30b0, 0x43); + + //Add + imx327_write_register (IspDev,0x3106, 0x33); + + imx327_write_register (IspDev,0x3119, 0x9e); + imx327_write_register (IspDev,0x311c, 0x1e); + imx327_write_register (IspDev,0x311e, 0x08); + imx327_write_register (IspDev,0x3128, 0x05); + imx327_write_register (IspDev,0x3129, 0x00); + imx327_write_register (IspDev,0x313d, 0x83); + imx327_write_register (IspDev,0x3150, 0x03); + imx327_write_register (IspDev,0x315e, 0x1a); + imx327_write_register (IspDev,0x3164, 0x1a); + imx327_write_register (IspDev,0x317c, 0x00); + imx327_write_register (IspDev,0x317e, 0x00); + imx327_write_register (IspDev,0x31ec, 0x00); + + imx327_write_register (IspDev,0x32b8, 0x50); + imx327_write_register (IspDev,0x32b9, 0x10); + imx327_write_register (IspDev,0x32ba, 0x00); + imx327_write_register (IspDev,0x32bb, 0x04); + imx327_write_register (IspDev,0x32c8, 0x50); + imx327_write_register (IspDev,0x32c9, 0x10); + imx327_write_register (IspDev,0x32ca, 0x00); + imx327_write_register (IspDev,0x32cb, 0x04); + + imx327_write_register (IspDev,0x332c, 0xd3); + imx327_write_register (IspDev,0x332d, 0x10); + imx327_write_register (IspDev,0x332e, 0x0d); + imx327_write_register (IspDev,0x3358, 0x06); + imx327_write_register (IspDev,0x3359, 0xe1); + imx327_write_register (IspDev,0x335a, 0x11); + imx327_write_register (IspDev,0x3360, 0x1e); + imx327_write_register (IspDev,0x3361, 0x61); + imx327_write_register (IspDev,0x3362, 0x10); + imx327_write_register (IspDev,0x33b0, 0x50); + imx327_write_register (IspDev,0x33b2, 0x1a); + imx327_write_register (IspDev,0x33b3, 0x04); + + imx327_write_register (IspDev,0x3405, 0x10); + imx327_write_register (IspDev,0x3407, 0x03); + imx327_write_register (IspDev,0x3414, 0x04); + imx327_write_register (IspDev,0x3418, 0xb5); + imx327_write_register (IspDev,0x3419, 0x08); + imx327_write_register (IspDev,0x3441, 0x0c); + imx327_write_register (IspDev,0x3442, 0x0c); + imx327_write_register (IspDev,0x3443, 0x03); + imx327_write_register (IspDev,0x3444, 0x20); + imx327_write_register (IspDev,0x3445, 0x25); + imx327_write_register (IspDev,0x3446, 0x4f); + imx327_write_register (IspDev,0x3447, 0x00); + imx327_write_register (IspDev,0x3448, 0x2f); + imx327_write_register (IspDev,0x3449, 0x00); + imx327_write_register (IspDev,0x344a, 0x17); + imx327_write_register (IspDev,0x344b, 0x00); + imx327_write_register (IspDev,0x344c, 0x17); + imx327_write_register (IspDev,0x344d, 0x00); + imx327_write_register (IspDev,0x344e, 0x17); + imx327_write_register (IspDev,0x344f, 0x00); + imx327_write_register (IspDev,0x3450, 0x57); + imx327_write_register (IspDev,0x3451, 0x00); + imx327_write_register (IspDev,0x3452, 0x17); + imx327_write_register (IspDev,0x3453, 0x00); + imx327_write_register (IspDev,0x3454, 0x17); + imx327_write_register (IspDev,0x3455, 0x00); + imx327_write_register (IspDev,0x3472, 0x1c); + imx327_write_register (IspDev,0x3473, 0x05); + imx327_write_register (IspDev,0x3480, 0x49); + + imx327_write_register (IspDev,0x3000, 0x00); /* standby */ + delay_ms(20); + imx327_write_register (IspDev,0x3002, 0x00); /* master mode start */ + + printf("===Imx327 imx327 720P15fps 12bit 3to1 WDR(60fps->15fps) init success!=====\n"); + return; +} + +void imx327_wdr_1080p120_2to1_init(ISP_DEV IspDev) +{ + imx327_write_register (IspDev,0x3000, 0x01); /* standby */ + imx327_write_register (IspDev,0x3002, 0x01); /* XTMSTA */ + + imx327_write_register (IspDev,0x3005, 0x00); + imx327_write_register (IspDev,0x3007, 0x00); + imx327_write_register (IspDev,0x3009, 0x00); + imx327_write_register (IspDev,0x300a, 0x3c); + imx327_write_register (IspDev,0x300c, 0x11); + imx327_write_register (IspDev,0x300f, 0x00); + imx327_write_register (IspDev,0x3010, 0x21); + imx327_write_register (IspDev,0x3012, 0x64); + imx327_write_register (IspDev,0x3016, 0x09); + imx327_write_register (IspDev,0x3018, 0x65); + imx327_write_register (IspDev,0x3019, 0x04); + imx327_write_register (IspDev,0x301c, 0xF6); + imx327_write_register (IspDev,0x301d, 0x03); + imx327_write_register (IspDev,0x3020, 0x02); + imx327_write_register (IspDev,0x3024, 0xc9); + imx327_write_register (IspDev,0x3030, 0x0b); + imx327_write_register (IspDev,0x3045, 0x05); + imx327_write_register (IspDev,0x3046, 0x00); + imx327_write_register (IspDev,0x304b, 0x0a); + imx327_write_register (IspDev,0x305c, 0x18); + imx327_write_register (IspDev,0x305d, 0x03); + imx327_write_register (IspDev,0x305e, 0x20); + imx327_write_register (IspDev,0x305f, 0x01); + imx327_write_register (IspDev,0x3070, 0x02); + imx327_write_register (IspDev,0x3071, 0x11); + imx327_write_register (IspDev,0x309b, 0x10); + imx327_write_register (IspDev,0x309c, 0x22); + imx327_write_register (IspDev,0x30a2, 0x02); + imx327_write_register (IspDev,0x30a6, 0x20); + imx327_write_register (IspDev,0x30a8, 0x20); + imx327_write_register (IspDev,0x30aa, 0x20); + imx327_write_register (IspDev,0x30ac, 0x20); + imx327_write_register (IspDev,0x30b0, 0x43); + imx327_write_register (IspDev,0x3106, 0x11); + imx327_write_register (IspDev,0x3119, 0x9e); + imx327_write_register (IspDev,0x311c, 0x1e); + imx327_write_register (IspDev,0x311e, 0x08); + imx327_write_register (IspDev,0x3128, 0x05); + imx327_write_register (IspDev,0x3129, 0x1d); + imx327_write_register (IspDev,0x313d, 0x83); + imx327_write_register (IspDev,0x3150, 0x03); + imx327_write_register (IspDev,0x315e, 0x1a); + imx327_write_register (IspDev,0x3164, 0x1a); + imx327_write_register (IspDev,0x317c, 0x12); + imx327_write_register (IspDev,0x317e, 0x00); + imx327_write_register (IspDev,0x31ec, 0x37); + + imx327_write_register (IspDev,0x32b8, 0x50); + imx327_write_register (IspDev,0x32b9, 0x10); + imx327_write_register (IspDev,0x32ba, 0x00); + imx327_write_register (IspDev,0x32bb, 0x04); + imx327_write_register (IspDev,0x32c8, 0x50); + imx327_write_register (IspDev,0x32c9, 0x10); + imx327_write_register (IspDev,0x32ca, 0x00); + imx327_write_register (IspDev,0x32cb, 0x04); + + imx327_write_register (IspDev,0x332c, 0xd3); + imx327_write_register (IspDev,0x332d, 0x10); + imx327_write_register (IspDev,0x332e, 0x0d); + imx327_write_register (IspDev,0x3358, 0x06); + imx327_write_register (IspDev,0x3359, 0xe1); + imx327_write_register (IspDev,0x335a, 0x11); + imx327_write_register (IspDev,0x3360, 0x1e); + imx327_write_register (IspDev,0x3361, 0x61); + imx327_write_register (IspDev,0x3362, 0x10); + imx327_write_register (IspDev,0x33b0, 0x50); + imx327_write_register (IspDev,0x33b2, 0x1a); + imx327_write_register (IspDev,0x33b3, 0x04); + + imx327_write_register (IspDev,0x3405, 0x00); + imx327_write_register (IspDev,0x3407, 0x03); + imx327_write_register (IspDev,0x3414, 0x0a); + imx327_write_register (IspDev,0x3418, 0xb2); + imx327_write_register (IspDev,0x3419, 0x08); + imx327_write_register (IspDev,0x3441, 0x0a); + imx327_write_register (IspDev,0x3442, 0x0a); + imx327_write_register (IspDev,0x3443, 0x03); + imx327_write_register (IspDev,0x3444, 0x20); + imx327_write_register (IspDev,0x3445, 0x25); + imx327_write_register (IspDev,0x3446, 0x77); + imx327_write_register (IspDev,0x3447, 0x00); + imx327_write_register (IspDev,0x3448, 0x67); + imx327_write_register (IspDev,0x3449, 0x00); + imx327_write_register (IspDev,0x344a, 0x47); + imx327_write_register (IspDev,0x344b, 0x00); + imx327_write_register (IspDev,0x344c, 0x37); + imx327_write_register (IspDev,0x344d, 0x00); + imx327_write_register (IspDev,0x344e, 0x3f); + imx327_write_register (IspDev,0x344f, 0x00); + imx327_write_register (IspDev,0x3450, 0xff); + imx327_write_register (IspDev,0x3451, 0x00); + imx327_write_register (IspDev,0x3452, 0x3f); + imx327_write_register (IspDev,0x3453, 0x00); + imx327_write_register (IspDev,0x3454, 0x37); + imx327_write_register (IspDev,0x3455, 0x00); + imx327_write_register (IspDev,0x3472, 0x9c); + imx327_write_register (IspDev,0x3473, 0x07); + imx327_write_register (IspDev,0x3480, 0x49); + + imx327_write_register (IspDev,0x3000, 0x00); /* standby */ + delay_ms(20); + imx327_write_register (IspDev,0x3002, 0x00); /* master mode start */ + + printf("===Imx327 imx327 1080P60fps 10bit 2to1 WDR(120fps->60fps) init success!=====\n"); + return; +} + +void imx327_wdr_1080p120_3to1_init(ISP_DEV IspDev) +{ + imx327_write_register (IspDev,0x3000, 0x01); /* standby */ + imx327_write_register (IspDev,0x3002, 0x01); /* XTMSTA */ + + imx327_write_register (IspDev,0x3005, 0x00); + imx327_write_register (IspDev,0x3007, 0x00); + imx327_write_register (IspDev,0x3009, 0x00); + imx327_write_register (IspDev,0x300a, 0x3c); + imx327_write_register (IspDev,0x300c, 0x21); + imx327_write_register (IspDev,0x300f, 0x00); + imx327_write_register (IspDev,0x3010, 0x21); + imx327_write_register (IspDev,0x3012, 0x64); + imx327_write_register (IspDev,0x3016, 0x09); + imx327_write_register (IspDev,0x3018, 0x65); + imx327_write_register (IspDev,0x3019, 0x04); + imx327_write_register (IspDev,0x301c, 0x4c); + imx327_write_register (IspDev,0x301d, 0x04); + +#if 1 + imx327_write_register (IspDev,0x3020, 0x04); /* SHS1 */ + imx327_write_register (IspDev,0x3021, 0x00); + //imx327_write_register (IspDev,0x3022, 0x00); + imx327_write_register (IspDev,0x3024, 0xf2); /* SHS2 */ + imx327_write_register (IspDev,0x3025, 0x01); + //imx327_write_register (IspDev,0x3025, 0x00); + imx327_write_register (IspDev,0x3028, 0x57); /* SHS3 */ + imx327_write_register (IspDev,0x3029, 0x02); + //imx327_write_register (IspDev,0x302A, 0x00); + imx327_write_register (IspDev,0x3030, 0xed); /* RHS1 */ + imx327_write_register (IspDev,0x3031, 0x01); + imx327_write_register (IspDev,0x3034, 0x30); /* RHS2 */ + imx327_write_register (IspDev,0x3035, 0x02); +#else + imx327_write_register (IspDev,0x3020, 0x04); + imx327_write_register (IspDev,0x3024, 0x89); + imx327_write_register (IspDev,0x3028, 0x93); + imx327_write_register (IspDev,0x3029, 0x01); + imx327_write_register (IspDev,0x3030, 0x85); + imx327_write_register (IspDev,0x3034, 0x92); +#endif + + imx327_write_register (IspDev,0x3045, 0x05); + imx327_write_register (IspDev,0x3046, 0x00); + imx327_write_register (IspDev,0x304b, 0x0a); + imx327_write_register (IspDev,0x305c, 0x18); + imx327_write_register (IspDev,0x305d, 0x03); + imx327_write_register (IspDev,0x305e, 0x20); + imx327_write_register (IspDev,0x305f, 0x01); + imx327_write_register (IspDev,0x3070, 0x02); + imx327_write_register (IspDev,0x3071, 0x11); + imx327_write_register (IspDev,0x309b, 0x10); + imx327_write_register (IspDev,0x309c, 0x22); + imx327_write_register (IspDev,0x30a2, 0x02); + imx327_write_register (IspDev,0x30a6, 0x20); + imx327_write_register (IspDev,0x30a8, 0x20); + imx327_write_register (IspDev,0x30aa, 0x20); + imx327_write_register (IspDev,0x30ac, 0x20); + imx327_write_register (IspDev,0x30b0, 0x43); + imx327_write_register (IspDev,0x3106, 0x33); + imx327_write_register (IspDev,0x3119, 0x9e); + imx327_write_register (IspDev,0x311c, 0x1e); + imx327_write_register (IspDev,0x311e, 0x08); + imx327_write_register (IspDev,0x3128, 0x05); + imx327_write_register (IspDev,0x3129, 0x1d); + imx327_write_register (IspDev,0x313d, 0x83); + imx327_write_register (IspDev,0x3150, 0x03); + imx327_write_register (IspDev,0x315e, 0x1a); + imx327_write_register (IspDev,0x3164, 0x1a); + imx327_write_register (IspDev,0x317c, 0x12); + imx327_write_register (IspDev,0x317e, 0x00); + imx327_write_register (IspDev,0x31ec, 0x37); + + imx327_write_register (IspDev,0x32b8, 0x50); + imx327_write_register (IspDev,0x32b9, 0x10); + imx327_write_register (IspDev,0x32ba, 0x00); + imx327_write_register (IspDev,0x32bb, 0x04); + imx327_write_register (IspDev,0x32c8, 0x50); + imx327_write_register (IspDev,0x32c9, 0x10); + imx327_write_register (IspDev,0x32ca, 0x00); + imx327_write_register (IspDev,0x32cb, 0x04); + + imx327_write_register (IspDev,0x332c, 0xd3); + imx327_write_register (IspDev,0x332d, 0x10); + imx327_write_register (IspDev,0x332e, 0x0d); + imx327_write_register (IspDev,0x3358, 0x06); + imx327_write_register (IspDev,0x3359, 0xe1); + imx327_write_register (IspDev,0x335a, 0x11); + imx327_write_register (IspDev,0x3360, 0x1e); + imx327_write_register (IspDev,0x3361, 0x61); + imx327_write_register (IspDev,0x3362, 0x10); + imx327_write_register (IspDev,0x33b0, 0x50); + imx327_write_register (IspDev,0x33b2, 0x1a); + imx327_write_register (IspDev,0x33b3, 0x04); + + imx327_write_register (IspDev,0x3405, 0x00); + imx327_write_register (IspDev,0x3407, 0x03); + imx327_write_register (IspDev,0x3414, 0x0a); + imx327_write_register (IspDev,0x3418, 0x55); + imx327_write_register (IspDev,0x3419, 0x11); + imx327_write_register (IspDev,0x3441, 0x0a); + imx327_write_register (IspDev,0x3442, 0x0a); + imx327_write_register (IspDev,0x3443, 0x03); + imx327_write_register (IspDev,0x3444, 0x20); + imx327_write_register (IspDev,0x3445, 0x25); + imx327_write_register (IspDev,0x3446, 0x77); + imx327_write_register (IspDev,0x3447, 0x00); + imx327_write_register (IspDev,0x3448, 0x67); + imx327_write_register (IspDev,0x3449, 0x00); + imx327_write_register (IspDev,0x344a, 0x47); + imx327_write_register (IspDev,0x344b, 0x00); + imx327_write_register (IspDev,0x344c, 0x37); + imx327_write_register (IspDev,0x344d, 0x00); + imx327_write_register (IspDev,0x344e, 0x3f); + imx327_write_register (IspDev,0x344f, 0x00); + imx327_write_register (IspDev,0x3450, 0xff); + imx327_write_register (IspDev,0x3451, 0x00); + imx327_write_register (IspDev,0x3452, 0x3f); + imx327_write_register (IspDev,0x3453, 0x00); + imx327_write_register (IspDev,0x3454, 0x37); + imx327_write_register (IspDev,0x3455, 0x00); + imx327_write_register (IspDev,0x3472, 0x9c); + imx327_write_register (IspDev,0x3473, 0x07); + imx327_write_register (IspDev,0x3480, 0x49); + + imx327_write_register (IspDev,0x3000, 0x00); /* standby */ + delay_ms(20); + imx327_write_register (IspDev,0x3002, 0x00); /* master mode start */ + + printf("===Imx327 imx327 1080P30fps 10bit 3to1 WDR(120fps->30fps) init success!=====\n"); + + return; +} + +