int startIsp(void) { HI_S32 s32Ret; ISP_IMAGE_ATTR_S stImageAttr; ISP_INPUT_TIMING_S stInputTiming; /* 1. isp init */ s32Ret = ISP_SensorInit(); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__); return s32Ret; } /* 2. isp set image attributes */ /* note : different sensor, different ISP_IMAGE_ATTR_S define. if the sensor you used is different, you can change ISP_IMAGE_ATTR_S definition */ // case OMNI_OV9712_DC_720P_30FPS: stImageAttr.enBayer = 1;//BAYER_BGGR; stImageAttr.u16FrameRate = 30; stImageAttr.u16Width = 1280; stImageAttr.u16Height = 720; s32Ret = HI_MPI_ISP_SetImageAttr(&stImageAttr); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_SetImageAttr failed with %#x!\n", __FUNCTION__, s32Ret); return s32Ret; } /* 3. isp set timing */ stInputTiming.enWndMode = 0; s32Ret = HI_MPI_ISP_SetInputTiming(&stInputTiming); if (s32Ret != HI_SUCCESS) { printf("%s: HI_MPI_ISP_SetInputTiming failed with %#x!\n", __FUNCTION__, s32Ret); return s32Ret; } return HI_SUCCESS; }
/***************************************************************************** Prototype : HI_MPI_ISP_Init Description : isp initial process, include extent memory, top structure, default value, etc. Input : I_VOID ** Output : None Return Value : Process : Note : History 1.Date : 2011/1/13 Author : x00100808 Modification : Created function *****************************************************************************/ HI_S32 HI_MPI_ISP_Init(ISP_DEV IspDev) { HI_S32 s32Ret; ISP_CTX_S *pstIspCtx = HI_NULL; HI_U8 u8WDRMode; HI_U32 u32Value = 0; HI_VOID *pValue = HI_NULL; ISP_CMOS_SENSOR_IMAGE_MODE_S stSnsImageMode; /* 1. check status */ ISP_CHECK_DEV(IspDev); ISP_GET_CTX(IspDev, pstIspCtx); ISP_CHECK_POINTER(pstIspCtx); ISP_CHECK_OPEN(IspDev); ISP_CHECK_SENSOR_REGISTER(IspDev); ISP_CHECK_MEM_INIT(IspDev); pstIspCtx->stIspParaRec.bWDRCfg = hi_ext_top_wdr_cfg_read(); ISP_CHECK_ISP_WDR_CFG(IspDev); pstIspCtx->stIspParaRec.bPubCfg = hi_ext_top_pub_attr_cfg_read(); ISP_CHECK_ISP_PUB_ATTR_CFG(IspDev); if (HI_TRUE == pstIspCtx->stIspParaRec.bInit) { return HI_SUCCESS; } /* 2. init statistics bufs. */ s32Ret = ISP_StatisticsInit(IspDev); if (HI_SUCCESS != s32Ret) { printf("ISP[%d] Init statistics failed\n", IspDev); goto fail0; } /* 3. init proc bufs. */ s32Ret = ISP_ProcInit(IspDev); if (HI_SUCCESS != s32Ret) { goto fail1; } /* 4. init ispupdate bufs. */ s32Ret = ISP_UpdateInfoInit(IspDev, &pstIspCtx->stUpdateInfoCtrl); if (HI_SUCCESS != s32Ret) { goto fail2; } /* 5. set WDR mode to sensor and update isp param from sensor and sensor init */ u8WDRMode = hi_ext_top_sensor_wdr_mode_read(); s32Ret = ISP_SensorSetWDRMode(IspDev, u8WDRMode); if (HI_SUCCESS != s32Ret) { printf("ISP[%d] set sensor WDR mode failed!\n", IspDev); s32Ret = HI_ERR_ISP_NOT_INIT; goto fail3; } stSnsImageMode.u16Width = hi_ext_sync_total_width_read(); stSnsImageMode.u16Height = hi_ext_sync_total_height_read(); u32Value = hi_ext_system_fps_base_read(); pValue = (HI_VOID *)&u32Value; stSnsImageMode.f32Fps = *(HI_FLOAT *)pValue; s32Ret = ISP_SensorSetImageMode(IspDev, &stSnsImageMode); if (HI_SUCCESS != s32Ret) { printf("ISP[%d] set sensor image mode failed!\n", IspDev); s32Ret = HI_ERR_ISP_NOT_INIT; goto fail3; } s32Ret = ISP_SensorInit(IspDev); if (HI_SUCCESS != s32Ret) { printf("ISP[%d] init sensor failed!\n", IspDev); s32Ret = HI_ERR_ISP_NOT_INIT; goto fail3; } s32Ret = ISP_SensorUpdateAll(IspDev); if (HI_SUCCESS != s32Ret) { printf("ISP[%d] update sensor all failed!\n", IspDev); s32Ret = HI_ERR_ISP_NOT_INIT; goto fail3; } /* 6. init the common part of extern registers and real registers */ ISP_ExtRegsDefault(); ISP_RegsDefault(); ISP_ExtRegsInitialize(IspDev); ISP_RegsInitialize(IspDev); /* 7. isp algs global variable initialize */ ISP_GlobalInitialize(IspDev); /* 8. register all algorithm to isp, and init them. */ ISP_AlgsRegister(IspDev); ISP_AlgsInit(pstIspCtx->astAlgs, IspDev); /* 9. set WDR mode to kernel. */ s32Ret = ISP_WDRCfgSet(IspDev); if (HI_SUCCESS != s32Ret) { printf("ISP[%d] set WDR mode to kernel failed!\n", IspDev); goto fail3; } /* 10. init isp global variables */ if (pthread_mutex_init(&pstIspCtx->stLock, HI_NULL) != 0) { s32Ret = HI_FAILURE; goto fail3; } if (ioctl(g_as32IspFd[IspDev], ISP_SET_REGNEWER) < 0) { perror("Set ISP Regnewer failed!\n"); goto fail4;; } MUTEX_LOCK(pstIspCtx->stLock); pstIspCtx->stIspParaRec.bInit = HI_TRUE; pstIspCtx->stIspParaRec.bRunEn = HI_TRUE; MUTEX_UNLOCK(pstIspCtx->stLock); return HI_SUCCESS; fail4: pthread_mutex_destroy(&pstIspCtx->stLock); fail3: ISP_UpdateInfoExit(IspDev, &pstIspCtx->stUpdateInfoCtrl); fail2: ISP_ProcExit(IspDev); fail1: ISP_StatisticsExit(IspDev); fail0: //VReg_Exit(ISP_VREG_BASE, ISP_VREG_SIZE); return s32Ret; }