⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vtg.c

📁 ST5100 driver files for ST chipset
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************************************************************************

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 + -