324 lines
8.7 KiB
C
324 lines
8.7 KiB
C
|
/******************************************************************************
|
||
|
Some simple Hisilicon Hi35xx isp functions.
|
||
|
|
||
|
Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd.
|
||
|
******************************************************************************
|
||
|
Modification: 2011-2 Created
|
||
|
******************************************************************************/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
#if __cplusplus
|
||
|
extern "C"{
|
||
|
#endif
|
||
|
#endif /* End of #ifdef __cplusplus */
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <sys/ioctl.h>
|
||
|
#include <sys/poll.h>
|
||
|
#include <sys/time.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <errno.h>
|
||
|
#include <pthread.h>
|
||
|
#include <math.h>
|
||
|
#include <unistd.h>
|
||
|
#include <signal.h>
|
||
|
#include "sample_comm.h"
|
||
|
|
||
|
static pthread_t gs_IspPid = 0;
|
||
|
static HI_BOOL gbIspInited = HI_FALSE;
|
||
|
|
||
|
|
||
|
/******************************************************************************
|
||
|
* funciton : ISP init
|
||
|
******************************************************************************/
|
||
|
HI_S32 SAMPLE_COMM_ISP_Init(WDR_MODE_E enWDRMode)
|
||
|
{
|
||
|
ISP_DEV IspDev = 0;
|
||
|
HI_S32 s32Ret;
|
||
|
ISP_PUB_ATTR_S stPubAttr;
|
||
|
ALG_LIB_S stLib;
|
||
|
|
||
|
#if 0
|
||
|
/* 0. set cmos iniparser file path */
|
||
|
s32Ret = sensor_set_inifile_path("configs/");
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: set cmos iniparser file path failed with %#x!\n", \
|
||
|
__FUNCTION__, s32Ret);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/* 1. sensor register callback */
|
||
|
s32Ret = sensor_register_callback();
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: sensor_register_callback failed with %#x!\n", \
|
||
|
__FUNCTION__, s32Ret);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
/* 2. register hisi ae lib */
|
||
|
stLib.s32Id = 0;
|
||
|
strcpy(stLib.acLibName, HI_AE_LIB_NAME);
|
||
|
s32Ret = HI_MPI_AE_Register(IspDev, &stLib);
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: HI_MPI_AE_Register failed!\n", __FUNCTION__);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
/* 3. register hisi awb lib */
|
||
|
stLib.s32Id = 0;
|
||
|
strcpy(stLib.acLibName, HI_AWB_LIB_NAME);
|
||
|
s32Ret = HI_MPI_AWB_Register(IspDev, &stLib);
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: HI_MPI_AWB_Register failed!\n", __FUNCTION__);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
/* 4. register hisi af lib */
|
||
|
stLib.s32Id = 0;
|
||
|
strcpy(stLib.acLibName, HI_AF_LIB_NAME);
|
||
|
s32Ret = HI_MPI_AF_Register(IspDev, &stLib);
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: HI_MPI_AF_Register failed!\n", __FUNCTION__);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
/* 5. isp mem init */
|
||
|
s32Ret = HI_MPI_ISP_MemInit(IspDev);
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
/* 6. isp set WDR mode */
|
||
|
ISP_WDR_MODE_S stWdrMode;
|
||
|
stWdrMode.enWDRMode = enWDRMode;
|
||
|
s32Ret = HI_MPI_ISP_SetWDRMode(0, &stWdrMode);
|
||
|
if (HI_SUCCESS != s32Ret)
|
||
|
{
|
||
|
printf("start ISP WDR failed!\n");
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
/* 7. isp set pub attributes */
|
||
|
/* note : different sensor, different ISP_PUB_ATTR_S define.
|
||
|
if the sensor you used is different, you can change
|
||
|
ISP_PUB_ATTR_S definition */
|
||
|
|
||
|
switch(SENSOR_TYPE)
|
||
|
{
|
||
|
case APTINA_9M034_DC_720P_30FPS:
|
||
|
case APTINA_AR0130_DC_720P_30FPS:
|
||
|
stPubAttr.enBayer = BAYER_GRBG;
|
||
|
stPubAttr.f32FrameRate = 30;
|
||
|
stPubAttr.stWndRect.s32X = 0;
|
||
|
stPubAttr.stWndRect.s32Y = 0;
|
||
|
stPubAttr.stWndRect.u32Width = 1280;
|
||
|
stPubAttr.stWndRect.u32Height = 720;
|
||
|
break;
|
||
|
|
||
|
case SONY_IMX122_DC_1080P_30FPS:
|
||
|
stPubAttr.enBayer = BAYER_RGGB;
|
||
|
stPubAttr.f32FrameRate = 30;
|
||
|
stPubAttr.stWndRect.s32X = 200;
|
||
|
stPubAttr.stWndRect.s32Y = 20;
|
||
|
stPubAttr.stWndRect.u32Width = 1920;
|
||
|
stPubAttr.stWndRect.u32Height = 1080;
|
||
|
break;
|
||
|
|
||
|
case SONY_IMX122_DC_720P_30FPS:
|
||
|
stPubAttr.enBayer = BAYER_RGGB;
|
||
|
stPubAttr.f32FrameRate = 30;
|
||
|
stPubAttr.stWndRect.s32X = 200;
|
||
|
stPubAttr.stWndRect.s32Y = 20;
|
||
|
stPubAttr.stWndRect.u32Width = 1280;
|
||
|
stPubAttr.stWndRect.u32Height = 720;
|
||
|
break;
|
||
|
|
||
|
case APTINA_AR0230_HISPI_1080P_30FPS:
|
||
|
stPubAttr.enBayer = BAYER_GRBG;
|
||
|
stPubAttr.f32FrameRate = 30;
|
||
|
stPubAttr.stWndRect.s32X = 0;
|
||
|
stPubAttr.stWndRect.s32Y = 0;
|
||
|
stPubAttr.stWndRect.u32Width = 1920;
|
||
|
stPubAttr.stWndRect.u32Height = 1080;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
stPubAttr.enBayer = BAYER_GRBG;
|
||
|
stPubAttr.f32FrameRate = 30;
|
||
|
stPubAttr.stWndRect.s32X = 0;
|
||
|
stPubAttr.stWndRect.s32Y = 0;
|
||
|
stPubAttr.stWndRect.u32Width = 1920;
|
||
|
stPubAttr.stWndRect.u32Height = 1080;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
s32Ret = HI_MPI_ISP_SetPubAttr(IspDev, &stPubAttr);
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: HI_MPI_ISP_SetPubAttr failed with %#x!\n", __FUNCTION__, s32Ret);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
/* 8. isp init */
|
||
|
s32Ret = HI_MPI_ISP_Init(IspDev);
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: HI_MPI_ISP_Init failed!\n", __FUNCTION__);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
gbIspInited = HI_TRUE;
|
||
|
|
||
|
return HI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
HI_VOID* Test_ISP_Run(HI_VOID *param)
|
||
|
{
|
||
|
ISP_DEV IspDev = 0;
|
||
|
HI_MPI_ISP_Run(IspDev);
|
||
|
|
||
|
return HI_NULL;
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
* funciton : ISP Run
|
||
|
******************************************************************************/
|
||
|
HI_S32 SAMPLE_COMM_ISP_Run()
|
||
|
{
|
||
|
#if 1
|
||
|
if (0 != pthread_create(&gs_IspPid, 0, (void* (*)(void*))Test_ISP_Run, NULL))
|
||
|
{
|
||
|
printf("%s: create isp running thread failed!\n", __FUNCTION__);
|
||
|
return HI_FAILURE;
|
||
|
}
|
||
|
#else
|
||
|
/* configure thread priority */
|
||
|
if (1)
|
||
|
{
|
||
|
#include <sched.h>
|
||
|
|
||
|
pthread_attr_t attr;
|
||
|
struct sched_param param;
|
||
|
int newprio = 50;
|
||
|
|
||
|
pthread_attr_init(&attr);
|
||
|
|
||
|
if (1)
|
||
|
{
|
||
|
int policy = 0;
|
||
|
int min, max;
|
||
|
|
||
|
pthread_attr_getschedpolicy(&attr, &policy);
|
||
|
printf("-->default thread use policy is %d --<\n", policy);
|
||
|
|
||
|
pthread_attr_setschedpolicy(&attr, SCHED_RR);
|
||
|
pthread_attr_getschedpolicy(&attr, &policy);
|
||
|
printf("-->current thread use policy is %d --<\n", policy);
|
||
|
|
||
|
switch (policy)
|
||
|
{
|
||
|
case SCHED_FIFO:
|
||
|
printf("-->current thread use policy is SCHED_FIFO --<\n");
|
||
|
break;
|
||
|
|
||
|
case SCHED_RR:
|
||
|
printf("-->current thread use policy is SCHED_RR --<\n");
|
||
|
break;
|
||
|
|
||
|
case SCHED_OTHER:
|
||
|
printf("-->current thread use policy is SCHED_OTHER --<\n");
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
printf("-->current thread use policy is UNKNOW --<\n");
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
min = sched_get_priority_min(policy);
|
||
|
max = sched_get_priority_max(policy);
|
||
|
|
||
|
printf("-->current thread policy priority range (%d ~ %d) --<\n", min, max);
|
||
|
}
|
||
|
|
||
|
pthread_attr_getschedparam(&attr, ¶m);
|
||
|
|
||
|
printf("-->default isp thread priority is %d , next be %d --<\n", param.sched_priority, newprio);
|
||
|
param.sched_priority = newprio;
|
||
|
pthread_attr_setschedparam(&attr, ¶m);
|
||
|
|
||
|
if (0 != pthread_create(&gs_IspPid, &attr, (void* (*)(void*))HI_MPI_ISP_Run, NULL))
|
||
|
{
|
||
|
printf("%s: create isp running thread failed!\n", __FUNCTION__);
|
||
|
return HI_FAILURE;
|
||
|
}
|
||
|
|
||
|
pthread_attr_destroy(&attr);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
return HI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
* funciton : change between linear and wdr mode
|
||
|
******************************************************************************/
|
||
|
HI_S32 SAMPLE_COMM_ISP_ChangeSensorMode(HI_U8 u8Mode)
|
||
|
{
|
||
|
ISP_DEV IspDev = 0;
|
||
|
HI_S32 s32Ret;
|
||
|
|
||
|
ISP_WDR_MODE_S stWDRMode;
|
||
|
stWDRMode.enWDRMode = u8Mode;
|
||
|
s32Ret = HI_MPI_ISP_SetWDRMode(IspDev, &stWDRMode);
|
||
|
if (s32Ret != HI_SUCCESS)
|
||
|
{
|
||
|
printf("%s: HI_MPI_ISP_SetWDRMode failed with %#x!\n",
|
||
|
__FUNCTION__, s32Ret);
|
||
|
return s32Ret;
|
||
|
}
|
||
|
|
||
|
return HI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
/******************************************************************************
|
||
|
* funciton : stop ISP, and stop isp thread
|
||
|
******************************************************************************/
|
||
|
HI_VOID SAMPLE_COMM_ISP_Stop()
|
||
|
{
|
||
|
ISP_DEV IspDev = 0;
|
||
|
|
||
|
if (!gbIspInited)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
HI_MPI_ISP_Exit(IspDev);
|
||
|
if (gs_IspPid)
|
||
|
{
|
||
|
pthread_join(gs_IspPid, 0);
|
||
|
gs_IspPid = 0;
|
||
|
}
|
||
|
gbIspInited = HI_FALSE;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
#if __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
#endif /* End of #ifdef __cplusplus */
|
||
|
|