You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

287 lines
9.1 KiB

3 years ago
/******************************************************************************
Copyright (C), 2001-2011, Hisilicon Tech. Co., Ltd.
******************************************************************************
File Name : hi_comm_pciv.h
Version : Initial Draft
Author : Hisilicon multimedia software pciv
Created : 2008/06/04
Last Modified :
Description : common struct definition for PCIV
Function List :
History :
******************************************************************************/
#ifndef __HI_COMM_PCIV_H__
#define __HI_COMM_PCIV_H__
#include "hi_type.h"
#include "hi_common.h"
#include "hi_errno.h"
#include "hi_comm_video.h"
#include "hi_comm_vdec.h"
#include "hi_comm_vpss.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
typedef HI_S32 PCIV_CHN;
#define PCIV_MAX_BUF_NUM 16 /* pciv channel max buffer number */
#define PCIV_MAX_CHIPNUM 32 /* max pciv device number which can join in the system */
#define PCIV_TIMER_EXPIRES 10
#define MAKE_DWORD(high,low) (((low)&0x0000ffff)|((high)<<16))
#define HIGH_WORD(x) (((x)&0xffff0000)>>16)
#define LOW_WORD(x) ((x)&0x0000ffff)
/* vi object struct */
typedef struct hiPCIV_VIDEVICE_S
{
VI_DEV viDev; /* vi device number */
VI_CHN viChn; /* vi channel number */
} PCIV_VIDEVICE_S;
/* vo object struct */
typedef struct hiPCIV_VODEVICE_S
{
VO_DEV voDev; /* vo device number */
VO_CHN voChn; /* vo channel number */
} PCIV_VODEVICE_S;
/* vdec object struct */
typedef struct hiPCIV_VDECDEVICE_S
{
VDEC_CHN vdecChn; /* vedc channel number */
} PCIV_VDECDEVICE_S;
/* vpss object struct */
typedef struct hiPCIV_VPSSDEVICE_S
{
VPSS_GRP vpssGrp; /* vpss group number */
VPSS_CHN vpssChn; /* vpss channel number */
} PCIV_VPSSDEVICE_S;
/* venc object struct */
typedef struct hiPCIV_VENCDEVICE_S
{
VENC_CHN vencChn; /* venc channel number */
} PCIV_VENCDEVICE_S;
/* bind type for pciv */
typedef enum hiPCIV_BIND_TYPE_E
{
PCIV_BIND_VI = 0,
PCIV_BIND_VO = 1,
PCIV_BIND_VDEC = 2,
PCIV_BIND_VPSS = 3,
PCIV_BIND_VENC = 4,
PCIV_BIND_BUTT
} PCIV_BIND_TYPE_E;
/* bind object struct for pciv */
typedef struct hiPCI_BIND_OBJ_S
{
HI_BOOL bVpssSend;
PCIV_BIND_TYPE_E enType; /* bind type for pciv */
union
{
PCIV_VIDEVICE_S viDevice;
PCIV_VODEVICE_S voDevice;
PCIV_VDECDEVICE_S vdecDevice;
PCIV_VPSSDEVICE_S vpssDevice;
PCIV_VENCDEVICE_S vencDevice;
} unAttachObj;
} PCIV_BIND_OBJ_S;
/* remote pciv object */
typedef struct hiPCIV_REMOTE_OBJ_S
{
HI_S32 s32ChipId; /* remote pciv device Id number */
PCIV_CHN pcivChn; /* pciv channel number of remote pciv device */
} PCIV_REMOTE_OBJ_S;
/* attribution of target picture */
typedef struct hiPCIV_PIC_ATTR_S
{
HI_U32 u32Width; /* pciture width of pciv channel */
HI_U32 u32Height; /* picture height of pciv channel */
HI_U32 u32Stride[3]; /* pciture stride of pciv channel */
VIDEO_FIELD_E u32Field; /* video frame field type of pciv channel */
PIXEL_FORMAT_E enPixelFormat; /* pixel format of pciture of pciv channel */
} PCIV_PIC_ATTR_S;
/* attribution of pciv chn */
typedef struct hiPCIV_ATTR_S
{
PCIV_PIC_ATTR_S stPicAttr; /* picture attibute */
HI_S32 s32BufChip; /* The chip id which buffer is belong to */
HI_U32 u32BlkSize; /* vb size of receiver for preview */
HI_U32 u32Count; /* lenght of address list */
HI_U32 u32PhyAddr[PCIV_MAX_BUF_NUM]; /* address list for picture move */
PCIV_REMOTE_OBJ_S stRemoteObj; /* remote pciv object */
} PCIV_ATTR_S;
/* max count of video buffer block for pci window */
#define PCIV_MAX_VBCOUNT 8
/* mpp video buffer config for pci window */
typedef struct hiPCIV_WINVBCFG_S
{
HI_U32 u32PoolCount; /* total number of video buffer pool */
HI_U32 u32BlkSize[PCIV_MAX_VBCOUNT]; /* size of video buffer pool */
HI_U32 u32BlkCount[PCIV_MAX_VBCOUNT]; /* number of video buffer pool */
} PCIV_WINVBCFG_S;
typedef struct hiPCIV_BASEWINDOW_S
{
HI_S32 s32ChipId; /* pciv device number */
HI_U32 u32NpWinBase; /* non-prefetch window pcie base address */
HI_U32 u32PfWinBase; /* prefetch window pcie base address */
HI_U32 u32CfgWinBase; /* config window pcie base address */
HI_U32 u32PfAHBAddr; /* prefetch window AHB base address */
} PCIV_BASEWINDOW_S;
#define PCIV_MAX_DMABLK 128
typedef struct hiPCIV_DMA_BLOCK_S
{
HI_U32 u32SrcAddr; /* source address of dma task */
HI_U32 u32DstAddr; /* destination address of dma task */
HI_U32 u32BlkSize; /* data block size of dma task */
} PCIV_DMA_BLOCK_S;
typedef struct hiPCIV_DMA_TASK_S
{
HI_U32 u32Count; /* total dma task number */
HI_BOOL bRead; /* dam task is read or write data */
PCIV_DMA_BLOCK_S *pBlock;
} PCIV_DMA_TASK_S;
/*
* Message port used in pciv_drvadp, you can't use it in your application.
*/
#define PCIV_MSGPORT_KERNEL 80
/*
* You should not use follow mocros, they will be deleted !
*/
#define PCIV_MSGPORT_MAXPORT 100
#define PCIV_MSGPORT_TIME 79
#define PCIV_MSGPORT_USERCMD 81
#define PCIV_MSGPORT_USERNOTIFY2HOST 82
#define PCIV_MSGPORT_USERNOTIFY2SLAVE 83
#define PCIV_MSGPORT_USERNOTIFY2HOST_VDEC 84
#define PCIV_MSGPORT_USERNOTIFY2SLAVE_VDEC 85
#define PCIV_MAXVO_BIND 4
/*----------------------------------------*/
typedef enum hiPCIV_FILTER_TYPE_E
{
PCIV_FILTER_TYPE_NORM,
PCIV_FILTER_TYPE_EX,
PCIV_FILTER_TYPE_EX2,
PCIV_FILTER_TYPE_BUTT
} PCIV_FILTER_TYPE_E;
typedef enum hiPCIV_PIC_FIELD_E
{
PCIV_FIELD_TOP,
PCIV_FIELD_BOTTOM,
PCIV_FIELD_BOTH,
PCIV_FIELD_BUTT
} PCIV_PIC_FIELD_E;
/*
* configuration of pre-process before sending source picture whth PCI
* item in this structrue have default value when sys init
*/
typedef struct hiPCIV_PREPROC_CFG_S
{
PCIV_PIC_FIELD_E enFieldSel; /* pictrue field select */
PCIV_FILTER_TYPE_E enFilterType; /* filter group type */
} PCIV_PREPROC_CFG_S;
#if 0
/* Synchronize the time and PTS. The host is base. */
typedef struct hiPCIV_TIME_SYNC_S
{
struct timeval stSysTime; /* The current system time */
HI_U64 u64PtsBase; /* The media PTS */
HI_U32 u32ReqTagId;
} PCIV_TIME_SYNC_S;
#endif
/* invlalid channel ID */
#define HI_ERR_PCIV_INVALID_CHNID HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_INVALID_CHNID)
/* at lease one parameter is illagal ,eg, an illegal enumeration value */
#define HI_ERR_PCIV_ILLEGAL_PARAM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_ILLEGAL_PARAM)
/* channel exists */
#define HI_ERR_PCIV_EXIST HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_EXIST)
/* channel exists */
#define HI_ERR_PCIV_UNEXIST HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_UNEXIST)
/* using a NULL point */
#define HI_ERR_PCIV_NULL_PTR HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NULL_PTR)
/* try to enable or initialize system,device or channel, before configing attribute */
#define HI_ERR_PCIV_NOT_CONFIG HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_CONFIG)
/* operation is not supported by NOW */
#define HI_ERR_PCIV_NOT_SUPPORT HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_SUPPORT)
/* operation is not permitted ,eg, try to change stati attribute */
#define HI_ERR_PCIV_NOT_PERM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOT_PERM)
/* failure caused by malloc memory */
#define HI_ERR_PCIV_NOMEM HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOMEM)
/* failure caused by malloc buffer */
#define HI_ERR_PCIV_NOBUF HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_NOBUF)
/* no data in buffer */
#define HI_ERR_PCIV_BUF_EMPTY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_EMPTY)
/* no buffer for new data */
#define HI_ERR_PCIV_BUF_FULL HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUF_FULL)
/* system is not ready,had not initialed or loaded*/
#define HI_ERR_PCIV_SYS_NOTREADY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_SYS_NOTREADY)
/* One DMA task is working, wait a minute */
#define HI_ERR_PCIV_BUSY HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUSY)
#define HI_ERR_PCIV_TIMEOUT HI_DEF_ERR(HI_ID_PCIV, EN_ERR_LEVEL_ERROR, EN_ERR_BUTT+1)
#define PCIV_TRACE(level, fmt...)\
do{ \
HI_TRACE(level, HI_ID_PCIV,"[Func]:%s [Line]:%d [Info]:", __FUNCTION__, __LINE__);\
HI_TRACE(level,HI_ID_PCIV,##fmt);\
}while(0)
#define PCIV_CHECK_CHNID(ChnID)\
do{\
if(((ChnID) < 0) || ((ChnID) >= PCIV_MAX_CHN_NUM))\
{\
PCIV_TRACE(HI_DBG_ERR, "invalid chn id:%d \n", ChnID);\
return HI_ERR_PCIV_INVALID_CHNID;\
}\
}while(0)
#define PCIV_CHECK_PTR(ptr)\
do{\
if(NULL == (ptr))\
{\
return HI_ERR_PCIV_NULL_PTR;\
}\
}while(0)
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __HI_COMM_PCIV_H__ */