📄 vtg.c
字号:
/********************************************************************************
File name : vtg.c
Description : VTG functions
COPYRIGHT (C) STMicroelectronics 2004.
********************************************************************************/
/* Includes ------------------------------------------------------------------ */
#include <string.h>
#include "stddefs.h"
#include "stlite.h"
#include "stdevice.h"
#include "stvtg.h"
#include "sttbx.h"
#include "testtool.h"
#include "app_data.h"
#include "api.h"
#include "evt.h"
#include "clk.h"
#include "vtg.h"
STVTG_Handle_t VtgMainHdnl[VTG_MAXOPEN];
STVTG_Handle_t VtgAuxHdnl[VTG_MAXOPEN];
VTG_DeviceHandle_t VtgDeviceHandle[VTG_MAXDEVICE]=
{
{"VTG_MAIN", /* DeviceName */
VtgMainHdnl, /* Hdl Array */
STVTG_DEVICE_TYPE_VTG_CELL_7710, /* VTG Device Type */
EVT_BACK, /* EVT DeviceId */
"CLKRV_0", /* CLKRVDeviceName */
ST7710_VOS_0_INTERRUPT, /* VTG Interrupt Number */
4, /* VTG Interrupt Level */
ST7710_VTG1_BASE_ADDRESS, /* Base Address */
0, /* Device Base Addr */
0}, /* Event Handle Keep for application */
{"VTG_AUX", /* DeviceName */
VtgAuxHdnl, /* Hdl Array */
STVTG_DEVICE_TYPE_VTG_CELL_7710, /* VTG Device Type */
EVT_BACK, /* EVT DeviceId */
"CLKRV_0", /* CLKRVDeviceName */
ST7710_VOS_1_INTERRUPT, /* VTG Interrupt Number */
4, /* VTG Interrupt Level */
ST7710_VTG2_BASE_ADDRESS, /* Base Address */
0, /* Device Base Addr */
0} /* Event Handle Keep for application */
};
/* Constants ----------------------------------------------------------------- */
#define TTVTG_DEBUG FALSE
#define VTG_MAX_MODE 45
/* Typedef ------------------------------------------------------------------- */
typedef struct
{
semaphore_t SemTop;
semaphore_t SemBottom;
#if (TTVTG_DEBUG == TRUE)
U32 CountTop;
U32 CountTopLock;
U32 CountBottom;
U32 CountBottomLock;
#endif /* (TTVTG_DEBUG == TRUE ) */
} VTG_WaitVsync_t;
#if 0 // EXT_SHARE
/* Provide a link between enum and string char for testtool use and be */
/* independant of driver reorganisation of the enum. */
typedef struct
{
char Name[39];
STVTG_TimingMode_t Num;
} VTG_ModeTable;
/* Private Variables --------------------------------------------------------- */
/* Driver definition modes */
static const VTG_ModeTable VTG_ModeName[VTG_MAX_MODE] = {
{"VTG_MODE_SLAVE", STVTG_TIMING_MODE_SLAVE},
/* SD modes */
{"VTG_MODE_480I60000_13514", STVTG_TIMING_MODE_480I60000_13514}, /* NTSC 60Hz */
{"VTG_MODE_480P60000_27027", STVTG_TIMING_MODE_480P60000_27027}, /* ATSC 60P */
{"VTG_MODE_480P60000_25200", STVTG_TIMING_MODE_480P60000_25200}, /* ATSC 60P */
{"VTG_MODE_480P60000_25175", STVTG_TIMING_MODE_480P59940_25175}, /* ATSC 60P */
{"VTG_MODE_480P30000_13514", STVTG_TIMING_MODE_480P30000_13514}, /* ATSC 30P */
{"VTG_MODE_480P24000_10811", STVTG_TIMING_MODE_480P24000_10811}, /* ATSC 24P */
{"VTG_MODE_480I59940_13500", STVTG_TIMING_MODE_480I59940_13500}, /* NTSC, PAL M */
{"VTG_MODE_480P59940_27000", STVTG_TIMING_MODE_480P59940_27000}, /* ATSC 60P/1.001 */
{"VTG_MODE_480P29970_13500", STVTG_TIMING_MODE_480P29970_13500}, /* ATSC 30P/1.001 */
{"VTG_MODE_480P23976_10800", STVTG_TIMING_MODE_480P23976_10800}, /* ATSC 24P/1.001 */
{"VTG_MODE_480I60000_12285", STVTG_TIMING_MODE_480I60000_12285}, /* NTSC 60Hz square */
{"VTG_MODE_480P60000_24570", STVTG_TIMING_MODE_480P60000_24570}, /* ATSC 60P square */
{"VTG_MODE_480P30000_12285", STVTG_TIMING_MODE_480P30000_12285}, /* ATSC 30P square */
{"VTG_MODE_480P24000_9828", STVTG_TIMING_MODE_480P24000_9828}, /* ATSC 24P square */
{"VTG_MODE_480I59940_12273", STVTG_TIMING_MODE_480I59940_12273}, /* NTSC square, PAL M square */
{"VTG_MODE_480P59940_24545", STVTG_TIMING_MODE_480P59940_24545}, /* ATSC 60P/1.001 square */
{"VTG_MODE_480P29970_12273", STVTG_TIMING_MODE_480P29970_12273}, /* ATSC 30P/1.001 square */
{"VTG_MODE_480P23976_9818", STVTG_TIMING_MODE_480P23976_9818}, /* ATSC 24P/1.001 square */
{"VTG_MODE_576I50000_13500", STVTG_TIMING_MODE_576I50000_13500}, /* PAL B,D,G,H,I,N, SECAM */
{"VTG_MODE_576I50000_14750", STVTG_TIMING_MODE_576I50000_14750}, /* PAL B,D,G,H,I,N, SECAM square */
/* HD modes */
{"VTG_MODE_1080P60000_148500", STVTG_TIMING_MODE_1080P60000_148500}, /* SMPTE 274M #1 P60 */
{"VTG_MODE_1080P59940_148352", STVTG_TIMING_MODE_1080P59940_148352}, /* SMPTE 274M #2 P60 /1.001 */
{"VTG_MODE_1080P50000_148500", STVTG_TIMING_MODE_1080P50000_148500}, /* SMPTE 274M #3 P50 */
{"VTG_MODE_1080I60000_74250", STVTG_TIMING_MODE_1080I60000_74250}, /* EIA770.3 #3 I60 = SMPTE274M #4 I60 */
{"VTG_MODE_1080I59940_74176", STVTG_TIMING_MODE_1080I59940_74176}, /* EIA770.3 #4 I60 /1.001 = SMPTE274M #5 I60 /1.001 */
{"VTG_MODE_1080I50000_74250", STVTG_TIMING_MODE_1080I50000_74250}, /* SMPTE 295M #2 I50 */
{"VTG_MODE_1080I50000_74250_1", STVTG_TIMING_MODE_1080I50000_74250_1}, /* SMPTE 274M I50 */
{"VTG_MODE_1080P30000_74250", STVTG_TIMING_MODE_1080P30000_74250}, /* SMPTE 274M #7 P30 */
{"VTG_MODE_1080P29970_74176", STVTG_TIMING_MODE_1080P29970_74176}, /* SMPTE 274M #8 P30 /1.001 */
{"VTG_MODE_1080P25000_74250", STVTG_TIMING_MODE_1080P25000_74250}, /* SMPTE 274M #9 P25 */
{"VTG_MODE_1080P24000_74250", STVTG_TIMING_MODE_1080P24000_74250}, /* SMPTE 274M #10 P24 */
{"VTG_MODE_1080P23976_74176", STVTG_TIMING_MODE_1080P23976_74176}, /* SMPTE 274M #11 P24 /1.001 */
{"VTG_MODE_1035I60000_74250", STVTG_TIMING_MODE_1035I60000_74250}, /* SMPTE 240M #1 I60 */
{"VTG_MODE_1035I59940_74176", STVTG_TIMING_MODE_1035I59940_74176}, /* SMPTE 240M #2 I60 /1.001 */
{"VTG_MODE_720P60000_74250", STVTG_TIMING_MODE_720P60000_74250}, /* EIA770.3 #1 P60 = SMPTE 296M #1 P60 */
{"VTG_MODE_720P59940_74176", STVTG_TIMING_MODE_720P59940_74176}, /* EIA770.3 #2 P60 /1.001= SMPTE 296M #2 P60 /1.001 */
{"VTG_MODE_720P30000_37125", STVTG_TIMING_MODE_720P30000_37125}, /* ATSC 720x1280 30P */
{"VTG_MODE_720P29970_37088", STVTG_TIMING_MODE_720P29970_37088}, /* ATSC 720x1280 30P/1.001 */
{"VTG_MODE_720P24000_29700", STVTG_TIMING_MODE_720P24000_29700}, /* ATSC 720x1280 24P */
{"VTG_MODE_720P23976_29670", STVTG_TIMING_MODE_720P23976_29670}, /* ATSC 720x1280 24P/1.001 */
/* non standard modes */
{"VTG_MODE_576P50000_27000", STVTG_TIMING_MODE_576P50000_27000},
{"VTG_MODE_720P50000_74250", STVTG_TIMING_MODE_720P50000_74250},
{"VTG_MODE_1152I50000_48000", STVTG_TIMING_MODE_1152I50000_48000},
{"VTG_MODE_1080I50000_72000", STVTG_TIMING_MODE_1080I50000_72000},
};
#endif
/* Two structure are defined, one per VTG used. This is necessary to avoid a */
/* lot of test into the callback. At init, the callback parameter is defined */
/* with the good array. */
static VTG_WaitVsync_t Vtg_WaitVsyncArray_Main;
static VTG_WaitVsync_t Vtg_WaitVsyncArray_Aux;
/* Multi Instance */
#if (TTVTG_MULTI_INSTANCE == TRUE)
#define INS_DEVICEID "<DeviceId>"
#define INS_DEVICEHANDLEID "<DeviceId><HandleId>"
#else
#define INS_DEVICEID
#define INS_DEVICEHANDLEID
#endif /* TTVTG_MULTI_INSTANCE */
#if (TTVTG_DEBUG == TRUE)
/* Semaphore used to protect VTG_WaitVsyncArray access */
static semaphore_t Vtg_WaitVsync_SemProtect;
static BOOL Vtg_WaitVsync_SemProtect_Init = FALSE;
#define VTG_WAITVSYNC_ProtectArray if (Vtg_WaitVsync_SemProtect_Init==FALSE) \
{semaphore_init_fifo(&Vtg_WaitVsync_SemProtect,1); \
Vtg_WaitVsync_SemProtect_Init = TRUE; \
semaphore_wait(&Vtg_WaitVsync_SemProtect);} \
else {semaphore_wait(&Vtg_WaitVsync_SemProtect);}
#define VTG_WAITVSYNC_UnProtectArray semaphore_signal(&Vtg_WaitVsync_SemProtect);
#endif /* (TTVTG_DEBUG == TRUE ) */
/* Macros --------------------------------------------------------------------- */
#define VTG_GETSEMTOP(ptr) &((ptr)->SemTop)
#define VTG_GETSEMBOT(ptr) &((ptr)->SemBottom)
/* Functions Prototype -------------------------------------------------------- */
static void VTG_WaitVsyncCallback (STEVT_CallReason_t Reason,
const ST_DeviceName_t RegistrantName,
STEVT_EventConstant_t Event,
const void *EventData,
const void *SubscriberData_p);
static ST_ErrorCode_t vtg_WaitVsyncGetArray(VTG_DeviceId_t DeviceId, VTG_WaitVsync_t **rray_p);
/* General Functions --------------------------------------------------------- */
/*-------------------------------------------------------------------------------
* Function : VTG_Close
* close VTG
* Input : DeviceId, HandleId
* Output :
* Return : Error Code
* --------------------------------------------------------------------------- */
ST_ErrorCode_t VTG_Close( VTG_DeviceId_t DeviceId, VTG_HandleId_t HandleId )
{
ST_ErrorCode_t ErrCode;
STTBX_ReportLevel_t ReportLevel;
ErrCode = ST_NO_ERROR;
ReportLevel = STTBX_REPORT_LEVEL_INFO;
if (HandleId >= VTG_MAXOPEN)
{
ErrCode = ST_ERROR_BAD_PARAMETER;
}
if ( VTG_GET_HANDLE(DeviceId,HandleId) == VTG_HANDLE_NULL )
{
ErrCode = ST_ERROR_BAD_PARAMETER;
}
if (ErrCode == ST_NO_ERROR)
{
ErrCode = STVTG_Close(VTG_GET_HANDLE(DeviceId, HandleId));
if (ErrCode != ST_NO_ERROR)
{
ReportLevel = STTBX_REPORT_LEVEL_ERROR;
}
else
{
VTG_GET_HANDLE(DeviceId,HandleId) = VTG_HANDLE_NULL;
}
}
STTBX_Report((ReportLevel,"STVTG_Close(%s)=%s", VTG_GET_DEVICENAME(DeviceId), GetErrorText(ErrCode) ));
return ( ErrCode );
} /* end VTG_Close */
/*-------------------------------------------------------------------------------
* Function : VTG_GetMode
* Get VTG Mode
* Input : DeviceId, HandleId
* Output : VTGModeParams_p
* Return : Error Code
* --------------------------------------------------------------------------- */
ST_ErrorCode_t VTG_GetMode( VTG_DeviceId_t DeviceId, VTG_HandleId_t HandleId,
STVTG_ModeParams_t *VTGModeParams_p )
{
ST_ErrorCode_t ErrCode;
STVTG_TimingMode_t TimingMode;
U32 loop;
ErrCode = STVTG_GetMode(VTG_GET_HANDLE(DeviceId, HandleId), &TimingMode,
VTGModeParams_p);
if ( ErrCode != ST_NO_ERROR )
{
STTBX_Report((STTBX_REPORT_LEVEL_ERROR, "STVTG_GetMode(%s)=%s",
VTG_GET_DEVICENAME(DeviceId), GetErrorText(ErrCode)));
}
else
{
#if 0 // EXT_SHARE
/* Array index and enum could not be equal so search */
for(loop=0; loop<VTG_MAX_MODE; loop ++)
{
if (TimingMode == VTG_ModeName[loop].Num)
{
STTBX_Report((STTBX_REPORT_LEVEL_INFO, "STVTG_GetMode(%s)=%s",
VTG_GET_DEVICENAME(DeviceId),
VTG_ModeName[loop].Name));
break;
}
}
#endif
STTBX_Report((STTBX_REPORT_LEVEL_INFO,
"STVTG_GetMode(Active XYWH %d,%d,%d,%d Scan: %s, FRate %d, %d,%d)=%s",
VTGModeParams_p->ActiveAreaXStart, VTGModeParams_p->ActiveAreaYStart,
VTGModeParams_p->ActiveAreaWidth, VTGModeParams_p->ActiveAreaHeight,
((VTGModeParams_p->ScanType == STGXOBJ_INTERLACED_SCAN)?"Interlaced":"Progressive"),
VTGModeParams_p->FrameRate,
VTGModeParams_p->DigitalActiveAreaXStart,
VTGModeParams_p->DigitalActiveAreaYStart,
GetErrorText(ErrCode)));
}
return ( ErrCode );
} /* end VTG_GetMode */
/*-------------------------------------------------------------------------------
* Function : VTG_GetOptionalConfiguration
* Get Optional Configuration
* Input : DeviceId, HandleId
* Output : VTGModeParams_p
* Return : Error Code
* --------------------------------------------------------------------------- */
ST_ErrorCode_t VTG_GetOptionalConfiguration( VTG_DeviceId_t DeviceId, VTG_HandleId_t HandleId )
{
ST_ErrorCode_t ErrCode,KeepErrCode;
STVTG_OptionalConfiguration_t VTGOption;
KeepErrCode = ErrCode = ST_NO_ERROR;
VTGOption.Option = STVTG_OPTION_EMBEDDED_SYNCHRO;
ErrCode = STVTG_GetOptionalConfiguration( VTG_GET_HANDLE(DeviceId, HandleId),
&VTGOption);
if (ErrCode != ST_NO_ERROR)
{
KeepErrCode = ErrCode;
}
STTBX_Print(("\t EMBEDDED_SYNCHRO : %d\n", VTGOption.Value.EmbeddedSynchro));
VTGOption.Option = STVTG_OPTION_NO_OUTPUT_SIGNAL;
ErrCode = STVTG_GetOptionalConfiguration( VTG_GET_HANDLE(DeviceId, HandleId),
&VTGOption);
if (ErrCode != ST_NO_ERROR)
{
KeepErrCode = ErrCode;
}
STTBX_Print(("\t NO_OUTPUT_SIGNAL : %d\n", VTGOption.Value.NoOutputSignal));
VTGOption.Option = STVTG_OPTION_HSYNC_POLARITY;
ErrCode = STVTG_GetOptionalConfiguration( VTG_GET_HANDLE(DeviceId, HandleId),
&VTGOption);
if (ErrCode != ST_NO_ERROR)
{
KeepErrCode = ErrCode;
}
STTBX_Print(("\t HSYNC_POLARITY : %d\n", VTGOption.Value.IsHSyncPositive));
VTGOption.Option = STVTG_OPTION_VSYNC_POLARITY;
ErrCode = STVTG_GetOptionalConfiguration( VTG_GET_HANDLE(DeviceId, HandleId),
&VTGOption);
if (ErrCode != ST_NO_ERROR)
{
KeepErrCode = ErrCode;
}
STTBX_Print(("\t VSYNC_POLARITY : %d\n", VTGOption.Value.IsVSyncPositive));
VTGOption.Option = STVTG_OPTION_OUT_EDGE_POSITION;
ErrCode = STVTG_GetOptionalConfiguration( VTG_GET_HANDLE(DeviceId, HandleId),
&VTGOption);
if (ErrCode != ST_NO_ERROR)
{
KeepErrCode = ErrCode;
}
STTBX_Print(("\t OUT_EDGE_POSITION HSyncRising : %d\n",VTGOption.Value.OutEdges.HSyncRising));
STTBX_Print(("\t OUT_EDGE_POSITION HSyncFalling : %d\n",VTGOption.Value.OutEdges.HSyncFalling));
STTBX_Print(("\t OUT_EDGE_POSITION VSyncRising : %d\n",VTGOption.Value.OutEdges.VSyncRising));
STTBX_Print(("\t OUT_EDGE_POSITION VSyncFalling : %d\n",VTGOption.Value.OutEdges.VSyncFalling));
if (KeepErrCode == ST_NO_ERROR)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -