Files
Linux_Drivers/middleware/v2/sample/common/sample_common_platform.c
sam.xiang 9b648a187d middleware: weekly update 2023-03-25
1. add ov5647 sensor driver and configuration
	2. support tp2825
	3. update some func
	4. Detach the sensor into a separate file

Change-Id: If49bf2ec3728bcbd7c132f8c26a2ae194e4c1bdc
2023-03-27 00:24:58 +08:00

355 lines
11 KiB
C

#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/param.h>
#include <signal.h>
#include "cvi_buffer.h"
#include "cvi_ae_comm.h"
#include "cvi_awb_comm.h"
#include "cvi_comm_isp.h"
#include "sample_comm.h"
SAMPLE_VI_CONFIG_S stViConfigSys;
void _SAMPLE_PLAT_ERR_Exit(void)
{
if (stViConfigSys.s32WorkingViNum != 0) {
SAMPLE_COMM_VI_DestroyIsp(&stViConfigSys);
SAMPLE_COMM_VI_DestroyVi(&stViConfigSys);
}
SAMPLE_COMM_SYS_Exit();
}
void _SAMPLE_PLAT_SYS_HandleSig(int nSignal, siginfo_t *si, void *arg)
{
UNUSED(nSignal);
UNUSED(si);
UNUSED(arg);
_SAMPLE_PLAT_ERR_Exit();
exit(1);
}
CVI_S32 SAMPLE_PLAT_SYS_INIT(SIZE_S stSize)
{
VB_CONFIG_S stVbConf;
CVI_U32 u32BlkSize, u32BlkRotSize;
CVI_S32 s32Ret = CVI_SUCCESS;
COMPRESS_MODE_E enCompressMode = COMPRESS_MODE_NONE;
struct sigaction sa = {};
memset(&sa, 0, sizeof(struct sigaction));
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = _SAMPLE_PLAT_SYS_HandleSig;
sa.sa_flags = SA_SIGINFO|SA_RESETHAND; // Reset signal handler to system default after signal triggered
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
memset(&stVbConf, 0, sizeof(VB_CONFIG_S));
stVbConf.u32MaxPoolCnt = 1;
u32BlkSize = COMMON_GetPicBufferSize(stSize.u32Width, stSize.u32Height, SAMPLE_PIXEL_FORMAT,
DATA_BITWIDTH_8, enCompressMode, DEFAULT_ALIGN);
u32BlkRotSize = COMMON_GetPicBufferSize(stSize.u32Height, stSize.u32Width, SAMPLE_PIXEL_FORMAT,
DATA_BITWIDTH_8, enCompressMode, DEFAULT_ALIGN);
u32BlkSize = MAX(u32BlkSize, u32BlkRotSize);
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
#if !defined(DDR_64MB_SIZE)
stVbConf.astCommPool[0].u32BlkCnt = 8;
#else
stVbConf.astCommPool[0].u32BlkCnt = 4;
#endif
stVbConf.astCommPool[0].enRemapMode = VB_REMAP_MODE_CACHED;
SAMPLE_PRT("common pool[0] BlkSize %d\n", u32BlkSize);
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "system init failed with %#x\n", s32Ret);
goto error;
}
return s32Ret;
error:
_SAMPLE_PLAT_ERR_Exit();
return s32Ret;
}
CVI_S32 SAMPLE_PLAT_VI_INIT(SAMPLE_VI_CONFIG_S *pstViConfig)
{
PIC_SIZE_E enPicSize;
SIZE_S stSize;
VI_DEV ViDev = 0;
VI_PIPE ViPipe = 0;
VI_PIPE_ATTR_S stPipeAttr;
CVI_S32 s32Ret = CVI_SUCCESS;
CVI_S32 i = 0, j = 0;
CVI_S32 s32DevNum;
memcpy((void *)&stViConfigSys, (void *)pstViConfig, sizeof(SAMPLE_VI_CONFIG_S));
/************************************************
* step1: Get input size
************************************************/
s32Ret = SAMPLE_COMM_VI_GetSizeBySensor(pstViConfig->astViInfo[ViDev].stSnsInfo.enSnsType, &enPicSize);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VI_GetSizeBySensor failed with %#x\n", s32Ret);
goto error;
}
s32Ret = SAMPLE_COMM_SYS_GetPicSize(enPicSize, &stSize);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_SYS_GetPicSize failed with %#x\n", s32Ret);
goto error;
}
/************************************************
* step2: Init VI ISP
************************************************/
#if USE_USER_SEN_DRIVER
s32Ret = SAMPLE_COMM_VI_StartSensor(pstViConfig);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "system start sensor failed with %#x\n", s32Ret);
goto error;
}
#endif
for (i = 0; i < pstViConfig->s32WorkingViNum; i++) {
ViDev = i;
s32Ret = SAMPLE_COMM_VI_StartDev(&pstViConfig->astViInfo[ViDev]);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "VI_StartDev failed with %#x!\n", s32Ret);
goto error;
}
}
#if USE_USER_SEN_DRIVER
s32Ret = SAMPLE_COMM_VI_StartMIPI(pstViConfig);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "system start MIPI failed with %#x\n", s32Ret);
goto error;
}
s32Ret = SAMPLE_COMM_VI_SensorProbe(pstViConfig);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "system sensor probe failed with %#x\n", s32Ret);
goto error;
}
#endif
stPipeAttr.bYuvSkip = CVI_FALSE;
stPipeAttr.u32MaxW = stSize.u32Width;
stPipeAttr.u32MaxH = stSize.u32Height;
stPipeAttr.enPixFmt = PIXEL_FORMAT_RGB_BAYER_12BPP;
stPipeAttr.enBitWidth = DATA_BITWIDTH_12;
stPipeAttr.stFrameRate.s32SrcFrameRate = -1;
stPipeAttr.stFrameRate.s32DstFrameRate = -1;
stPipeAttr.bNrEn = CVI_TRUE;
stPipeAttr.bYuvBypassPath = CVI_FALSE;
stPipeAttr.enCompressMode = pstViConfig->astViInfo[0].stChnInfo.enCompressMode;
for (i = 0; i < pstViConfig->s32WorkingViNum; i++) {
SAMPLE_VI_INFO_S *pstViInfo = NULL;
SAMPLE_SNS_TYPE_E sns_type;
s32DevNum = pstViConfig->as32WorkingViId[i];
pstViInfo = &pstViConfig->astViInfo[s32DevNum];
sns_type = pstViInfo->stSnsInfo.enSnsType;
stPipeAttr.bYuvBypassPath = SAMPLE_COMM_VI_GetYuvBypassSts(sns_type);
for (j = 0; j < WDR_MAX_PIPE_NUM; j++) {
if (pstViInfo->stPipeInfo.aPipe[j] >= 0 && pstViInfo->stPipeInfo.aPipe[j] < VI_MAX_PIPE_NUM) {
ViPipe = pstViInfo->stPipeInfo.aPipe[j];
s32Ret = CVI_VI_CreatePipe(ViPipe, &stPipeAttr);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "CVI_VI_CreatePipe failed with %#x!\n", s32Ret);
goto error;
}
s32Ret = CVI_VI_StartPipe(ViPipe);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "CVI_VI_StartPipe failed with %#x!\n", s32Ret);
goto error;
}
s32Ret = CVI_VI_GetPipeAttr(ViPipe, &stPipeAttr);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "CVI_VI_GetPipeAttr failed with %#x!\n", s32Ret);
goto error;
}
}
}
}
s32Ret = SAMPLE_COMM_VI_CreateIsp(pstViConfig);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "VI_CreateIsp failed with %#x!\n", s32Ret);
goto error;
}
s32Ret = SAMPLE_COMM_VI_StartViChn(pstViConfig);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "VI_StartViChn failed with %#x!\n", s32Ret);
goto error;
}
return s32Ret;
error:
_SAMPLE_PLAT_ERR_Exit();
return s32Ret;
}
CVI_S32 SAMPLE_PLAT_VPSS_INIT(VPSS_GRP VpssGrp, SIZE_S stSizeIn, SIZE_S stSizeOut)
{
VPSS_GRP_ATTR_S stVpssGrpAttr;
VPSS_CHN VpssChn = VPSS_CHN0;
CVI_BOOL abChnEnable[VPSS_MAX_PHY_CHN_NUM] = {0};
VPSS_CHN_ATTR_S astVpssChnAttr[VPSS_MAX_PHY_CHN_NUM];
CVI_S32 s32Ret = CVI_SUCCESS;
stVpssGrpAttr.stFrameRate.s32SrcFrameRate = -1;
stVpssGrpAttr.stFrameRate.s32DstFrameRate = -1;
stVpssGrpAttr.enPixelFormat = SAMPLE_PIXEL_FORMAT;
stVpssGrpAttr.u32MaxW = stSizeIn.u32Width;
stVpssGrpAttr.u32MaxH = stSizeIn.u32Height;
stVpssGrpAttr.u8VpssDev = 0;
astVpssChnAttr[VpssChn].u32Width = stSizeOut.u32Width;
astVpssChnAttr[VpssChn].u32Height = stSizeOut.u32Height;
astVpssChnAttr[VpssChn].enVideoFormat = VIDEO_FORMAT_LINEAR;
astVpssChnAttr[VpssChn].enPixelFormat = SAMPLE_PIXEL_FORMAT;
astVpssChnAttr[VpssChn].stFrameRate.s32SrcFrameRate = 30;
astVpssChnAttr[VpssChn].stFrameRate.s32DstFrameRate = 30;
astVpssChnAttr[VpssChn].u32Depth = 0;
astVpssChnAttr[VpssChn].bMirror = CVI_TRUE;
astVpssChnAttr[VpssChn].bFlip = CVI_TRUE;
astVpssChnAttr[VpssChn].stAspectRatio.enMode = ASPECT_RATIO_AUTO;
astVpssChnAttr[VpssChn].stAspectRatio.bEnableBgColor = CVI_TRUE;
astVpssChnAttr[VpssChn].stAspectRatio.u32BgColor = COLOR_RGB_BLACK;
astVpssChnAttr[VpssChn].stNormalize.bEnable = CVI_FALSE;
/*start vpss*/
abChnEnable[0] = CVI_TRUE;
s32Ret = SAMPLE_COMM_VPSS_Init(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr);
if (s32Ret != CVI_SUCCESS) {
SAMPLE_PRT("init vpss group failed. s32Ret: 0x%x !\n", s32Ret);
goto error;
}
s32Ret = SAMPLE_COMM_VPSS_Start(VpssGrp, abChnEnable, &stVpssGrpAttr, astVpssChnAttr);
if (s32Ret != CVI_SUCCESS) {
SAMPLE_PRT("start vpss group failed. s32Ret: 0x%x !\n", s32Ret);
goto error;
}
return s32Ret;
error:
_SAMPLE_PLAT_ERR_Exit();
return s32Ret;
}
CVI_S32 SAMPLE_PLAT_VO_INIT_BT656(void)
{
SAMPLE_VO_CONFIG_S stVoConfig;
RECT_S stDefDispRect = {0, 0, 720, 576};
SIZE_S stDefImageSize = {720, 576};
CVI_S32 s32Ret = CVI_SUCCESS;
CVI_U32 panel_init = false;
VO_PUB_ATTR_S stVoPubAttr;
CVI_VO_Get_Panel_Status(0, 0, &panel_init);
if (panel_init) {
CVI_VO_GetPubAttr(0, &stVoPubAttr);
CVI_TRACE_LOG(CVI_DBG_NOTICE, "Panel w=%d, h=%d.\n",\
stVoPubAttr.stSyncInfo.u16Hact, stVoPubAttr.stSyncInfo.u16Vact);
stDefDispRect.u32Width = stVoPubAttr.stSyncInfo.u16Hact;
stDefDispRect.u32Height = stVoPubAttr.stSyncInfo.u16Vact;
stDefImageSize.u32Width = stVoPubAttr.stSyncInfo.u16Hact;
stDefImageSize.u32Height = stVoPubAttr.stSyncInfo.u16Vact;
}
s32Ret = SAMPLE_COMM_VO_GetDefConfig(&stVoConfig);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VO_GetDefConfig failed with %#x\n", s32Ret);
goto error;
}
stVoConfig.VoDev = 0;
stVoConfig.stVoPubAttr.enIntfType = VO_INTF_BT656;
stVoConfig.stVoPubAttr.enIntfSync = VO_OUTPUT_576P50;
stVoConfig.stDispRect = stDefDispRect;
stVoConfig.stImageSize = stDefImageSize;
stVoConfig.enPixFormat = SAMPLE_PIXEL_FORMAT;
stVoConfig.enVoMode = VO_MODE_1MUX;
s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig);
if (s32Ret != CVI_SUCCESS) {
SAMPLE_PRT("SAMPLE_COMM_VO_StartVO failed with %#x\n", s32Ret);
goto error;
}
return s32Ret;
error:
_SAMPLE_PLAT_ERR_Exit();
return s32Ret;
}
CVI_S32 SAMPLE_PLAT_VO_INIT(void)
{
SAMPLE_VO_CONFIG_S stVoConfig;
RECT_S stDefDispRect = {0, 0, 720, 1280};
SIZE_S stDefImageSize = {720, 1280};
CVI_S32 s32Ret = CVI_SUCCESS;
CVI_U32 panel_init = false;
VO_PUB_ATTR_S stVoPubAttr;
CVI_VO_Get_Panel_Status(0, 0, &panel_init);
if (panel_init) {
CVI_VO_GetPubAttr(0, &stVoPubAttr);
CVI_TRACE_LOG(CVI_DBG_NOTICE, "Panel w=%d, h=%d.\n",\
stVoPubAttr.stSyncInfo.u16Hact, stVoPubAttr.stSyncInfo.u16Vact);
stDefDispRect.u32Width = stVoPubAttr.stSyncInfo.u16Hact;
stDefDispRect.u32Height = stVoPubAttr.stSyncInfo.u16Vact;
stDefImageSize.u32Width = stVoPubAttr.stSyncInfo.u16Hact;
stDefImageSize.u32Height = stVoPubAttr.stSyncInfo.u16Vact;
}
s32Ret = SAMPLE_COMM_VO_GetDefConfig(&stVoConfig);
if (s32Ret != CVI_SUCCESS) {
CVI_TRACE_LOG(CVI_DBG_ERR, "SAMPLE_COMM_VO_GetDefConfig failed with %#x\n", s32Ret);
goto error;
}
stVoConfig.VoDev = 0;
stVoConfig.stVoPubAttr.enIntfType = VO_INTF_MIPI;
stVoConfig.stVoPubAttr.enIntfSync = VO_OUTPUT_720x1280_60;
stVoConfig.stDispRect = stDefDispRect;
stVoConfig.stImageSize = stDefImageSize;
stVoConfig.enPixFormat = SAMPLE_PIXEL_FORMAT;
stVoConfig.enVoMode = VO_MODE_1MUX;
s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig);
if (s32Ret != CVI_SUCCESS) {
SAMPLE_PRT("SAMPLE_COMM_VO_StartVO failed with %#x\n", s32Ret);
goto error;
}
return s32Ret;
error:
_SAMPLE_PLAT_ERR_Exit();
return s32Ret;
}