/* * Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. * * File Name: sample/common/sample_common_isp.c * Description: * Common ctrl code for isp. */ #include #include #include #include #include #include #include #include #include #include "sample_comm.h" #include "cvi_awb.h" #include "cvi_af.h" #include "cvi_sns_ctrl.h" #include "cvi_ae.h" #include "cvi_isp.h" #ifdef SUPPORT_ISP_PQTOOL #include static CVI_BOOL g_ISPDaemon = CVI_FALSE; static void *g_ISPDHandle; #define ISPD_LIBNAME "libcvi_ispd.so" #define ISPD_CONNECT_PORT 5566 #endif // static pthread_t g_IspPid[VI_MAX_DEV_NUM]; static CVI_U32 g_au32IspSnsId[ISP_MAX_DEV_NUM] = { 0, 1 }; SAMPLE_SNS_TYPE_E g_enSnsType[VI_MAX_DEV_NUM] = { SONY_IMX327_MIPI_2M_30FPS_12BIT, SONY_IMX290_MIPI_1M_30FPS_12BIT, }; static ISP_INIT_ATTR_S gstInitAttr[ISP_MAX_DEV_NUM]; ISP_PUB_ATTR_S ISP_PUB_ATTR_SAMPLE = { { 0, 0, 1920, 1080 }, { 1920, 1080 }, 30, BAYER_RGGB, WDR_MODE_NONE, 0}; void callback_FPS(int fps) { static CVI_FLOAT uMaxFPS[VI_MAX_DEV_NUM] = {0}; int i; for (i = 0; i < VI_MAX_DEV_NUM && g_IspPid[i]; i++) { ISP_PUB_ATTR_S pubAttr = {0}; CVI_ISP_GetPubAttr(i, &pubAttr); if (uMaxFPS[i] == 0) { uMaxFPS[i] = pubAttr.f32FrameRate; } if (fps == 0) { pubAttr.f32FrameRate = uMaxFPS[i]; } else { pubAttr.f32FrameRate = (CVI_FLOAT) fps; } CVI_ISP_SetPubAttr(i, &pubAttr); } } static CVI_VOID *SAMPLE_COMM_ISP_Thread(void *arg) { CVI_S32 s32Ret = 0; CVI_U8 IspDev = *(CVI_U8 *)arg; char szThreadName[20]; free(arg); snprintf(szThreadName, sizeof(szThreadName), "ISP%d_RUN", IspDev); prctl(PR_SET_NAME, szThreadName, 0, 0, 0); if (IspDev > 0) { SAMPLE_PRT("ISP Dev %d return\n", IspDev); return NULL; } CVI_SYS_RegisterThermalCallback(callback_FPS); SAMPLE_PRT("ISP Dev %d running!\n", IspDev); s32Ret = CVI_ISP_Run(IspDev); if (s32Ret != 0) SAMPLE_PRT("CVI_ISP_Run failed with %#x!\n", s32Ret); return NULL; } CVI_S32 SAMPLE_COMM_ISP_Run(CVI_U8 IspDev) { CVI_S32 s32Ret = 0; CVI_U8 *arg = malloc(sizeof(*arg)); struct sched_param param; pthread_attr_t attr; if (arg == NULL) { CVI_TRACE_LOG(CVI_DBG_ERR, "malloc failed\n"); goto out; } *arg = IspDev; param.sched_priority = 80; pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, SCHED_RR); pthread_attr_setschedparam(&attr, ¶m); pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); s32Ret = pthread_create(&g_IspPid[IspDev], &attr, SAMPLE_COMM_ISP_Thread, arg); if (s32Ret != 0) { CVI_TRACE_LOG(CVI_DBG_ERR, "create isp running thread failed!, error: %d, %s\r\n", s32Ret, strerror(s32Ret)); goto out; } #ifdef SUPPORT_ISP_PQTOOL if (!g_ISPDaemon) { g_ISPDHandle = dlopen(ISPD_LIBNAME, RTLD_NOW); if (g_ISPDHandle) { char *error = NULL; void (*daemon_init)(unsigned int port); printf("Load dynamic library %s success\n", ISPD_LIBNAME); dlerror(); daemon_init = dlsym(g_ISPDHandle, "isp_daemon_init"); error = dlerror(); if (error == NULL) { (*daemon_init)(ISPD_CONNECT_PORT); g_ISPDaemon = CVI_TRUE; } else { printf("Run daemon initial fail\n"); dlclose(g_ISPDHandle); } } else { printf("Load dynamic library %s fail\n", ISPD_LIBNAME); } } #endif // out: return s32Ret; } CVI_S32 SAMPLE_COMM_ISP_GetIspAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, ISP_PUB_ATTR_S *pstPubAttr) { CVI_S32 s32Ret = CVI_SUCCESS; PIC_SIZE_E enPicSize; SIZE_S stSize; memcpy(pstPubAttr, &ISP_PUB_ATTR_SAMPLE, sizeof(ISP_PUB_ATTR_S)); SAMPLE_COMM_VI_GetSizeBySensor(enSnsType, &enPicSize); SAMPLE_COMM_SYS_GetPicSize(enPicSize, &stSize); pstPubAttr->stSnsSize.u32Width = stSize.u32Width; pstPubAttr->stSnsSize.u32Height = stSize.u32Height; pstPubAttr->stWndRect.u32Width = stSize.u32Width; pstPubAttr->stWndRect.u32Height = stSize.u32Height; // WDR mode if (enSnsType >= SAMPLE_SNS_TYPE_LINEAR_BUTT) pstPubAttr->enWDRMode = WDR_MODE_2To1_LINE; // FPS switch (enSnsType) { case SMS_SC035GS_MIPI_480P_120FPS_12BIT: case SMS_SC035GS_1L_MIPI_480P_120FPS_10BIT: case SMS_SC035HGS_MIPI_480P_120FPS_12BIT: case OV_OV6211_MIPI_400P_120FPS_10BIT: case OV_OV7251_MIPI_480P_120FPS_10BIT: pstPubAttr->f32FrameRate = 120; break; case SONY_IMX307_MIPI_2M_60FPS_12BIT: case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: case SONY_IMX327_MIPI_2M_60FPS_12BIT: case SONY_IMX335_MIPI_2M_60FPS_10BIT: case SONY_IMX335_MIPI_4M_60FPS_10BIT: case SONY_IMX335_MIPI_5M_60FPS_10BIT: case SONY_IMX347_MIPI_4M_60FPS_12BIT: pstPubAttr->f32FrameRate = 60; break; case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: case SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1: case SONY_IMX347_MIPI_4M_30FPS_12BIT_WDR2TO1: pstPubAttr->f32FrameRate = 30; break; case GCORE_GC2145_MIPI_2M_12FPS_8BIT: pstPubAttr->f32FrameRate = 12; break; default: pstPubAttr->f32FrameRate = 25; break; } switch (enSnsType) { case SOI_K06_MIPI_4M_25FPS_10BIT: pstPubAttr->enBayer = BAYER_GBRG; break; // Sony case SONY_IMX307_MIPI_2M_30FPS_12BIT: case SONY_IMX307_MIPI_2M_30FPS_12BIT_WDR2TO1: case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT: case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT: case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT: case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: case SONY_IMX307_MIPI_2M_60FPS_12BIT: case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: #ifdef FPGA_PORTING case SONY_IMX327_MIPI_1M_30FPS_10BIT: case SONY_IMX327_MIPI_1M_30FPS_10BIT_WDR2TO1: #endif case SONY_IMX327_MIPI_2M_30FPS_12BIT: case SONY_IMX327_MIPI_2M_30FPS_12BIT_WDR2TO1: case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT: case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT: case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT: case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: case SONY_IMX327_MIPI_2M_60FPS_12BIT: case SONY_IMX334_MIPI_8M_30FPS_12BIT: case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1: case SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1: case SONY_IMX335_MIPI_4M_30FPS_12BIT: case SONY_IMX335_MIPI_4M_30FPS_10BIT_WDR2TO1: case SONY_IMX335_2L_MIPI_4M_30FPS_10BIT: case SONY_IMX335_MIPI_4M_1600P_30FPS_12BIT: case SONY_IMX335_MIPI_4M_1600P_30FPS_10BIT_WDR2TO1: case SONY_IMX335_MIPI_5M_30FPS_12BIT: case SONY_IMX335_MIPI_5M_30FPS_10BIT_WDR2TO1: case SONY_IMX335_MIPI_2M_60FPS_10BIT: case SONY_IMX335_MIPI_4M_60FPS_10BIT: case SONY_IMX335_MIPI_5M_60FPS_10BIT: case SONY_IMX347_MIPI_4M_60FPS_12BIT: case SONY_IMX347_MIPI_4M_30FPS_12BIT_WDR2TO1: case SONY_IMX385_MIPI_2M_30FPS_12BIT: case SONY_IMX385_MIPI_2M_30FPS_12BIT_WDR2TO1: // GalaxyCore case GCORE_GC02M1_MIPI_2M_30FPS_10BIT: case GCORE_GC1054_MIPI_1M_30FPS_10BIT: case GCORE_GC2053_MIPI_2M_30FPS_10BIT: case GCORE_GC2053_SLAVE_MIPI_2M_30FPS_10BIT: case GCORE_GC2053_1L_MIPI_2M_30FPS_10BIT: case GCORE_GC2093_MIPI_2M_30FPS_10BIT: case GCORE_GC2093_MIPI_2M_30FPS_10BIT_WDR2TO1: case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT: case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: case GCORE_GC4023_MIPI_4M_30FPS_10BIT: pstPubAttr->enBayer = BAYER_RGGB; break; case GCORE_GC4653_MIPI_4M_30FPS_10BIT: case GCORE_GC4653_SLAVE_MIPI_4M_30FPS_10BIT: case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: pstPubAttr->enBayer = BAYER_GRBG; break; #ifdef ARCH_CV182X case SOI_F23_MIPI_2M_30FPS_10BIT: pstPubAttr->enBayer = BAYER_BGRGI; break; #endif default: pstPubAttr->enBayer = BAYER_BGGR; break; }; return s32Ret; } /****************************************************************************** * funciton : stop ISP, and stop isp thread ******************************************************************************/ CVI_VOID SAMPLE_COMM_ISP_Stop(CVI_U8 IspDev) { CVI_S32 s32Ret = CVI_FAILURE; #ifdef SUPPORT_ISP_PQTOOL if (g_ISPDaemon) { char *error = NULL; void (*daemon_uninit)(void); daemon_uninit = dlsym(g_ISPDHandle, "isp_daemon_uninit"); error = dlerror(); if (error == NULL) (*daemon_uninit)(); dlclose(g_ISPDHandle); g_ISPDHandle = NULL; g_ISPDaemon = CVI_FALSE; } #endif // if (g_IspPid[IspDev]) { s32Ret = CVI_ISP_Exit(IspDev); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("CVI_ISP_Exit fail with %#x!\n", s32Ret); return; } pthread_join(g_IspPid[IspDev], NULL); g_IspPid[IspDev] = 0; SAMPLE_COMM_ISP_Sensor_UnRegiter_callback(IspDev); SAMPLE_COMM_ISP_Aelib_UnCallback(IspDev); SAMPLE_COMM_ISP_Awblib_UnCallback(IspDev); #if ENABLE_AF_LIB SAMPLE_COMM_ISP_Aflib_UnCallback(IspDev); #endif } } CVI_VOID SAMPLE_COMM_All_ISP_Stop(CVI_VOID) { for (ISP_DEV IspDev = 0; IspDev < VI_MAX_DEV_NUM; IspDev++) SAMPLE_COMM_ISP_Stop(IspDev); } CVI_S32 SAMPLE_COMM_ISP_Awblib_Callback(ISP_DEV IspDev) { ALG_LIB_S stAwbLib; CVI_S32 s32Ret = 0; stAwbLib.s32Id = IspDev; strncpy(stAwbLib.acLibName, CVI_AWB_LIB_NAME, sizeof(stAwbLib.acLibName)); s32Ret = CVI_AWB_Register(IspDev, &stAwbLib); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "AWB Algo register failed!, error: %d\n", s32Ret); return s32Ret; } return CVI_SUCCESS; } CVI_S32 SAMPLE_COMM_ISP_Awblib_UnCallback(ISP_DEV IspDev) { CVI_S32 s32Ret = 0; ALG_LIB_S stAwbLib; stAwbLib.s32Id = IspDev; strncpy(stAwbLib.acLibName, CVI_AWB_LIB_NAME, sizeof(stAwbLib.acLibName)); s32Ret = CVI_AWB_UnRegister(IspDev, &stAwbLib); if (s32Ret) { CVI_TRACE_LOG(CVI_DBG_ERR, "AWB Algo unRegister failed!, error: %d\n", s32Ret); return s32Ret; } return CVI_SUCCESS; } CVI_S32 SAMPLE_COMM_ISP_Aelib_Callback(ISP_DEV IspDev) { CVI_S32 s32Ret = 0; ALG_LIB_S stAeLib; stAeLib.s32Id = IspDev; strncpy(stAeLib.acLibName, CVI_AE_LIB_NAME, sizeof(stAeLib.acLibName)); s32Ret = CVI_AE_Register(IspDev, &stAeLib); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "AE Algo register failed!, error: %d\n", s32Ret); return s32Ret; } return CVI_SUCCESS; } CVI_S32 SAMPLE_COMM_ISP_Aelib_UnCallback(ISP_DEV IspDev) { CVI_S32 s32Ret = 0; ALG_LIB_S stAeLib; stAeLib.s32Id = IspDev; strncpy(stAeLib.acLibName, CVI_AE_LIB_NAME, sizeof(stAeLib.acLibName)); s32Ret = CVI_AE_UnRegister(IspDev, &stAeLib); if (s32Ret) { CVI_TRACE_LOG(CVI_DBG_ERR, "AE Algo unRegister failed!, error: %d\n", s32Ret); return s32Ret; } return CVI_SUCCESS; } CVI_S32 SAMPLE_COMM_ISP_Aflib_Callback(ISP_DEV IspDev) { ALG_LIB_S stAfLib; CVI_S32 s32Ret = 0; stAfLib.s32Id = IspDev; strncpy(stAfLib.acLibName, CVI_AF_LIB_NAME, sizeof(stAfLib.acLibName)); s32Ret = CVI_AF_Register(IspDev, &stAfLib); if (s32Ret != CVI_SUCCESS) { printf("AF Algo register failed!, error: %d\n", s32Ret); return s32Ret; } return CVI_SUCCESS; } CVI_S32 SAMPLE_COMM_ISP_Aflib_UnCallback(ISP_DEV IspDev) { CVI_S32 s32Ret = 0; ALG_LIB_S stAfLib; stAfLib.s32Id = IspDev; strncpy(stAfLib.acLibName, CVI_AF_LIB_NAME, sizeof(stAfLib.acLibName)); s32Ret = CVI_AF_UnRegister(IspDev, &stAfLib); if (s32Ret) { CVI_TRACE_LOG(CVI_DBG_ERR, "AF Algo unRegister failed!, error: %d\n", s32Ret); return s32Ret; } return CVI_SUCCESS; } CVI_S32 SAMPLE_COMM_ISP_SetSnsObj(CVI_U32 u32SnsId, SAMPLE_SNS_TYPE_E enSnsType) { if (u32SnsId >= ARRAY_SIZE(g_enSnsType)) return CVI_FAILURE; g_enSnsType[u32SnsId] = enSnsType; return CVI_SUCCESS; } CVI_S32 SAMPLE_COMM_ISP_SetSnsInit(CVI_U32 u32SnsId, CVI_U8 u8HwSync) { if (u32SnsId >= ARRAY_SIZE(g_enSnsType)) return CVI_FAILURE; gstInitAttr[u32SnsId].u16UseHwSync = u8HwSync; return CVI_SUCCESS; } CVI_VOID *SAMPLE_COMM_GetSnsObj(SAMPLE_SNS_TYPE_E enSnsType) { CVI_VOID *pSnsObj; switch (enSnsType) { #if defined(SENSOR_BRIGATES_BG0808) case BRIGATES_BG0808_MIPI_2M_30FPS_10BIT: case BRIGATES_BG0808_MIPI_2M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsBG0808_Obj; break; #endif #if defined(SENSOR_GCORE_GC02M1) case GCORE_GC02M1_MIPI_2M_30FPS_10BIT: return &stSnsGc02m1_Obj; #endif #if defined(SENSOR_GCORE_GC1054) case GCORE_GC1054_MIPI_1M_30FPS_10BIT: return &stSnsGc1054_Obj; #endif #if defined(SENSOR_GCORE_GC2053) case GCORE_GC2053_MIPI_2M_30FPS_10BIT: return &stSnsGc2053_Obj; #endif #if defined(SENSOR_GCORE_GC2053_SLAVE) case GCORE_GC2053_SLAVE_MIPI_2M_30FPS_10BIT: return &stSnsGc2053_Slave_Obj; #endif #if defined(SENSOR_GCORE_GC2053_1L) case GCORE_GC2053_1L_MIPI_2M_30FPS_10BIT: pSnsObj = &stSnsGc2053_1l_Obj; break; #endif #if defined(SENSOR_GCORE_GC2093) case GCORE_GC2093_MIPI_2M_30FPS_10BIT: case GCORE_GC2093_MIPI_2M_30FPS_10BIT_WDR2TO1: return &stSnsGc2093_Obj; #endif #if defined(SENSOR_GCORE_GC2093_SLAVE) case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT: case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: return &stSnsGc2093_Slave_Obj; #endif #if defined(SENSOR_GCORE_GC2145) case GCORE_GC2145_MIPI_2M_12FPS_8BIT: return &stSnsGc2145_Obj; #endif #if defined(SENSOR_GCORE_GC4023) case GCORE_GC4023_MIPI_4M_30FPS_10BIT: return &stSnsGc4023_Obj; #endif #if defined(SENSOR_GCORE_GC4653) case GCORE_GC4653_MIPI_4M_30FPS_10BIT: return &stSnsGc4653_Obj; #endif #if defined(SENSOR_GCORE_GC4653_SLAVE) case GCORE_GC4653_SLAVE_MIPI_4M_30FPS_10BIT: return &stSnsGc4653_Slave_Obj; #endif #if defined(SENSOR_NEXTCHIP_N5) case NEXTCHIP_N5_2M_25FPS_8BIT: case NEXTCHIP_N5_1M_2CH_25FPS_8BIT: pSnsObj = &stSnsN5_Obj; break; #endif #if defined(SENSOR_NEXTCHIP_N6) case NEXTCHIP_N6_2M_4CH_25FPS_8BIT: pSnsObj = &stSnsN6_Obj; break; #endif #if defined(SENSOR_OV_OS02D10) case OV_OS02D10_MIPI_2M_30FPS_10BIT: pSnsObj = &stSnsOs02d10_Obj; break; #endif #if defined(SENSOR_OV_OS02D10_SLAVE) case OV_OS02D10_SLAVE_MIPI_2M_30FPS_10BIT: pSnsObj = &stSnsOs02d10_Slave_Obj; break; #endif #if defined(SENSOR_OV_OS02K10_SLAVE) case OV_OS02K10_SLAVE_MIPI_2M_30FPS_12BIT: pSnsObj = &stSnsOs02k10_Slave_Obj; break; #endif #if defined(SENSOR_OV_OS04A10) case OV_OS04A10_MIPI_4M_1440P_30FPS_12BIT: case OV_OS04A10_MIPI_4M_1440P_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsOs04a10_Obj; break; #endif #if defined(SENSOR_OV_OS04C10) case OV_OS04C10_MIPI_4M_30FPS_12BIT: case OV_OS04C10_MIPI_4M_1440P_30FPS_12BIT: case OV_OS04C10_MIPI_4M_30FPS_10BIT_WDR2TO1: case OV_OS04C10_MIPI_4M_1440P_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsOs04c10_Obj; break; #endif #if defined(SENSOR_OV_OS04C10_SLAVE) case OV_OS04C10_SLAVE_MIPI_4M_30FPS_12BIT: case OV_OS04C10_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsOs04c10_Slave_Obj; break; #endif #if defined(SENSOR_OV_OS08A20) case OV_OS08A20_MIPI_4M_30FPS_10BIT: case OV_OS08A20_MIPI_4M_30FPS_10BIT_WDR2TO1: case OV_OS08A20_MIPI_5M_30FPS_10BIT: case OV_OS08A20_MIPI_5M_30FPS_10BIT_WDR2TO1: case OV_OS08A20_MIPI_8M_30FPS_10BIT: case OV_OS08A20_MIPI_8M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsOs08a20_Obj; break; #endif #if defined(SENSOR_OV_OS08A20_SLAVE) case OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT: case OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1: case OV_OS08A20_SLAVE_MIPI_5M_30FPS_10BIT: case OV_OS08A20_SLAVE_MIPI_5M_30FPS_10BIT_WDR2TO1: case OV_OS08A20_SLAVE_MIPI_8M_30FPS_10BIT: case OV_OS08A20_SLAVE_MIPI_8M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsOs08a20_Slave_Obj; break; #endif #if defined(SENSOR_OV_OV4689) case OV_OV4689_MIPI_4M_30FPS_10BIT: pSnsObj = &stSnsOv4689_Obj; break; #endif #if defined(SENSOR_OV_OV6211) case OV_OV6211_MIPI_400P_120FPS_10BIT: pSnsObj = &stSnsOv6211_Obj; break; #endif #if defined(SENSOR_OV_OV7251) case OV_OV7251_MIPI_480P_120FPS_10BIT: pSnsObj = &stSnsOv7251_Obj; break; #endif #if defined(SENSOR_PICO_384) case PICO384_THERMAL_384X288: pSnsObj = &stSnsPICO384_Obj; break; #endif #if defined(SENSOR_PICO_640) case PICO640_THERMAL_479P: pSnsObj = &stSnsPICO640_Obj; break; #endif #if defined(SENSOR_PIXELPLUS_PR2020) case PIXELPLUS_PR2020_1M_25FPS_8BIT: case PIXELPLUS_PR2020_1M_30FPS_8BIT: case PIXELPLUS_PR2020_2M_25FPS_8BIT: case PIXELPLUS_PR2020_2M_30FPS_8BIT: pSnsObj = &stSnsPR2020_Obj; break; #endif #if defined(SENSOR_PIXELPLUS_PR2100) case PIXELPLUS_PR2100_2M_25FPS_8BIT: case PIXELPLUS_PR2100_2M_2CH_25FPS_8BIT: case PIXELPLUS_PR2100_2M_4CH_25FPS_8BIT: pSnsObj = &stSnsPR2100_Obj; break; #endif #if defined(SENSOR_SMS_SC035GS) case SMS_SC035GS_MIPI_480P_120FPS_12BIT: pSnsObj = &stSnsSC035GS_Obj; break; #endif #if defined(SENSOR_SMS_SC035GS_1L) case SMS_SC035GS_1L_MIPI_480P_120FPS_10BIT: pSnsObj = &stSnsSC035GS_1L_Obj; break; #endif #if defined(SENSOR_SMS_SC035HGS) case SMS_SC035HGS_MIPI_480P_120FPS_12BIT: pSnsObj = &stSnsSC035HGS_Obj; break; #endif #if defined(SENSOR_SMS_SC200AI) case SMS_SC200AI_MIPI_2M_30FPS_10BIT: case SMS_SC200AI_MIPI_2M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsSC200AI_Obj; break; #endif #if defined(SENSOR_SMS_SC301IOT) case SMS_SC301IOT_MIPI_3M_30FPS_10BIT: pSnsObj = &stSnsSC301IOT_Obj; break; #endif #if defined(SENSOR_SMS_SC401AI) case SMS_SC401AI_MIPI_4M_30FPS_10BIT: case SMS_SC401AI_MIPI_3M_30FPS_10BIT: pSnsObj = &stSnsSC401AI_Obj; break; #endif #if defined(SENSOR_SMS_SC500AI) case SMS_SC500AI_MIPI_5M_30FPS_10BIT: case SMS_SC500AI_MIPI_5M_30FPS_10BIT_WDR2TO1: case SMS_SC500AI_MIPI_4M_30FPS_10BIT: case SMS_SC500AI_MIPI_4M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsSC500AI_Obj; break; #endif #if defined(SENSOR_SMS_SC501AI_2L) case SMS_SC501AI_2L_MIPI_5M_30FPS_10BIT: pSnsObj = &stSnsSC501AI_2L_Obj; break; #endif #if defined(SENSOR_SMS_SC531AI_2L) case SMS_SC531AI_2L_MIPI_5M_30FPS_10BIT: pSnsObj = &stSnsSC531AI_2L_Obj; break; #endif #if defined(SENSOR_SMS_SC850SL) case SMS_SC850SL_MIPI_8M_30FPS_12BIT: case SMS_SC850SL_MIPI_8M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsSC850SL_Obj; break; #endif #if defined(SENSOR_SMS_SC3332) case SMS_SC3332_MIPI_3M_30FPS_10BIT: pSnsObj = &stSnsSC3332_Obj; break; #endif #if defined(SENSOR_SMS_SC3335) case SMS_SC3335_MIPI_3M_30FPS_10BIT: pSnsObj = &stSnsSC3335_Obj; break; #endif #if defined(SENSOR_SMS_SC3335_SLAVE) case SMS_SC3335_SLAVE_MIPI_3M_30FPS_10BIT: pSnsObj = &stSnsSC3335_Slave_Obj; break; #endif #if defined(SENSOR_SMS_SC3336) case SMS_SC3336_MIPI_3M_30FPS_10BIT: pSnsObj = &stSnsSC3336_Obj; break; #endif #if defined(SENSOR_SMS_SC2335) case SMS_SC2335_MIPI_2M_30FPS_10BIT: pSnsObj = &stSnsSC2335_Obj; break; #endif #if defined(SENSOR_SMS_SC2336) case SMS_SC2336_MIPI_2M_30FPS_10BIT: pSnsObj = &stSnsSC2336_Obj; break; #endif #if defined(SENSOR_SMS_SC4210) case SMS_SC4210_MIPI_4M_30FPS_12BIT: case SMS_SC4210_MIPI_4M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsSC4210_Obj; break; #endif #if defined(SENSOR_SMS_SC4336) case SMS_SC4336_MIPI_4M_30FPS_10BIT: pSnsObj = &stSnsSC4336_Obj; break; #endif #if defined(SENSOR_SMS_SC8238) case SMS_SC8238_MIPI_8M_30FPS_10BIT: case SMS_SC8238_MIPI_8M_15FPS_10BIT_WDR2TO1: pSnsObj = &stSnsSC8238_Obj; break; #endif #if defined(SENSOR_SOI_F23) case SOI_F23_MIPI_2M_30FPS_10BIT: pSnsObj = &stSnsF23_Obj; break; #endif #if defined(SENSOR_SOI_F35) case SOI_F35_MIPI_2M_30FPS_10BIT: case SOI_F35_MIPI_2M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsF35_Obj; break; #endif #if defined(SENSOR_SOI_F35_SLAVE) case SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT: case SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsF35_Slave_Obj; break; #endif #if defined(SENSOR_SOI_F37P) case SOI_F37P_MIPI_2M_30FPS_10BIT: pSnsObj = &stSnsF37P_Obj; break; #endif #if defined(SENSOR_SOI_H65) case SOI_H65_MIPI_1M_30FPS_10BIT: pSnsObj = &stSnsH65_Obj; break; #endif #if defined(SENSOR_SOI_K06) case SOI_K06_MIPI_4M_25FPS_10BIT: return &stSnsK06_Obj; #endif #if defined(SENSOR_SOI_Q03) case SOI_Q03_MIPI_3M_30FPS_10BIT: pSnsObj = &stSnsQ03_Obj; break; #endif #if defined(SENSOR_SONY_IMX290_2L) case SONY_IMX290_MIPI_1M_30FPS_12BIT: case SONY_IMX290_MIPI_2M_60FPS_12BIT: pSnsObj = &stSnsImx290_2l_Obj; break; #endif #if defined(SENSOR_SONY_IMX307) case SONY_IMX307_MIPI_2M_30FPS_12BIT: case SONY_IMX307_MIPI_2M_60FPS_12BIT: case SONY_IMX307_MIPI_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx307_Obj; break; #endif #if defined(SENSOR_SONY_IMX307_SLAVE) case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT: case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx307_Slave_Obj; break; #endif #if defined(SENSOR_SONY_IMX307_2L) case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT: case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx307_2l_Obj; break; #endif #if defined(SENSOR_SONY_IMX307_SUBLVDS) case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT: case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx307_Sublvds_Obj; break; #endif #if defined(SENSOR_SONY_IMX327) case SONY_IMX327_MIPI_2M_30FPS_12BIT: case SONY_IMX327_MIPI_2M_60FPS_12BIT: case SONY_IMX327_MIPI_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx327_Obj; break; #endif #if defined(SENSOR_SONY_IMX327_SLAVE) case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT: case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx327_Slave_Obj; break; #endif #if defined(SENSOR_SONY_IMX327_2L) case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT: case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx327_2l_Obj; break; #endif #if defined(SENSOR_SONY_IMX327_FPGA) && defined(FPGA_PORTING) case SONY_IMX327_MIPI_1M_30FPS_10BIT: case SONY_IMX327_MIPI_1M_30FPS_10BIT_WDR2TO1: pSnsObj = &stSnsImx327_fpga_Obj; break; #endif #if defined(SENSOR_SONY_IMX327_SUBLVDS) case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT: case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx327_Sublvds_Obj; break; #endif #if defined(SENSOR_SONY_IMX334) case SONY_IMX334_MIPI_8M_30FPS_12BIT: case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx334_Obj; break; #endif #if defined(SENSOR_SONY_IMX335) case SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1: case SONY_IMX335_MIPI_4M_30FPS_12BIT: case SONY_IMX335_MIPI_4M_30FPS_10BIT_WDR2TO1: case SONY_IMX335_2L_MIPI_4M_30FPS_10BIT: case SONY_IMX335_MIPI_4M_1600P_30FPS_12BIT: case SONY_IMX335_MIPI_4M_1600P_30FPS_10BIT_WDR2TO1: case SONY_IMX335_MIPI_5M_30FPS_12BIT: case SONY_IMX335_MIPI_5M_30FPS_10BIT_WDR2TO1: case SONY_IMX335_MIPI_2M_60FPS_10BIT: case SONY_IMX335_MIPI_4M_60FPS_10BIT: case SONY_IMX335_MIPI_5M_60FPS_10BIT: pSnsObj = &stSnsImx335_Obj; break; #endif #if defined(SENSOR_SONY_IMX347) case SONY_IMX347_MIPI_4M_60FPS_12BIT: case SONY_IMX347_MIPI_4M_30FPS_12BIT_WDR2TO1: return &stSnsImx347_Obj; #endif #if defined(SENSOR_SONY_IMX385) case SONY_IMX385_MIPI_2M_30FPS_12BIT: case SONY_IMX385_MIPI_2M_30FPS_12BIT_WDR2TO1: pSnsObj = &stSnsImx385_Obj; break; #endif #if defined(SENSOR_TECHPOINT_TP2850) case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: pSnsObj = &stSnsTP2850_Obj; break; #endif #if defined(SENSOR_VIVO_MCS369) case VIVO_MCS369_2M_30FPS_12BIT: pSnsObj = &stSnsMCS369_Obj; break; #endif #if defined(SENSOR_VIVO_MCS369Q) case VIVO_MCS369Q_4M_30FPS_12BIT: pSnsObj = &stSnsMCS369Q_Obj; break; #endif #if defined(SENSOR_VIVO_MM308M2) case VIVO_MM308M2_2M_25FPS_8BIT: pSnsObj = &stSnsMM308M2_Obj; break; #endif default: pSnsObj = CVI_NULL; break; } return pSnsObj; } CVI_VOID *SAMPLE_COMM_ISP_GetSnsObj(CVI_U32 u32SnsId) { SAMPLE_SNS_TYPE_E enSnsType; enSnsType = g_enSnsType[u32SnsId]; return SAMPLE_COMM_GetSnsObj(enSnsType); } CVI_S32 SAMPLE_COMM_ISP_PatchSnsObj(CVI_U32 u32SnsId, SAMPLE_SENSOR_INFO_S *pstSnsInfo) { ISP_SNS_OBJ_S *pstSnsObj = (ISP_SNS_OBJ_S *)SAMPLE_COMM_ISP_GetSnsObj(u32SnsId); RX_INIT_ATTR_S stRxInitAttr; unsigned int i; if (pstSnsObj == CVI_NULL) { return CVI_FAILURE; } memset(&stRxInitAttr, 0, sizeof(RX_INIT_ATTR_S)); stRxInitAttr.MipiDev = pstSnsInfo->MipiDev; if (pstSnsInfo->stMclkAttr.bMclkEn) { stRxInitAttr.stMclkAttr.bMclkEn = CVI_TRUE; stRxInitAttr.stMclkAttr.u8Mclk = pstSnsInfo->stMclkAttr.u8Mclk; } for (i = 0; i < sizeof(stRxInitAttr.as16LaneId)/sizeof(CVI_S16); i++) { stRxInitAttr.as16LaneId[i] = pstSnsInfo->as16LaneId[i]; } for (i = 0; i < sizeof(stRxInitAttr.as8PNSwap)/sizeof(CVI_S8); i++) { stRxInitAttr.as8PNSwap[i] = pstSnsInfo->as8PNSwap[i]; } return (pstSnsObj->pfnPatchRxAttr) ? pstSnsObj->pfnPatchRxAttr(&stRxInitAttr) : CVI_SUCCESS; } #if 0 CVI_S32 SAMPLE_COMM_ISP_GetRxAttr(SAMPLE_VI_CONFIG_S *pstViConfig) { CVI_S32 s32Ret, i; ISP_SENSOR_EXP_FUNC_S stSnsrSensorFunc; SNS_COMBO_DEV_ATTR_S stDevAttr; const ISP_SNS_OBJ_S *pstSnsObj; for (i = 0; i < pstViConfig->s32WorkingViNum; i++) { pstViInfo = &pstViConfig->astViInfo[i]; ViPipe = pstViInfo->stPipeInfo.aPipe[i]; u32SnsId = pstViInfo->stSnsInfo.s32SnsId; pstSnsObj = (ISP_SNS_OBJ_S *)SAMPLE_COMM_ISP_GetSnsObj(u32SnsId); pstSnsObj.pfnGetRxAttr(ViPipe, &stDevAttr); } } #endif CVI_S32 SAMPLE_COMM_ISP_SetSensorMode(SAMPLE_VI_CONFIG_S *pstViConfig) { CVI_S32 s32Ret = CVI_SUCCESS, i; CVI_U32 u32SnsId; VI_PIPE ViPipe; WDR_MODE_E wdrMode; ISP_PUB_ATTR_S stPubAttr; ISP_SENSOR_EXP_FUNC_S stSnsrSensorFunc; ISP_CMOS_SENSOR_IMAGE_MODE_S stSnsrMode; SAMPLE_VI_INFO_S *pstViInfo = CVI_NULL; const ISP_SNS_OBJ_S *pstSnsObj; for (i = 0; i < pstViConfig->s32WorkingViNum; i++) { pstViInfo = &pstViConfig->astViInfo[i]; ViPipe = pstViInfo->stPipeInfo.aPipe[0]; wdrMode = pstViInfo->stDevInfo.enWDRMode; u32SnsId = pstViInfo->stSnsInfo.s32SnsId; pstSnsObj = (ISP_SNS_OBJ_S *)SAMPLE_COMM_ISP_GetSnsObj(u32SnsId); if (SAMPLE_COMM_ISP_GetIspAttrBySns(pstViInfo->stSnsInfo.enSnsType, &stPubAttr) != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "Can't get sns attr!\n"); return s32Ret; } stSnsrMode.u16Width = stPubAttr.stSnsSize.u32Width; stSnsrMode.u16Height = stPubAttr.stSnsSize.u32Height; stSnsrMode.f32Fps = stPubAttr.f32FrameRate; printf("stSnsrMode.u16Width %d stSnsrMode.u16Height %d %f wdrMode %d pstSnsObj %p\n", stSnsrMode.u16Width, stSnsrMode.u16Height, stSnsrMode.f32Fps, wdrMode, pstSnsObj); pstSnsObj->pfnExpSensorCb(&stSnsrSensorFunc); if (stSnsrSensorFunc.pfn_cmos_set_image_mode) { s32Ret = stSnsrSensorFunc.pfn_cmos_set_image_mode(ViPipe, &stSnsrMode); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "sensor set image mode failed!\n"); return s32Ret; } } if (stSnsrSensorFunc.pfn_cmos_set_wdr_mode) { s32Ret = stSnsrSensorFunc.pfn_cmos_set_wdr_mode(ViPipe, wdrMode); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "sensor set wdr mode failed!\n"); return s32Ret; } } } return s32Ret; } static SNS_BDG_MUX_MODE_E SAMPLE_COMM_ISP_GetSnsBdgMode(SAMPLE_SNS_TYPE_E enSnsType) { VI_DEV_ATTR_S stViDevAttr; SNS_BDG_MUX_MODE_E MuxMode; SAMPLE_COMM_VI_GetDevAttrBySns(enSnsType, &stViDevAttr); switch (stViDevAttr.enWorkMode) { case VI_WORK_MODE_1Multiplex: MuxMode = SNS_BDG_MUX_NONE; break; case VI_WORK_MODE_2Multiplex: MuxMode = SNS_BDG_MUX_2; break; case VI_WORK_MODE_3Multiplex: MuxMode = SNS_BDG_MUX_3; break; case VI_WORK_MODE_4Multiplex: MuxMode = SNS_BDG_MUX_4; break; default: MuxMode = SNS_BDG_MUX_NONE; break; } return MuxMode; } CVI_S32 SAMPLE_COMM_ISP_Sensor_Regiter_callback(ISP_DEV IspDev, CVI_U32 u32SnsId, CVI_S32 s32BusId, CVI_S32 s32I2cAddr) { CVI_S32 s32Ret = -1; SAMPLE_SNS_TYPE_E enSnsType = g_enSnsType[u32SnsId]; ALG_LIB_S stAeLib; ALG_LIB_S stAwbLib; const ISP_SNS_OBJ_S *pstSnsObj; ISP_INIT_ATTR_S *pstInitAttr = &gstInitAttr[u32SnsId]; ISP_SNS_COMMBUS_U unSnsrBusInfo = { .s8I2cDev = 3, }; #define SNSBUS_VLD(x) (x >= 0) if (u32SnsId > VI_MAX_DEV_NUM) { CVI_TRACE_LOG(CVI_DBG_ERR, "invalid sensor id: %d\n", u32SnsId); return CVI_FAILURE; } pstSnsObj = (ISP_SNS_OBJ_S *)SAMPLE_COMM_ISP_GetSnsObj(u32SnsId); if (pstSnsObj == CVI_NULL) { CVI_TRACE_LOG(CVI_DBG_ERR, "sensor %d not exist!\n", u32SnsId); return CVI_FAILURE; } pstInitAttr->enGainMode = SNS_GAIN_MODE_SHARE; if ((enSnsType == SOI_F35_MIPI_2M_30FPS_10BIT_WDR2TO1) || (enSnsType == SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1) || (enSnsType == OV_OS08A20_MIPI_8M_30FPS_10BIT_WDR2TO1) || (enSnsType == OV_OS08A20_MIPI_5M_30FPS_10BIT_WDR2TO1) || (enSnsType == OV_OS08A20_MIPI_4M_30FPS_10BIT_WDR2TO1) || (enSnsType == OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1)) { pstInitAttr->enL2SMode = SNS_L2S_MODE_FIX; } pstInitAttr->enSnsBdgMuxMode = SAMPLE_COMM_ISP_GetSnsBdgMode(enSnsType); if (pstSnsObj->pfnSetInit) { s32Ret = pstSnsObj->pfnSetInit(u32SnsId, pstInitAttr); if (s32Ret < 0) { CVI_TRACE_LOG(CVI_DBG_ERR, "pfnSetInit error id: %d s32Ret %d\n", IspDev, s32Ret); return CVI_FAILURE; } } /* set i2c bus info */ if (SNSBUS_VLD(s32BusId)) unSnsrBusInfo.s8I2cDev = (CVI_S8)s32BusId; s32Ret = pstSnsObj->pfnSetBusInfo(u32SnsId, unSnsrBusInfo); if (s32Ret < 0) { CVI_TRACE_LOG(CVI_DBG_ERR, "pfnSetBusInfo error id: %d s32Ret %d\n", IspDev, s32Ret); return CVI_FAILURE; } if (pstSnsObj->pfnPatchI2cAddr) pstSnsObj->pfnPatchI2cAddr(s32I2cAddr); stAeLib.s32Id = IspDev; stAwbLib.s32Id = IspDev; strncpy(stAeLib.acLibName, CVI_AE_LIB_NAME, sizeof(stAeLib.acLibName)); strncpy(stAwbLib.acLibName, CVI_AWB_LIB_NAME, sizeof(stAwbLib.acLibName)); // strncpy(stAfLib.acLibName, CVI_AF_LIB_NAME, sizeof(CVI_AF_LIB_NAME)); if (pstSnsObj->pfnRegisterCallback != CVI_NULL) { s32Ret = pstSnsObj->pfnRegisterCallback(IspDev, &stAeLib, &stAwbLib); if (s32Ret != CVI_SUCCESS) { CVI_TRACE_LOG(CVI_DBG_ERR, "sensor_register_callback failed with %#x!\n", s32Ret); return s32Ret; } } else { CVI_TRACE_LOG(CVI_DBG_ERR, "sensor_register_callback failed with CVI_NULL!\n"); return CVI_FAILURE; } g_au32IspSnsId[IspDev] = u32SnsId; return CVI_SUCCESS; } CVI_S32 SAMPLE_COMM_ISP_Sensor_UnRegiter_callback(ISP_DEV IspDev) { ALG_LIB_S stAeLib; ALG_LIB_S stAwbLib; CVI_U32 u32SnsId; const ISP_SNS_OBJ_S *pstSnsObj; CVI_S32 s32Ret = -1; u32SnsId = g_au32IspSnsId[IspDev]; if (u32SnsId > VI_MAX_DEV_NUM) { SAMPLE_PRT("%s: invalid sensor id: %d\n", __func__, u32SnsId); return CVI_FAILURE; } pstSnsObj = (ISP_SNS_OBJ_S *)SAMPLE_COMM_ISP_GetSnsObj(u32SnsId); if (pstSnsObj == CVI_NULL) { return CVI_FAILURE; } stAeLib.s32Id = IspDev; stAwbLib.s32Id = IspDev; strncpy(stAeLib.acLibName, CVI_AE_LIB_NAME, sizeof(stAeLib.acLibName)); strncpy(stAwbLib.acLibName, CVI_AWB_LIB_NAME, sizeof(stAwbLib.acLibName)); // strncpy(stAfLib.acLibName, CVI_AF_LIB_NAME, sizeof(CVI_AF_LIB_NAME)); if (pstSnsObj->pfnUnRegisterCallback != CVI_NULL) { s32Ret = pstSnsObj->pfnUnRegisterCallback(IspDev, &stAeLib, &stAwbLib); if (s32Ret != CVI_SUCCESS) { SAMPLE_PRT("sensor_unregister_callback failed with %#x!\n", s32Ret); return s32Ret; } } else { SAMPLE_PRT("sensor_unregister_callback failed with CVI_NULL!\n"); } return CVI_SUCCESS; }