/****************************************************************************** * * Copyright (C) 2008 - 2014 Xilinx, Inc. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * Use of the Software is limited solely to applications: * (a) running on a Xilinx device, or * (b) that interact with a Xilinx device through a bus or interconnect. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Except as contained in this notice, the name of the Xilinx shall not be used * in advertising or otherwise to promote the sale, use or other dealings in * this Software without prior written authorization from Xilinx. * ******************************************************************************/ /*****************************************************************************/ /** * * @file xvtc.c * * This is main code of Xilinx MVI Video Timing Controller (VTC) device driver. * The VTC device detects and generates video sync signals to Video IP cores * like MVI Video Scaler. Please see xvtc.h for more details of the driver. * *
* MODIFICATION HISTORY: * * Ver Who Date Changes * ----- ------ -------- -------------------------------------------------- * 1.00a xd 08/05/08 First release. * 1.01a xd 07/23/10 Added GIER; Added more h/w generic info into * xparameters.h; Feed callbacks with pending * interrupt info. Added Doxygen & Version support. * 3.00a cjm 08/01/12 Converted from xio.h to xil_io.h, translating * basic types, MB cache functions, exceptions and * assertions to xil_io format. * Replaced the following: * "XExc_Init" -> "Xil_ExceptionInit" * "XExc_RegisterHandler" -> * "Xil_ExceptionRegisterHandler" * "XEXC_ID_NON_CRITICAL_INT" -> "XIL_EXCEPTION_ID_INT" * "XExceptionHandler" -> "Xil_ExceptionHandler" * "XExc_mEnableExceptions" -> "Xil_ExceptionEnable" * "XEXC_NON_CRITICAL" -> "XIL_EXCEPTION_NON_CRITICAL" * "XExc_DisableExceptions" -> "Xil_ExceptionDisable" * "XExc_RemoveHandler" -> "Xil_ExceptionRemoveHandler" * "microblaze_enable_interrupts" -> "Xil_ExceptionEnable" * "microblaze_disable_interrupts" -> * Xil_ExceptionDisable" * "XCOMPONENT_IS_STARTED" -> "XIL_COMPONENT_IS_STARTED" * "XCOMPONENT_IS_READY" -> "(XIL_COMPONENT_IS_READY)" * * "XASSERT_NONVOID" -> "Xil_AssertNonvoid" * "XASSERT_VOID_ALWAYS" -> "Xil_AssertVoidAlways" * "XASSERT_VOID" -> "Xil_AssertVoid" * "Xil_AssertVoid_ALWAYS" -> "Xil_AssertVoidAlways" * "XAssertStatus" -> "Xil_AssertStatus" * "XAssertSetCallback" -> "Xil_AssertCallback" * * "XASSERT_OCCURRED" -> "XIL_ASSERT_OCCURRED" * "XASSERT_NONE" -> "XIL_ASSERT_NONE" * * "microblaze_disable_dcache" -> "Xil_DCacheDisable" * "microblaze_enable_dcache" -> "Xil_DCacheEnable" * "microblaze_enable_icache" -> "Xil_ICacheEnable" * "microblaze_disable_icache" -> "Xil_ICacheDisable" * "microblaze_init_dcache_range" -> * "Xil_DCacheInvalidateRange" * "XCache_DisableDCache" -> "Xil_DCacheDisable" * "XCache_DisableICache" -> "Xil_ICacheDisable" * "XCache_EnableDCache" -> "Xil_DCacheEnableRegion" * "XCache_EnableICache" -> "Xil_ICacheEnableRegion" * "XCache_InvalidateDCacheLine" -> * "Xil_DCacheInvalidateRange" * * "XUtil_MemoryTest32" -> "Xil_TestMem32" * "XUtil_MemoryTest16" -> "Xil_TestMem16" * "XUtil_MemoryTest8" -> "Xil_TestMem8" * * "xutil.h" -> "xil_testmem.h" * * "xbasic_types.h" -> "xil_types.h" * "xio.h" -> "xil_io.h" * * "XIo_In32" -> "Xil_In32" * "XIo_Out32" -> "Xil_Out32" * * "XTRUE" -> "TRUE" * "XFALSE" -> "FALSE" * "XNULL" -> "NULL" * * "Xuint8" -> "u8" * "Xuint16" -> "u16" * "Xuint32" -> "u32" * "Xint8" -> "char" * "Xint16" -> "short" * "Xint32" -> "long" * "Xfloat32" -> "float" * "Xfloat64" -> "double" * "Xboolean" -> "int" * "XTEST_FAILED" -> "XST_FAILURE" * "XTEST_PASSED" -> "XST_SUCCESS" * 4.00a cjm 02/08/13 Removed XVTC_CTL_HASS_MASK * 5.00a cjm 08/07/13 Replaced CTL in Polarity and Encoding register * definition with "POL" and "ENC" * 5.00a cjm 10/30/13 Removed type parameter from XVtc_Enable which now * enables both generator and detector. * Added XVtc_EnableGenerator to enable only the Generator * Added XVtc_EnableDetector to enable only the Detector * 5.00a cjm 11/01/13 Added Timing, VideoMode and Signal Conversion Functions * XVtc_ConvVideoMode2Timing * XVtc_ConvTiming2Signal * XVtc_ConvSignal2Timing * XVtc_ConvTiming2VideoMode * Added Timing and Video Mode Set/Get Functions * XVtc_SetGeneratorTiming * XVtc_SetGeneratorVideoMode * XVtc_GetGeneratorTiming * XVtc_GetGeneratorVideoMode * XVtc_GetDetectorTiming * XVtc_GetDetectorVideoMode * Updated XVtc_GetGeneratorHoriOffset and * XVtc_SetGeneratorHoriOffset. For adding interlaced or * field-1 registers setting/getting updated * XVtc_SetGenerator to align vsync to hsync * horizontally by default. * Added Field 1 set/get to XVtc_SetGenerator, * XVtc_GetGenerator and XVtc_GetDetector. * 5.00a cjm 11/03/13 Added Chroma/field parity bit masks. * Replaced old timing bit masks/shifts with Start/End Bit * masks/shifts. * 6.1 adk 08/23/14 Modified HActiveVideo value to 1920 for * XVTC_VMODE_1080I mode. * Removed Major, Minor and Revision parameters from * XVtc_GetVersion. * Modified return type of XVtc_GetVersion from * void to u32. ** ******************************************************************************/ /***************************** Include Files *********************************/ #include "xvtc.h" #include "xenv.h" /************************** Constant Definitions *****************************/ /**************************** Type Definitions *******************************/ /***************** Macros (Inline Functions) Definitions *********************/ /************************** Function Prototypes ******************************/ /* * Each of callback functions to be called on different types of interrupts. * These stub functions are set during XVtc_CfgInitialize as default * callback functions. If application is not registered any of the callback * function, these functions will be called for doing nothing. */ static void StubCallBack(void *CallBackRef); static void StubErrCallBack(void *CallBackRef, u32 ErrorMask); /************************** Variable Definitions *****************************/ /************************** Function Definitions *****************************/ /*****************************************************************************/ /** * * This function initializes the VTC core. This function must be called * prior to using the VTC core. Initialization of the VTC includes setting up * the instance data, and ensuring the hardware is in a quiescent state. * * @param InstancePtr is a pointer to the VTC core instance to be * worked on. * @param CfgPtr points to the configuration structure associated with * the VTC core. * @param EffectiveAddr is the base address of the device. If address * translation is being used, then this parameter must reflect the * virtual base address. Otherwise, the physical address should be * used. * * @return * - XST_SUCCESS if XVtc_CfgInitialize was successful. * * @note None. * ******************************************************************************/ int XVtc_CfgInitialize(XVtc *InstancePtr, XVtc_Config *CfgPtr, u32 EffectiveAddr) { /* Verify arguments */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(CfgPtr != NULL); Xil_AssertNonvoid((u32 *)EffectiveAddr != NULL); /* Setup the instance */ memset((void *)InstancePtr, 0, sizeof(XVtc)); memcpy((void *)&(InstancePtr->Config), (const void *)CfgPtr, sizeof(XVtc_Config)); InstancePtr->Config.BaseAddress = EffectiveAddr; /* Set all handlers to stub values, let user configure this data later */ InstancePtr->FrameSyncCallBack = (XVtc_CallBack) StubCallBack; InstancePtr->LockCallBack = (XVtc_CallBack) StubCallBack; InstancePtr->DetectorCallBack = (XVtc_CallBack) StubCallBack; InstancePtr->GeneratorCallBack = (XVtc_CallBack) StubCallBack; InstancePtr->ErrCallBack = (XVtc_ErrorCallBack) StubErrCallBack; /* Reset the hardware and set the flag to indicate the driver is * ready */ XVtc_Reset(InstancePtr); InstancePtr->IsReady = (u32)(XIL_COMPONENT_IS_READY); return XST_SUCCESS; } /*****************************************************************************/ /** * * This function enables the VTC Generator core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_EnableGenerator(XVtc *InstancePtr) { u32 CtrlRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* Read Control register value back */ CtrlRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET)); /* Change the value according to the enabling type and write it back */ CtrlRegValue |= XVTC_CTL_GE_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET), CtrlRegValue); } /*****************************************************************************/ /** * * This function enables the VTC Detector core * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_EnableDetector(XVtc *InstancePtr) { u32 CtrlRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* Read Control register value back */ CtrlRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET)); /* Change the value according to the enabling type and write it back */ CtrlRegValue |= XVTC_CTL_DE_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET), CtrlRegValue); } /*****************************************************************************/ /** * * This function enables the Detector and Generator at same time of the * VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_Enable(XVtc *InstancePtr) { u32 CtrlRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* Read Control register value back */ CtrlRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET)); /* Setup the SW Enable Bit and write it back */ CtrlRegValue |= XVTC_CTL_SW_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET), CtrlRegValue); } /*****************************************************************************/ /** * * This function disables the VTC Generator core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_DisableGenerator(XVtc *InstancePtr) { u32 CtrlRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* Read Control register value back */ CtrlRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET)); /* Change the value according to the disabling type and write it * back */ CtrlRegValue &= (u32)(~(XVTC_CTL_GE_MASK)); XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET), CtrlRegValue); } /*****************************************************************************/ /** * * This function disables the VTC Detector core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_DisableDetector(XVtc *InstancePtr) { u32 CtrlRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* Read Control register value back */ CtrlRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET)); /* Change the value according to the disabling type and write it * back */ CtrlRegValue &= (u32)(~(XVTC_CTL_DE_MASK)); XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET), CtrlRegValue); } /*****************************************************************************/ /** * * This function disables the Detector and Generator at same time of the VTC * core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_Disable(XVtc *InstancePtr) { u32 CtrlRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* Read Control register value back */ CtrlRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET)); /* Change the value, clearing Core Enable, and write it back*/ CtrlRegValue &= ~XVTC_CTL_SW_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET), CtrlRegValue); } /*****************************************************************************/ /** * * This function sets up the output polarity of the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param PolarityPtr points to a Polarity configuration structure with * the setting to use on the VTC core. * * @return None. * * @note None. * *****************************************************************************/ void XVtc_SetPolarity(XVtc *InstancePtr, XVtc_Polarity *PolarityPtr) { u32 PolRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(PolarityPtr != NULL); /* Read Control register value back and clear all polarity * bits first */ PolRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_GPOL_OFFSET)); PolRegValue &= (u32)(~(XVTC_POL_ALLP_MASK)); /* Change the register value according to the setting in the Polarity * configuration structure */ if (PolarityPtr->ActiveChromaPol) PolRegValue |= XVTC_POL_ACP_MASK; if (PolarityPtr->ActiveVideoPol) PolRegValue |= XVTC_POL_AVP_MASK; if (PolarityPtr->FieldIdPol) PolRegValue |= XVTC_POL_FIP_MASK; if (PolarityPtr->VBlankPol) PolRegValue |= XVTC_POL_VBP_MASK; if (PolarityPtr->VSyncPol) PolRegValue |= XVTC_POL_VSP_MASK; if (PolarityPtr->HBlankPol) PolRegValue |= XVTC_POL_HBP_MASK; if (PolarityPtr->HSyncPol) PolRegValue |= XVTC_POL_HSP_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_GPOL_OFFSET), PolRegValue); } /*****************************************************************************/ /** * * This function gets the output polarity setting used by the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param PolarityPtr points to a Polarity configuration structure that * will be populated with the setting used on the VTC core * after this function returns. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetPolarity(XVtc *InstancePtr, XVtc_Polarity *PolarityPtr) { u32 PolRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(PolarityPtr != NULL); /* Clear the Polarity configuration structure */ memset((void *)PolarityPtr, 0, sizeof(XVtc_Polarity)); /* Read Control register value back */ PolRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_GPOL_OFFSET)); /* Populate the Polarity configuration structure w/ the current setting * used in the device */ if (PolRegValue & XVTC_POL_ACP_MASK) PolarityPtr->ActiveChromaPol = 1; if (PolRegValue & XVTC_POL_AVP_MASK) PolarityPtr->ActiveVideoPol = 1; if (PolRegValue & XVTC_POL_FIP_MASK) PolarityPtr->FieldIdPol = 1; if (PolRegValue & XVTC_POL_VBP_MASK) PolarityPtr->VBlankPol = 1; if (PolRegValue & XVTC_POL_VSP_MASK) PolarityPtr->VSyncPol = 1; if (PolRegValue & XVTC_POL_HBP_MASK) PolarityPtr->HBlankPol = 1; if (PolRegValue & XVTC_POL_HSP_MASK) PolarityPtr->HSyncPol = 1; } /*****************************************************************************/ /** * * This function gets the input polarity setting used by the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param PolarityPtr points to a Polarity configuration structure that * will be populated with the setting used on the VTC core after * this function returns. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetDetectorPolarity(XVtc *InstancePtr, XVtc_Polarity *PolarityPtr) { u32 PolRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(PolarityPtr != NULL); /* Clear the Polarity configuration structure */ memset((void *)PolarityPtr, 0, sizeof(XVtc_Polarity)); /* Read Control register value back */ PolRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_DPOL_OFFSET)); /* Populate the Polarity configuration structure w/ the current setting * used in the core. */ if (PolRegValue & XVTC_POL_ACP_MASK) PolarityPtr->ActiveChromaPol = 1; if (PolRegValue & XVTC_POL_AVP_MASK) PolarityPtr->ActiveVideoPol = 1; if (PolRegValue & XVTC_POL_FIP_MASK) PolarityPtr->FieldIdPol = 1; if (PolRegValue & XVTC_POL_VBP_MASK) PolarityPtr->VBlankPol = 1; if (PolRegValue & XVTC_POL_VSP_MASK) PolarityPtr->VSyncPol = 1; if (PolRegValue & XVTC_POL_HBP_MASK) PolarityPtr->HBlankPol = 1; if (PolRegValue & XVTC_POL_HSP_MASK) PolarityPtr->HSyncPol = 1; } /*****************************************************************************/ /** * * This function sets up the source selecting of the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on * @param SourcePtr points to a Source Selecting configuration structure * with the setting to use on the VTC device. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_SetSource(XVtc *InstancePtr, XVtc_SourceSelect *SourcePtr) { u32 CtrlRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(SourcePtr != NULL); /* Read Control register value back and clear all source selection bits * first */ CtrlRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET)); CtrlRegValue &= ~XVTC_CTL_ALLSS_MASK; /* Change the register value according to the setting in the source * selection configuration structure */ if (SourcePtr->FieldIdPolSrc) CtrlRegValue |= XVTC_CTL_FIPSS_MASK; if (SourcePtr->ActiveChromaPolSrc) CtrlRegValue |= XVTC_CTL_ACPSS_MASK; if (SourcePtr->ActiveVideoPolSrc) CtrlRegValue |= XVTC_CTL_AVPSS_MASK; if (SourcePtr->HSyncPolSrc) CtrlRegValue |= XVTC_CTL_HSPSS_MASK; if (SourcePtr->VSyncPolSrc) CtrlRegValue |= XVTC_CTL_VSPSS_MASK; if (SourcePtr->HBlankPolSrc) CtrlRegValue |= XVTC_CTL_HBPSS_MASK; if (SourcePtr->VBlankPolSrc) CtrlRegValue |= XVTC_CTL_VBPSS_MASK; if (SourcePtr->VChromaSrc) CtrlRegValue |= XVTC_CTL_VCSS_MASK; if (SourcePtr->VActiveSrc) CtrlRegValue |= XVTC_CTL_VASS_MASK; if (SourcePtr->VBackPorchSrc) CtrlRegValue |= XVTC_CTL_VBSS_MASK; if (SourcePtr->VSyncSrc) CtrlRegValue |= XVTC_CTL_VSSS_MASK; if (SourcePtr->VFrontPorchSrc) CtrlRegValue |= XVTC_CTL_VFSS_MASK; if (SourcePtr->VTotalSrc) CtrlRegValue |= XVTC_CTL_VTSS_MASK; if (SourcePtr->HBackPorchSrc) CtrlRegValue |= XVTC_CTL_HBSS_MASK; if (SourcePtr->HSyncSrc) CtrlRegValue |= XVTC_CTL_HSSS_MASK; if (SourcePtr->HFrontPorchSrc) CtrlRegValue |= XVTC_CTL_HFSS_MASK; if (SourcePtr->HTotalSrc) CtrlRegValue |= XVTC_CTL_HTSS_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET), CtrlRegValue); } /*****************************************************************************/ /** * * This function gets the source select setting used by the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param SourcePtr points to a source select configuration structure * that will be populated with the setting used on the VTC core * after this function returns. * * @return None. * * @note None. * *****************************************************************************/ void XVtc_GetSource(XVtc *InstancePtr, XVtc_SourceSelect *SourcePtr) { u32 CtrlRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(SourcePtr != NULL); /* Clear the source selection configuration structure */ memset((void *)SourcePtr, 0, sizeof(XVtc_SourceSelect)); /* Read Control register value back */ CtrlRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_CTL_OFFSET)); /* Populate the source select configuration structure with the current * setting used in the core */ if (CtrlRegValue & XVTC_CTL_FIPSS_MASK) SourcePtr->FieldIdPolSrc = 1; if (CtrlRegValue & XVTC_CTL_ACPSS_MASK) SourcePtr->ActiveChromaPolSrc = 1; if (CtrlRegValue & XVTC_CTL_AVPSS_MASK) SourcePtr->ActiveVideoPolSrc= 1; if (CtrlRegValue & XVTC_CTL_HSPSS_MASK) SourcePtr->HSyncPolSrc = 1; if (CtrlRegValue & XVTC_CTL_VSPSS_MASK) SourcePtr->VSyncPolSrc = 1; if (CtrlRegValue & XVTC_CTL_HBPSS_MASK) SourcePtr->HBlankPolSrc = 1; if (CtrlRegValue & XVTC_CTL_VBPSS_MASK) SourcePtr->VBlankPolSrc = 1; if (CtrlRegValue & XVTC_CTL_VCSS_MASK) SourcePtr->VChromaSrc = 1; if (CtrlRegValue & XVTC_CTL_VASS_MASK) SourcePtr->VActiveSrc = 1; if (CtrlRegValue & XVTC_CTL_VBSS_MASK) SourcePtr->VBackPorchSrc = 1; if (CtrlRegValue & XVTC_CTL_VSSS_MASK) SourcePtr->VSyncSrc = 1; if (CtrlRegValue & XVTC_CTL_VFSS_MASK) SourcePtr->VFrontPorchSrc = 1; if (CtrlRegValue & XVTC_CTL_VTSS_MASK) SourcePtr->VTotalSrc = 1; if (CtrlRegValue & XVTC_CTL_HBSS_MASK) SourcePtr->HBackPorchSrc = 1; if (CtrlRegValue & XVTC_CTL_HSSS_MASK) SourcePtr->HSyncSrc = 1; if (CtrlRegValue & XVTC_CTL_HFSS_MASK) SourcePtr->HFrontPorchSrc = 1; if (CtrlRegValue & XVTC_CTL_HTSS_MASK) SourcePtr->HTotalSrc = 1; } /*****************************************************************************/ /** * * This function sets up the line skip setting of the Generator in the VTC * core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param GeneratorChromaSkip indicates whether to skip 1 line between * active chroma for the Generator module. Use Non-0 value for * this parameter to skip 1 line, and 0 to not skip lines. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_SetSkipLine(XVtc *InstancePtr, int GeneratorChromaSkip) { u32 FrameEncodeRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* Read Control register value back and clear all skip bits first */ FrameEncodeRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_GFENC_OFFSET)); FrameEncodeRegValue &= (u32)(~(XVTC_ENC_GACLS_MASK)); /* Change the register value according to the skip setting passed * into this function. */ if (GeneratorChromaSkip) FrameEncodeRegValue |= XVTC_ENC_GACLS_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_GFENC_OFFSET), FrameEncodeRegValue); } /*****************************************************************************/ /** * * This function gets the line skip setting used by the Generator in the VTC * core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param GeneratorChromaSkipPtr will point to the value indicating * whether one line is skipped between active chroma for the * Generator module after this function returns. Value 1 means * that 1 line is skipped and zero means that no lines are * skipped. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetSkipLine(XVtc *InstancePtr, int *GeneratorChromaSkipPtr) { u32 FrameEncodeRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(GeneratorChromaSkipPtr != NULL); /* Read Control register value back */ FrameEncodeRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_GFENC_OFFSET)); /* Populate the skip variable values according to the skip setting * used by the core. */ if (FrameEncodeRegValue & XVTC_ENC_GACLS_MASK) *GeneratorChromaSkipPtr = 1; else *GeneratorChromaSkipPtr = 0; } /*****************************************************************************/ /** * * This function sets up the pixel skip setting of the Generator in the VTC * core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param GeneratorChromaSkip indicates whether to skip 1 pixel between * active chroma for the Generator module. Use Non-0 value for * this parameter to skip 1 pixel, and 0 to not skip pixels * * @return None. * * @note None. * ******************************************************************************/ void XVtc_SetSkipPixel(XVtc *InstancePtr, int GeneratorChromaSkip) { u32 FrameEncodeRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == (u32)(XIL_COMPONENT_IS_READY)); /* Read Control register value back and clear all skip bits first */ FrameEncodeRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_GFENC_OFFSET)); FrameEncodeRegValue &= (u32)(~(XVTC_ENC_GACPS_MASK)); /* Change the register value according to the skip setting passed * into this function. */ if (GeneratorChromaSkip) FrameEncodeRegValue |= XVTC_ENC_GACPS_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_GFENC_OFFSET), FrameEncodeRegValue); } /*****************************************************************************/ /** * * This function gets the pixel skip setting used by the Generator in the VTC * core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param GeneratorChromaSkipPtr will point to the value indicating * whether one pixel is skipped between active chroma for the * Generator module after this function returns. Value 1 means * that 1 pixel is skipped and zero means that no pixels are * skipped. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetSkipPixel(XVtc *InstancePtr, int *GeneratorChromaSkipPtr) { u32 FrameEncodeRegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(GeneratorChromaSkipPtr != NULL); /* Read Control register value back */ FrameEncodeRegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_GFENC_OFFSET)); /* Populate the skip variable values according to the skip setting * used by the core. */ if (FrameEncodeRegValue & XVTC_ENC_GACPS_MASK) *GeneratorChromaSkipPtr = 1; else *GeneratorChromaSkipPtr = 0; } /*****************************************************************************/ /** * * This function sets up the Generator delay setting of the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param VertDelay indicates the number of total lines per frame to * delay the generator output. The valid range is from 0 to 4095. * @param HoriDelay indicates the number of total clock cycles per line * to delay the generator output. The valid range is from 0 to * 4095. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_SetDelay(XVtc *InstancePtr, int VertDelay, int HoriDelay) { u32 RegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(VertDelay >= 0); Xil_AssertVoid(HoriDelay >= 0); Xil_AssertVoid(VertDelay <= 4095); Xil_AssertVoid(HoriDelay <= 4095); /* Calculate the delay value */ RegValue = HoriDelay & XVTC_GGD_HDELAY_MASK; RegValue |= (VertDelay << XVTC_GGD_VDELAY_SHIFT) & XVTC_GGD_VDELAY_MASK; /* Update the Generator Global Delay register w/ the value */ XVtc_WriteReg(InstancePtr->Config.BaseAddress, (XVTC_GGD_OFFSET), RegValue); } /*****************************************************************************/ /** * * This function gets the Generator delay setting used by the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param VertDelayPtr will point to a value indicating the number of * total lines per frame to delay the generator output after * this function returns. * @param HoriDelayPtr will point to a value indicating the number of * total clock cycles per line to delay the generator output * after this function returns. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetDelay(XVtc *InstancePtr, int *VertDelayPtr, int *HoriDelayPtr) { u32 RegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(VertDelayPtr != NULL); Xil_AssertVoid(HoriDelayPtr != NULL); /* Read the Generator Global Delay register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, (XVTC_GGD_OFFSET)); /* Calculate the delay values */ *HoriDelayPtr = RegValue & XVTC_GGD_HDELAY_MASK; *VertDelayPtr = (RegValue & XVTC_GGD_VDELAY_MASK) >> XVTC_GGD_VDELAY_SHIFT; } /*****************************************************************************/ /** * * This function sets up the SYNC setting of a frame sync used by the VTC * core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param FrameSyncIndex indicates the index number of the frame sync. * The valid range is from 0 to 15. * @param VertStart indicates the vertical line count during which the * frame sync is active. The valid range is from 0 to 4095. * @param HoriStart indicates the horizontal cycle count during which the * frame sync is active. The valid range is from 0 to 4095. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_SetFSync(XVtc *InstancePtr, u16 FrameSyncIndex, u16 VertStart, u16 HoriStart) { u32 RegValue; u32 RegAddress; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(FrameSyncIndex <= 15); Xil_AssertVoid(VertStart <= 4095); Xil_AssertVoid(HoriStart <= 4095); /* Calculate the sync value */ RegValue = HoriStart & XVTC_FSXX_HSTART_MASK; RegValue |= (VertStart << XVTC_FSXX_VSTART_SHIFT) & XVTC_FSXX_VSTART_MASK; /* Calculate the frame sync register address to write to */ RegAddress = XVTC_FS00_OFFSET + FrameSyncIndex * XVTC_REG_ADDRGAP; /* Update the Generator Global Delay register w/ the value */ XVtc_WriteReg(InstancePtr->Config.BaseAddress, RegAddress, RegValue); } /*****************************************************************************/ /** * * This function gets the SYNC setting of a frame sync used by the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param FrameSyncIndex indicates the index number of the frame sync. * The valid range is from 0 to 15. * @param VertStartPtr will point to the value that indicates the * vertical line count during which the frame sync is active once * this function returns. * @param HoriStartPtr will point to the value that indicates the * horizontal cycle count during which the frame sync is active * once this function returns. * * @return None. * ******************************************************************************/ void XVtc_GetFSync(XVtc *InstancePtr, u16 FrameSyncIndex, u16 *VertStartPtr, u16 *HoriStartPtr) { u32 RegValue; u32 RegAddress; /* Assert bad arguments and conditions */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(FrameSyncIndex <= 15); Xil_AssertVoid(VertStartPtr != NULL); Xil_AssertVoid(VertStartPtr != NULL); /* Calculate the frame sync register address to read from */ RegAddress = XVTC_FS00_OFFSET + FrameSyncIndex * XVTC_REG_ADDRGAP; /* Read the frame sync register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, RegAddress); /* Calculate the frame sync values */ *HoriStartPtr = RegValue & XVTC_FSXX_HSTART_MASK; *VertStartPtr = (RegValue & XVTC_FSXX_VSTART_MASK) >> XVTC_FSXX_VSTART_SHIFT; } /*****************************************************************************/ /** * This function sets the VBlank/VSync Horizontal Offsets for the Generator * in a VTC device. * * @param InstancePtr is a pointer to the VTC device instance to be worked on. * @param HoriOffsets points to a VBlank/VSync Horizontal Offset configuration * with the setting to use on the VTC device. * @return NONE. * *****************************************************************************/ void XVtc_SetGeneratorHoriOffset(XVtc *InstancePtr, XVtc_HoriOffsets *HoriOffsets) { u32 RegValue; /* Assert bad arguments and conditions */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(HoriOffsets != NULL); /* Calculate and update Generator VBlank Hori. Offset 0 register value */ RegValue = (HoriOffsets->V0BlankHoriStart) & XVTC_XVXHOX_HSTART_MASK; RegValue |= (HoriOffsets->V0BlankHoriEnd << XVTC_XVXHOX_HEND_SHIFT) & XVTC_XVXHOX_HEND_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVBHOFF_OFFSET, RegValue); /* Calculate and update Generator VSync Hori. Offset 0 register * value */ RegValue = (HoriOffsets->V0SyncHoriStart) & XVTC_XVXHOX_HSTART_MASK; RegValue |= (HoriOffsets->V0SyncHoriEnd << XVTC_XVXHOX_HEND_SHIFT) & XVTC_XVXHOX_HEND_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVSHOFF_OFFSET, RegValue); /* Calculate and update Generator VBlank Hori. Offset 1 register * value */ RegValue = (HoriOffsets->V1BlankHoriStart) & XVTC_XVXHOX_HSTART_MASK; RegValue |= (HoriOffsets->V1BlankHoriEnd << XVTC_XVXHOX_HEND_SHIFT) & XVTC_XVXHOX_HEND_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVBHOFF_F1_OFFSET, RegValue); /* Calculate and update Generator VSync Hori. Offset 1 register * value */ RegValue = (HoriOffsets->V1SyncHoriStart) & XVTC_XVXHOX_HSTART_MASK; RegValue |= (HoriOffsets->V1SyncHoriEnd << XVTC_XVXHOX_HEND_SHIFT) & XVTC_XVXHOX_HEND_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVSHOFF_F1_OFFSET, RegValue); } /*****************************************************************************/ /** * * This function gets the VBlank/VSync Horizontal Offsets currently used by * the Generator in the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param HoriOffsets points to a VBlank/VSync Horizontal Offset * configuration structure that will be populated with the setting * currently used on the Generator in the given VTC device after * this function returns. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetGeneratorHoriOffset(XVtc *InstancePtr, XVtc_HoriOffsets *HoriOffsets) { u32 RegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(HoriOffsets != NULL); /* Parse Generator VBlank Hori. Offset 0 register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVBHOFF_OFFSET); HoriOffsets->V0BlankHoriStart = RegValue & XVTC_XVXHOX_HSTART_MASK; HoriOffsets->V0BlankHoriEnd = (RegValue & XVTC_XVXHOX_HEND_MASK) >> XVTC_XVXHOX_HEND_SHIFT; /* Parse Generator VSync Hori. Offset 0 register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSHOFF_OFFSET); HoriOffsets->V0SyncHoriStart = RegValue & XVTC_XVXHOX_HSTART_MASK; HoriOffsets->V0SyncHoriEnd = (RegValue & XVTC_XVXHOX_HEND_MASK) >> XVTC_XVXHOX_HEND_SHIFT; /* Parse Generator VBlank Hori. Offset 1 register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVBHOFF_F1_OFFSET); HoriOffsets->V1BlankHoriStart = RegValue & XVTC_XVXHOX_HSTART_MASK; HoriOffsets->V1BlankHoriEnd = (RegValue & XVTC_XVXHOX_HEND_MASK) >> XVTC_XVXHOX_HEND_SHIFT; /* Parse Generator VSync Hori. Offset 1 register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSHOFF_F1_OFFSET); HoriOffsets->V1SyncHoriStart = RegValue & XVTC_XVXHOX_HSTART_MASK; HoriOffsets->V1SyncHoriEnd = (RegValue & XVTC_XVXHOX_HEND_MASK) >> XVTC_XVXHOX_HEND_SHIFT; } /*****************************************************************************/ /** * * This function gets the VBlank/VSync Horizontal Offsets detected by * the Detector in the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param HoriOffsets points to a VBlank/VSync Horizontal Offset * configuration structure that will be populated with the setting * detected on the Detector in the given VTC device after this * function returns. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetDetectorHoriOffset(XVtc *InstancePtr, XVtc_HoriOffsets *HoriOffsets) { u32 RegValue; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(HoriOffsets != NULL); /* Parse Detector VBlank Hori. Offset 0 register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DVBHOFF_OFFSET); HoriOffsets->V0BlankHoriStart = RegValue & XVTC_XVXHOX_HSTART_MASK; HoriOffsets->V0BlankHoriEnd = (RegValue & XVTC_XVXHOX_HEND_MASK) >> XVTC_XVXHOX_HEND_SHIFT; /* Parse Detector VSync Hori. Offset 0 register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DVSHOFF_OFFSET); HoriOffsets->V0SyncHoriStart = RegValue & XVTC_XVXHOX_HSTART_MASK; HoriOffsets->V0SyncHoriEnd = (RegValue & XVTC_XVXHOX_HEND_MASK) >> XVTC_XVXHOX_HEND_SHIFT; /* Parse Detector VBlank Hori. Offset 1 register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DVBHOFF_F1_OFFSET); HoriOffsets->V1BlankHoriStart = RegValue & XVTC_XVXHOX_HSTART_MASK; HoriOffsets->V1BlankHoriEnd = (RegValue & XVTC_XVXHOX_HEND_MASK) >> XVTC_XVXHOX_HEND_SHIFT; /* Parse Detector VSync Hori. Offset 1 register value */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DVSHOFF_F1_OFFSET); HoriOffsets->V1SyncHoriStart = RegValue & XVTC_XVXHOX_HSTART_MASK; HoriOffsets->V1SyncHoriEnd = (RegValue & XVTC_XVXHOX_HEND_MASK) >> XVTC_XVXHOX_HEND_SHIFT; } /*****************************************************************************/ /** * * This function sets up VTC signal to be used by the Generator module * in the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param SignalCfgPtr is a pointer to the VTC signal configuration * to be used by the Generator module in the VTC core. * * @return None. * * @note None. * *****************************************************************************/ void XVtc_SetGenerator(XVtc *InstancePtr, XVtc_Signal *SignalCfgPtr) { u32 RegValue; u32 r_htotal, r_vtotal, r_hactive, r_vactive; XVtc_Signal *SCPtr; XVtc_HoriOffsets horiOffsets; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(SignalCfgPtr != NULL); SCPtr = SignalCfgPtr; if(SCPtr->OriginMode == 0) { r_htotal = SCPtr->HTotal+1; r_vtotal = SCPtr->V0Total+1; r_hactive = r_htotal - SCPtr->HActiveStart; r_vactive = r_vtotal - SCPtr->V0ActiveStart; RegValue = (r_htotal) & XVTC_SB_START_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GHSIZE_OFFSET, RegValue); RegValue = (r_vtotal) & XVTC_VSIZE_F0_MASK; RegValue |= ((SCPtr->V1Total+1) << XVTC_VSIZE_F1_SHIFT) & XVTC_VSIZE_F1_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVSIZE_OFFSET, RegValue); RegValue = (r_hactive) & XVTC_ASIZE_HORI_MASK; RegValue |= ((r_vactive) << XVTC_ASIZE_VERT_SHIFT ) & XVTC_ASIZE_VERT_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GASIZE_OFFSET, RegValue); /* Update the Generator Horizontal 1 Register */ RegValue = (SCPtr->HSyncStart + r_hactive) & XVTC_SB_START_MASK; RegValue |= ((SCPtr->HBackPorchStart + r_hactive) << XVTC_SB_END_SHIFT) & XVTC_SB_END_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GHSYNC_OFFSET, RegValue); /* Update the Generator Vertical 1 Register (field 0) */ RegValue = (SCPtr->V0SyncStart + r_vactive -1) & XVTC_SB_START_MASK; RegValue |= ((SCPtr->V0BackPorchStart + r_vactive -1) << XVTC_SB_END_SHIFT) & XVTC_SB_END_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_OFFSET, RegValue); /* Update the Generator Vertical Sync Register (field 1) */ RegValue = (SCPtr->V1SyncStart + r_vactive -1) & XVTC_SB_START_MASK; RegValue |= ((SCPtr->V1BackPorchStart + r_vactive -1) << XVTC_SB_END_SHIFT) & XVTC_SB_END_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_F1_OFFSET, RegValue); /* Chroma Start */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GFENC_OFFSET); RegValue &= ~XVTC_ENC_CPARITY_MASK; RegValue = (((SCPtr->V0ChromaStart - SCPtr->V0ActiveStart) << XVTC_ENC_CPARITY_SHIFT) & XVTC_ENC_CPARITY_MASK) | RegValue; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GFENC_OFFSET, RegValue); /* Setup default Horizontal Offsets - can override later with * XVtc_SetGeneratorHoriOffset() */ horiOffsets.V0BlankHoriStart = r_hactive; horiOffsets.V0BlankHoriEnd = r_hactive; horiOffsets.V0SyncHoriStart = SCPtr->HSyncStart + r_hactive; horiOffsets.V0SyncHoriEnd = SCPtr->HSyncStart + r_hactive; horiOffsets.V1BlankHoriStart = r_hactive; horiOffsets.V1BlankHoriEnd = r_hactive; horiOffsets.V1SyncHoriStart = SCPtr->HSyncStart + r_hactive; horiOffsets.V1SyncHoriEnd = SCPtr->HSyncStart + r_hactive; } else { /* Total in mode=1 is the line width */ r_htotal = SCPtr->HTotal; /* Total in mode=1 is the frame height */ r_vtotal = SCPtr->V0Total; r_hactive = SCPtr->HFrontPorchStart; r_vactive = SCPtr->V0FrontPorchStart; RegValue = (r_htotal) & XVTC_SB_START_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GHSIZE_OFFSET, RegValue); RegValue = (r_vtotal) & XVTC_VSIZE_F0_MASK; RegValue |= ((SCPtr->V1Total) << XVTC_VSIZE_F1_SHIFT) & XVTC_VSIZE_F1_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVSIZE_OFFSET, RegValue); RegValue = (r_hactive) & XVTC_ASIZE_HORI_MASK; RegValue |= ((r_vactive) << XVTC_ASIZE_VERT_SHIFT) & XVTC_ASIZE_VERT_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GASIZE_OFFSET, RegValue); /* Update the Generator Horizontal 1 Register */ RegValue = (SCPtr->HSyncStart) & XVTC_SB_START_MASK; RegValue |= ((SCPtr->HBackPorchStart) << XVTC_SB_END_SHIFT) & XVTC_SB_END_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GHSYNC_OFFSET, RegValue); /* Update the Generator Vertical Sync Register (field 0) */ RegValue = (SCPtr->V0SyncStart) & XVTC_SB_START_MASK; RegValue |= ((SCPtr->V0BackPorchStart) << XVTC_SB_END_SHIFT) & XVTC_SB_END_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_OFFSET, RegValue); /* Update the Generator Vertical Sync Register (field 1) */ RegValue = (SCPtr->V1SyncStart) & XVTC_SB_START_MASK; RegValue |= ((SCPtr->V1BackPorchStart) << XVTC_SB_END_SHIFT) & XVTC_SB_END_MASK; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_F1_OFFSET, RegValue); /* Chroma Start */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GFENC_OFFSET); RegValue &= ~XVTC_ENC_CPARITY_MASK; RegValue = (((SCPtr->V0ChromaStart - SCPtr->V0ActiveStart) << XVTC_ENC_CPARITY_SHIFT) & XVTC_ENC_CPARITY_MASK) | RegValue; XVtc_WriteReg(InstancePtr->Config.BaseAddress, XVTC_GFENC_OFFSET, RegValue); /* Setup default Horizontal Offsets - can override later with * XVtc_SetGeneratorHoriOffset() */ horiOffsets.V0BlankHoriStart = r_hactive; horiOffsets.V0BlankHoriEnd = r_hactive; horiOffsets.V0SyncHoriStart = SCPtr->HSyncStart; horiOffsets.V0SyncHoriEnd = SCPtr->HSyncStart; horiOffsets.V1BlankHoriStart = r_hactive; horiOffsets.V1BlankHoriEnd = r_hactive; horiOffsets.V1SyncHoriStart = SCPtr->HSyncStart; horiOffsets.V1SyncHoriEnd = SCPtr->HSyncStart; } XVtc_SetGeneratorHoriOffset(InstancePtr, &horiOffsets); } /*****************************************************************************/ /** * * This function gets the VTC signal setting used by the Generator module * in the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param SignalCfgPtr is a pointer to a VTC signal configuration * which will be populated with the setting used by the Generator * module in the VTC core once this function returns. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetGenerator(XVtc *InstancePtr, XVtc_Signal *SignalCfgPtr) { u32 RegValue; u32 r_htotal, r_vtotal, r_hactive, r_vactive; XVtc_Signal *SCPtr; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(SignalCfgPtr != NULL); SCPtr = SignalCfgPtr; if(SCPtr->OriginMode == 0) { RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GHSIZE_OFFSET); r_htotal = (RegValue) & XVTC_SB_START_MASK; SCPtr->HTotal = (r_htotal-1) & XVTC_SB_START_MASK; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSIZE_OFFSET); r_vtotal = (RegValue) & XVTC_VSIZE_F0_MASK; SCPtr->V0Total = (r_vtotal-1) & XVTC_VSIZE_F0_MASK; SCPtr->V1Total = (RegValue & XVTC_VSIZE_F1_MASK) >> XVTC_VSIZE_F1_SHIFT; if(SCPtr->V1Total != 0) { SCPtr->V1Total = SCPtr->V1Total - 1; } RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GASIZE_OFFSET); r_hactive = (RegValue) & XVTC_ASIZE_HORI_MASK; SCPtr->HActiveStart = (r_htotal - r_hactive) & XVTC_ASIZE_HORI_MASK; r_vactive = (RegValue & XVTC_ASIZE_VERT_MASK) >> XVTC_ASIZE_VERT_SHIFT; SCPtr->V0ActiveStart = (r_vtotal - r_vactive) & XVTC_VSIZE_F0_MASK; SCPtr->V1ActiveStart = (SCPtr->V1Total - r_vactive - 1) & XVTC_VSIZE_F0_MASK; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GHSYNC_OFFSET); SCPtr->HSyncStart = ((RegValue - r_hactive) & XVTC_SB_START_MASK); SCPtr->HBackPorchStart = (((RegValue>>16) - r_hactive) & XVTC_SB_START_MASK); RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_OFFSET); SCPtr->V0SyncStart = ((RegValue-r_vactive+1) & XVTC_SB_START_MASK); SCPtr->V0BackPorchStart = (((RegValue>>16) - r_vactive+1) & XVTC_SB_START_MASK); RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_F1_OFFSET); SCPtr->V1SyncStart = ((RegValue-r_vactive+1) & XVTC_SB_START_MASK); SCPtr->V1BackPorchStart = (((RegValue>>16) - r_vactive+1) & XVTC_SB_START_MASK); /* Get signal values from the Generator Vertical 2 Register (field 0)*/ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GFENC_OFFSET); SCPtr->V0ChromaStart = (((RegValue & XVTC_ENC_CPARITY_MASK) >> XVTC_ENC_CPARITY_SHIFT) + (r_vtotal - r_vactive)) & XVTC_SB_START_MASK; SCPtr->V1ChromaStart = (((RegValue & XVTC_ENC_CPARITY_MASK) >> XVTC_ENC_CPARITY_SHIFT) + (SCPtr->V1Total - r_vactive - 1)) & XVTC_SB_START_MASK; SCPtr->HFrontPorchStart = 0; SCPtr->V0FrontPorchStart = 0; } else { RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GHSIZE_OFFSET); r_htotal = (RegValue) & XVTC_SB_START_MASK; SCPtr->HTotal = (r_htotal) & XVTC_SB_START_MASK; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSIZE_OFFSET); r_vtotal = (RegValue) & XVTC_SB_START_MASK; SCPtr->V0Total = (r_vtotal) & XVTC_SB_START_MASK; SCPtr->V1Total = (RegValue>>XVTC_SB_END_SHIFT) & XVTC_SB_START_MASK; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GASIZE_OFFSET); r_hactive = (RegValue) & XVTC_SB_START_MASK; SCPtr->HFrontPorchStart = (r_hactive) & XVTC_SB_START_MASK; r_vactive = (RegValue>>XVTC_SB_END_SHIFT) & XVTC_SB_START_MASK; SCPtr->V0FrontPorchStart = (r_vactive) & XVTC_SB_START_MASK; SCPtr->V1FrontPorchStart = SCPtr->V0FrontPorchStart; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GHSYNC_OFFSET); SCPtr->HSyncStart = ((RegValue) & XVTC_SB_START_MASK); SCPtr->HBackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT)) & XVTC_SB_START_MASK); RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_OFFSET); SCPtr->V0SyncStart = ((RegValue) & XVTC_SB_START_MASK); SCPtr->V0BackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT)) & XVTC_SB_START_MASK); RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_F1_OFFSET); SCPtr->V1SyncStart = ((RegValue) & XVTC_SB_START_MASK); SCPtr->V1BackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT)) & XVTC_SB_START_MASK); /* Get signal values from the Generator Vertical 2 Register (field 0)*/ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GFENC_OFFSET); SCPtr->V0ChromaStart = (((RegValue & XVTC_ENC_CPARITY_MASK) >> XVTC_ENC_CPARITY_SHIFT)) & XVTC_SB_START_MASK; SCPtr->V1ChromaStart = (((RegValue & XVTC_ENC_CPARITY_MASK) >> XVTC_ENC_CPARITY_SHIFT)) & XVTC_SB_START_MASK; SCPtr->HActiveStart = 0; SCPtr->V0ActiveStart = 0; SCPtr->V1ActiveStart = 0; } } /*****************************************************************************/ /** * * This function gets the VTC signal setting used by the Detector module * in the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param SignalCfgPtr is a pointer to a VTC signal configuration * which will be populated with the setting used by the Detector * module in the VTC core once this function returns. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetDetector(XVtc *InstancePtr, XVtc_Signal *SignalCfgPtr) { u32 RegValue; u32 r_htotal, r_vtotal, r_hactive, r_vactive; XVtc_Signal *SCPtr; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(SignalCfgPtr != NULL); SCPtr = SignalCfgPtr; if(SCPtr->OriginMode == 0) { RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DHSIZE_OFFSET); r_htotal = (RegValue) & XVTC_SB_START_MASK; SCPtr->HTotal = (r_htotal-1) & XVTC_SB_START_MASK; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DVSIZE_OFFSET); r_vtotal = (RegValue) & XVTC_SB_START_MASK; SCPtr->V0Total = (r_vtotal-1) & XVTC_SB_START_MASK; SCPtr->V1Total = (RegValue>>XVTC_SB_END_SHIFT) & XVTC_SB_START_MASK; if(SCPtr->V1Total != 0) { SCPtr->V1Total = SCPtr->V1Total - 1; } RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DASIZE_OFFSET); r_hactive = (RegValue) & XVTC_SB_START_MASK; SCPtr->HActiveStart = (r_htotal - r_hactive) & XVTC_SB_START_MASK; r_vactive = (RegValue>>XVTC_SB_END_SHIFT) & XVTC_SB_START_MASK; SCPtr->V0ActiveStart = (r_vtotal - r_vactive) & XVTC_SB_START_MASK; SCPtr->V1ActiveStart = (SCPtr->V1Total - r_vactive - 1) & XVTC_SB_START_MASK; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DHSYNC_OFFSET); SCPtr->HSyncStart = ((RegValue - r_hactive) & XVTC_SB_START_MASK); SCPtr->HBackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT) - r_hactive) & XVTC_SB_START_MASK); RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DVSYNC_OFFSET); SCPtr->V0SyncStart = ((RegValue-r_vactive+1) & XVTC_SB_START_MASK); SCPtr->V0BackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT) - r_vactive+1) & XVTC_SB_START_MASK); RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_F1_OFFSET); SCPtr->V1SyncStart = ((RegValue-r_vactive+1) & XVTC_SB_START_MASK); SCPtr->V1BackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT) - r_vactive+1) & XVTC_SB_START_MASK); /* Get signal values from the Generator Vertical 2 Register * (field 0) */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DFENC_OFFSET); SCPtr->V0ChromaStart = (((RegValue & XVTC_ENC_CPARITY_MASK) >> XVTC_ENC_CPARITY_SHIFT) + (r_vtotal - r_vactive)) & XVTC_SB_START_MASK; SCPtr->V1ChromaStart = (((RegValue & XVTC_ENC_CPARITY_MASK) >> XVTC_ENC_CPARITY_SHIFT) + (SCPtr->V1Total - r_vactive - 1)) & XVTC_SB_START_MASK; SCPtr->HFrontPorchStart = 0; SCPtr->V0FrontPorchStart = 0; } else { RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DHSIZE_OFFSET); r_htotal = (RegValue) & XVTC_SB_START_MASK; SCPtr->HTotal = (r_htotal) & XVTC_SB_START_MASK; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DVSIZE_OFFSET); r_vtotal = (RegValue) & XVTC_SB_START_MASK; SCPtr->V0Total = (r_vtotal) & XVTC_SB_START_MASK; SCPtr->V1Total = (RegValue>>XVTC_SB_END_SHIFT) & XVTC_SB_START_MASK; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DASIZE_OFFSET); r_hactive = (RegValue) & XVTC_SB_START_MASK; SCPtr->HFrontPorchStart = (r_hactive) & XVTC_SB_START_MASK; r_vactive = (RegValue>>XVTC_SB_END_SHIFT) & XVTC_SB_START_MASK; SCPtr->V0FrontPorchStart = (r_vactive) & XVTC_SB_START_MASK; SCPtr->V1FrontPorchStart = SCPtr->V0FrontPorchStart; RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DHSYNC_OFFSET); SCPtr->HSyncStart = ((RegValue) & XVTC_SB_START_MASK); SCPtr->HBackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT)) & XVTC_SB_START_MASK); RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DVSYNC_OFFSET); SCPtr->V0SyncStart = ((RegValue) & XVTC_SB_START_MASK); SCPtr->V0BackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT)) & XVTC_SB_START_MASK); RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_GVSYNC_F1_OFFSET); SCPtr->V1SyncStart = ((RegValue) & XVTC_SB_START_MASK); SCPtr->V1BackPorchStart = (((RegValue>>XVTC_SB_END_SHIFT)) & XVTC_SB_START_MASK); /* Get signal values from the Generator Vertical 2 Register * (field 0) */ RegValue = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_DFENC_OFFSET); SCPtr->V0ChromaStart = (((RegValue & XVTC_ENC_CPARITY_MASK) >> XVTC_ENC_CPARITY_SHIFT)) & XVTC_SB_START_MASK; SCPtr->V1ChromaStart = (((RegValue & XVTC_ENC_CPARITY_MASK) >> XVTC_ENC_CPARITY_SHIFT)) & XVTC_SB_START_MASK; SCPtr->HActiveStart = 0; SCPtr->V0ActiveStart = 0; SCPtr->V1ActiveStart = 0; } } /*****************************************************************************/ /** * * This function facilitates software identification of exact version of the * VTC hardware (h/w). * * @param InstancePtr is a pointer to the XVtc instance. * * @return Version, contents of a Version register. * * @note None. * ******************************************************************************/ u32 XVtc_GetVersion(XVtc *InstancePtr) { u32 Version; /* Verify argument */ Xil_AssertNonvoid(InstancePtr != NULL); /* Read Version register */ Version = XVtc_ReadReg(InstancePtr->Config.BaseAddress, XVTC_VER_OFFSET); return Version; } /*****************************************************************************/ /** * * This function converts the video mode integer into the video timing * information stored within the XVtc_Timing pointer. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param Mode is a u16 int defined as macro to one of the predefined * Video Modes. * @param TimingPtr is a pointer to a VTC Video Timing Structure. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_ConvVideoMode2Timing(XVtc *InstancePtr, u16 Mode, XVtc_Timing *TimingPtr) { /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(TimingPtr != NULL); /* clear timing structure. Set Interlaced to 0 by default */ memset((void *)TimingPtr, 0, sizeof(XVtc_Timing)); switch(Mode) { case XVTC_VMODE_720P: // 720p@60 (1280x720 HD 720) { // Horizontal Timing TimingPtr->HActiveVideo = 1280; TimingPtr->HFrontPorch = 110; TimingPtr->HSyncWidth = 40; TimingPtr->HBackPorch = 220; TimingPtr->HSyncPolarity = 1; // Vertical Timing TimingPtr->VActiveVideo = 720; TimingPtr->V0FrontPorch = 5; TimingPtr->V0SyncWidth = 5; TimingPtr->V0BackPorch = 20; TimingPtr->VSyncPolarity = 1; break; } case XVTC_VMODE_1080P: // 1080p@60 (1920x1080 HD 1080) { // Horizontal Timing TimingPtr->HActiveVideo = 1920; TimingPtr->HFrontPorch = 88; TimingPtr->HSyncWidth = 44; TimingPtr->HBackPorch = 148; TimingPtr->HSyncPolarity = 1; // Vertical Timing TimingPtr->VActiveVideo = 1080; TimingPtr->V0FrontPorch = 4; TimingPtr->V0SyncWidth = 5; TimingPtr->V0BackPorch = 36; TimingPtr->VSyncPolarity = 1; break; } case XVTC_VMODE_480P: // 480p@60 { // Horizontal Timing TimingPtr->HActiveVideo = 720; TimingPtr->HFrontPorch = 16; TimingPtr->HSyncWidth = 62; TimingPtr->HBackPorch = 60; TimingPtr->HSyncPolarity = 0; // Vertical Timing TimingPtr->VActiveVideo = 480; TimingPtr->V0FrontPorch = 9; TimingPtr->V0SyncWidth = 6; TimingPtr->V0BackPorch = 30; TimingPtr->VSyncPolarity = 0; break; } case XVTC_VMODE_576P: // 576p@50 { // Horizontal Timing TimingPtr->HActiveVideo = 720; TimingPtr->HFrontPorch = 12; TimingPtr->HSyncWidth = 64; TimingPtr->HBackPorch = 68; TimingPtr->HSyncPolarity = 0; // Vertical Timing TimingPtr->VActiveVideo = 576; TimingPtr->V0FrontPorch = 5; TimingPtr->V0SyncWidth = 5; TimingPtr->V0BackPorch = 39; TimingPtr->VSyncPolarity = 0; break; } case XVTC_VMODE_VGA: // 640x480 (VGA) { // Horizontal Timing TimingPtr->HActiveVideo = 656; TimingPtr->HFrontPorch = 8; TimingPtr->HSyncWidth = 96; TimingPtr->HBackPorch = 40; TimingPtr->HSyncPolarity = 0; // Vertical Timing TimingPtr->VActiveVideo = 496; TimingPtr->V0FrontPorch = 2; TimingPtr->V0SyncWidth = 2; TimingPtr->V0BackPorch = 25; TimingPtr->VSyncPolarity = 0; break; } case XVTC_VMODE_SVGA: // 800x600@60 (SVGA) { // Horizontal Timing TimingPtr->HActiveVideo = 800; TimingPtr->HFrontPorch = 40; TimingPtr->HSyncWidth = 128; TimingPtr->HBackPorch = 88; TimingPtr->HSyncPolarity = 1; // Vertical Timing TimingPtr->VActiveVideo = 600; TimingPtr->V0FrontPorch = 1; TimingPtr->V0SyncWidth = 4; TimingPtr->V0BackPorch = 23; TimingPtr->VSyncPolarity = 1; break; } case XVTC_VMODE_XGA: // 1024x768@60 (XGA) { // Horizontal Timing TimingPtr->HActiveVideo = 1024; TimingPtr->HFrontPorch = 24; TimingPtr->HSyncWidth = 136; TimingPtr->HBackPorch = 160; TimingPtr->HSyncPolarity = 0; // Vertical Timing TimingPtr->VActiveVideo = 768; TimingPtr->V0FrontPorch = 3; TimingPtr->V0SyncWidth = 6; TimingPtr->V0BackPorch = 29; TimingPtr->VSyncPolarity = 0; break; } case XVTC_VMODE_SXGA: // 1280x1024@60 (SXGA) { // Horizontal Timing TimingPtr->HActiveVideo = 1280; TimingPtr->HFrontPorch = 48; TimingPtr->HSyncWidth = 112; TimingPtr->HBackPorch = 248; TimingPtr->HSyncPolarity = 1; // Vertical Timing TimingPtr->VActiveVideo = 1024; TimingPtr->V0FrontPorch = 1; TimingPtr->V0SyncWidth = 3; TimingPtr->V0BackPorch = 38; TimingPtr->VSyncPolarity = 1; break; } case XVTC_VMODE_WXGAPLUS: // 1440x900@60 (WXGA+) { // Horizontal Timing TimingPtr->HActiveVideo = 1440; TimingPtr->HFrontPorch = 80; TimingPtr->HSyncWidth = 152; TimingPtr->HBackPorch = 232; TimingPtr->HSyncPolarity = 0; // Vertical Timing TimingPtr->VActiveVideo = 900; TimingPtr->V0FrontPorch = 3; TimingPtr->V0SyncWidth = 6; TimingPtr->V0BackPorch = 25; TimingPtr->VSyncPolarity = 1; break; } case XVTC_VMODE_WSXGAPLUS: // 1680x1050@60 (WSXGA+) { // Horizontal Timing TimingPtr->HActiveVideo = 1680; TimingPtr->HFrontPorch = 104; TimingPtr->HSyncWidth = 176; TimingPtr->HBackPorch = 280; TimingPtr->HSyncPolarity = 0; // Vertical Timing TimingPtr->VActiveVideo = 1050; TimingPtr->V0FrontPorch = 3; TimingPtr->V0SyncWidth = 6; TimingPtr->V0BackPorch = 30; TimingPtr->VSyncPolarity = 1; break; } case XVTC_VMODE_1080I: // 1080i@60 { TimingPtr->Interlaced = 1; // Horizontal Timing TimingPtr->HActiveVideo = 1920; TimingPtr->HFrontPorch = 88; TimingPtr->HSyncWidth = 44; TimingPtr->HBackPorch = 148; TimingPtr->HSyncPolarity = 1; // Vertical Timing TimingPtr->VActiveVideo = 540; TimingPtr->V0FrontPorch = 2; TimingPtr->V0SyncWidth = 5; TimingPtr->V0BackPorch = 15; TimingPtr->V1FrontPorch = 2; TimingPtr->V1SyncWidth = 5; TimingPtr->V1BackPorch = 16; TimingPtr->VSyncPolarity = 1; break; } case XVTC_VMODE_NTSC: //480i@60 { TimingPtr->Interlaced = 1; // Horizontal Timing TimingPtr->HActiveVideo = 720; TimingPtr->HFrontPorch = 19; TimingPtr->HSyncWidth = 62; TimingPtr->HBackPorch = 57; TimingPtr->HSyncPolarity = 0; // Vertical Timing TimingPtr->VActiveVideo = 240; TimingPtr->V0FrontPorch = 4; TimingPtr->V0SyncWidth = 3; TimingPtr->V0BackPorch = 15; TimingPtr->V1FrontPorch = 4; TimingPtr->V1SyncWidth = 3; TimingPtr->V1BackPorch = 16; TimingPtr->VSyncPolarity = 0; break; } case XVTC_VMODE_PAL: //576i@50 { TimingPtr->Interlaced = 1; // Horizontal Timing TimingPtr->HActiveVideo = 720; TimingPtr->HFrontPorch = 12; TimingPtr->HSyncWidth = 63; TimingPtr->HBackPorch = 69; TimingPtr->HSyncPolarity = 0; // Vertical Timing TimingPtr->VActiveVideo = 288; TimingPtr->V0FrontPorch = 2; TimingPtr->V0SyncWidth = 3; TimingPtr->V0BackPorch = 19; TimingPtr->V1FrontPorch = 2; TimingPtr->V1SyncWidth = 3; TimingPtr->V1BackPorch = 20; TimingPtr->VSyncPolarity = 0; break; } // add other video formats here } } /*****************************************************************************/ /** * * This function converts the video timing structure into the VTC signal * configuration structure, horizontal offsets structure and the * polarity structure. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param TimingPtr is a pointer to a Video Timing structure to be read. * @param SignalCfgPtr is a pointer to a VTC signal configuration to be * set. * @param HOffPtr is a pointer to a VTC horizontal offsets structure to * be set. * @param PolarityPtr is a pointer to a VTC polarity structure to be set. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_ConvTiming2Signal(XVtc *InstancePtr, XVtc_Timing *TimingPtr, XVtc_Signal *SignalCfgPtr, XVtc_HoriOffsets *HOffPtr, XVtc_Polarity *PolarityPtr) { /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(TimingPtr != NULL); Xil_AssertVoid(SignalCfgPtr != NULL); Xil_AssertVoid(HOffPtr != NULL); Xil_AssertVoid(PolarityPtr != NULL); /* Setting up VTC Polarity. */ memset((void *)PolarityPtr, 0, sizeof(XVtc_Polarity)); PolarityPtr->ActiveChromaPol = 1; PolarityPtr->ActiveVideoPol = 1; PolarityPtr->FieldIdPol = 1; /* Vblank matches Vsync Polarity */ PolarityPtr->VBlankPol = TimingPtr->VSyncPolarity; PolarityPtr->VSyncPol = TimingPtr->VSyncPolarity; /* hblank matches hsync Polarity */ PolarityPtr->HBlankPol = TimingPtr->HSyncPolarity; PolarityPtr->HSyncPol = TimingPtr->HSyncPolarity; memset((void *)SignalCfgPtr, 0, sizeof(XVtc_Signal)); memset((void *)HOffPtr, 0, sizeof(XVtc_HoriOffsets)); /* Populate the VTC Signal config structure. */ /* Active Video starts at 0 */ SignalCfgPtr->OriginMode = 1; SignalCfgPtr->HActiveStart = 0; SignalCfgPtr->HFrontPorchStart = TimingPtr->HActiveVideo; SignalCfgPtr->HSyncStart = SignalCfgPtr->HFrontPorchStart + TimingPtr->HFrontPorch; SignalCfgPtr->HBackPorchStart = SignalCfgPtr->HSyncStart + TimingPtr->HSyncWidth; SignalCfgPtr->HTotal = SignalCfgPtr->HBackPorchStart + TimingPtr->HBackPorch; SignalCfgPtr->V0ChromaStart = 0; SignalCfgPtr->V0ActiveStart = 0; SignalCfgPtr->V0FrontPorchStart = TimingPtr->VActiveVideo; SignalCfgPtr->V0SyncStart = SignalCfgPtr->V0FrontPorchStart + TimingPtr->V0FrontPorch; SignalCfgPtr->V0BackPorchStart = SignalCfgPtr->V0SyncStart + TimingPtr->V0SyncWidth; SignalCfgPtr->V0Total = SignalCfgPtr->V0BackPorchStart + TimingPtr->V0BackPorch; HOffPtr->V0BlankHoriStart = SignalCfgPtr->HFrontPorchStart; HOffPtr->V0BlankHoriEnd = SignalCfgPtr->HFrontPorchStart; HOffPtr->V0SyncHoriStart = SignalCfgPtr->HSyncStart; HOffPtr->V0SyncHoriEnd = SignalCfgPtr->HSyncStart; if(TimingPtr->Interlaced == 1) { SignalCfgPtr->V1ChromaStart = 0; SignalCfgPtr->V1ActiveStart = 0; SignalCfgPtr->V1FrontPorchStart = TimingPtr->VActiveVideo; SignalCfgPtr->V1SyncStart = SignalCfgPtr->V1FrontPorchStart + TimingPtr->V1FrontPorch; SignalCfgPtr->V1BackPorchStart = SignalCfgPtr->V1SyncStart + TimingPtr->V1SyncWidth; SignalCfgPtr->V1Total = SignalCfgPtr->V1BackPorchStart + TimingPtr->V1BackPorch; /* Align to H blank */ HOffPtr->V1BlankHoriStart = SignalCfgPtr->HFrontPorchStart; /* Align to H Blank */ HOffPtr->V1BlankHoriEnd = SignalCfgPtr->HFrontPorchStart; /* Align to half line */ HOffPtr->V1SyncHoriStart = SignalCfgPtr->HSyncStart - (SignalCfgPtr->HTotal / 2); HOffPtr->V1SyncHoriEnd = SignalCfgPtr->HSyncStart - (SignalCfgPtr->HTotal / 2); } /* Progressive formats */ else { /* Set Field 1 same as Field 0 */ SignalCfgPtr->V1ChromaStart = SignalCfgPtr->V0ChromaStart; SignalCfgPtr->V1ActiveStart = SignalCfgPtr->V0ActiveStart; SignalCfgPtr->V1FrontPorchStart = SignalCfgPtr->V0FrontPorchStart; SignalCfgPtr->V1SyncStart = SignalCfgPtr->V0SyncStart; SignalCfgPtr->V1BackPorchStart = SignalCfgPtr->V0BackPorchStart; SignalCfgPtr->V1Total = SignalCfgPtr->V0Total; HOffPtr->V1BlankHoriStart = HOffPtr->V0BlankHoriStart; HOffPtr->V1BlankHoriEnd = HOffPtr->V0BlankHoriEnd; HOffPtr->V1SyncHoriStart = HOffPtr->V0SyncHoriStart; HOffPtr->V1SyncHoriEnd = HOffPtr->V0SyncHoriEnd; } } /*****************************************************************************/ /** * * This function converts the VTC signal structure, horizontal offsets * structure and the polarity structure into the Video Timing structure. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param SignalCfgPtr is a pointer to a VTC signal configuration to * be read * @param HOffPtr is a pointer to a VTC horizontal offsets structure * to be read * @param PolarityPtr is a pointer to a VTC polarity structure to be * read. * @param TimingPtr is a pointer to a Video Timing structure to be set. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_ConvSignal2Timing(XVtc *InstancePtr, XVtc_Signal *SignalCfgPtr, XVtc_HoriOffsets *HOffPtr, XVtc_Polarity *PolarityPtr, XVtc_Timing *TimingPtr) { /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(SignalCfgPtr != NULL); Xil_AssertVoid(HOffPtr != NULL); Xil_AssertVoid(PolarityPtr != NULL); Xil_AssertVoid(TimingPtr != NULL); Xil_AssertVoid(SignalCfgPtr->OriginMode == 1); memset((void *)TimingPtr, 0, sizeof(XVtc_Timing)); /* Set Polarity */ TimingPtr->VSyncPolarity = PolarityPtr->VSyncPol; TimingPtr->HSyncPolarity = PolarityPtr->HSyncPol; /* Horizontal Timing */ TimingPtr->HActiveVideo = SignalCfgPtr->HFrontPorchStart; TimingPtr->HFrontPorch = SignalCfgPtr->HSyncStart - SignalCfgPtr->HFrontPorchStart; TimingPtr->HSyncWidth = SignalCfgPtr->HBackPorchStart - SignalCfgPtr->HSyncStart; TimingPtr->HBackPorch = SignalCfgPtr->HTotal - SignalCfgPtr->HBackPorchStart; /* Vertical Timing */ TimingPtr->VActiveVideo = SignalCfgPtr->V0FrontPorchStart; TimingPtr->V0FrontPorch = SignalCfgPtr->V0SyncStart - SignalCfgPtr->V0FrontPorchStart; TimingPtr->V0SyncWidth = SignalCfgPtr->V0BackPorchStart - SignalCfgPtr->V0SyncStart; TimingPtr->V0BackPorch = SignalCfgPtr->V0Total - SignalCfgPtr->V0BackPorchStart; TimingPtr->V1FrontPorch = SignalCfgPtr->V1SyncStart - SignalCfgPtr->V1FrontPorchStart; TimingPtr->V1SyncWidth = SignalCfgPtr->V1BackPorchStart - SignalCfgPtr->V1SyncStart; TimingPtr->V1BackPorch = SignalCfgPtr->V1Total - SignalCfgPtr->V1BackPorchStart; /* Interlaced */ if ((SignalCfgPtr->V1Total != 0x0) && (SignalCfgPtr->V1Total != SignalCfgPtr->V0Total)) { TimingPtr->Interlaced = 1; } } /*****************************************************************************/ /** * * This function converts the video timing structure into predefined video * mode values returned as a short integer. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param TimingPtr is a pointer to a Video Timing structure to be read. * * @return VideoMode is the video mode of the VTC core. * * @note None. * ******************************************************************************/ u16 XVtc_ConvTiming2VideoMode(XVtc *InstancePtr, XVtc_Timing *TimingPtr) { /* Verify arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertNonvoid(TimingPtr != NULL); /* Checking for Interlaced value */ if(TimingPtr->Interlaced == 0) { if(TimingPtr->HActiveVideo == 1280) { if (TimingPtr->VActiveVideo == 720) { return XVTC_VMODE_720P; } else if (TimingPtr->VActiveVideo == 1024) { return XVTC_VMODE_SXGA; } } else if((TimingPtr->HActiveVideo == 1920) && (TimingPtr->VActiveVideo == 1080)) { return XVTC_VMODE_1080P; } else if(TimingPtr->HActiveVideo == 720) { if (TimingPtr->VActiveVideo == 480) { return XVTC_VMODE_480P; } else if (TimingPtr->VActiveVideo == 576) { return XVTC_VMODE_576P; } } else if((TimingPtr->HActiveVideo == 656) && (TimingPtr->VActiveVideo == 496)) { return XVTC_VMODE_VGA; } else if((TimingPtr->HActiveVideo == 800) && (TimingPtr->VActiveVideo == 600)) { return XVTC_VMODE_SVGA; } else if((TimingPtr->HActiveVideo == 1024) && (TimingPtr->VActiveVideo == 768)) { return XVTC_VMODE_XGA; } else if((TimingPtr->HActiveVideo == 1440) && (TimingPtr->VActiveVideo == 900)) { return XVTC_VMODE_WXGAPLUS; } else if((TimingPtr->HActiveVideo == 1680) && (TimingPtr->VActiveVideo == 1050)) { return XVTC_VMODE_WSXGAPLUS; } } /* Interlaced */ else { if((TimingPtr->HActiveVideo == 720) && (TimingPtr->VActiveVideo == 240)) { return XVTC_VMODE_NTSC; } else if((TimingPtr->HActiveVideo == 1920) && (TimingPtr->VActiveVideo == 540)) { return XVTC_VMODE_1080I; } else if((TimingPtr->HActiveVideo == 720) && (TimingPtr->VActiveVideo == 288)) { return XVTC_VMODE_PAL; } } /* Not found - read from Timing to discover format */ return 0; } /*****************************************************************************/ /** * * This function sets up the generator (Polarity, H/V values and horizontal * offsets) by reading the configuration from a video timing structure. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param TimingPtr is a pointer to a Video Timing Structure to be read. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_SetGeneratorTiming(XVtc *InstancePtr, XVtc_Timing * TimingPtr) { XVtc_Polarity Polarity; XVtc_Signal Signal; XVtc_HoriOffsets Hoff; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(TimingPtr != NULL); XVtc_ConvTiming2Signal(InstancePtr, TimingPtr, &Signal, &Hoff, &Polarity); XVtc_SetPolarity(InstancePtr, &Polarity); XVtc_SetGenerator(InstancePtr, &Signal); XVtc_SetGeneratorHoriOffset(InstancePtr, &Hoff); } /*****************************************************************************/ /** * * This function sets up the generator (Polarity, H/V values and horizontal * offsets) by reading the configuration from a video mode short integer. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param Mode is a short integer predefined video mode. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_SetGeneratorVideoMode(XVtc *InstancePtr, u16 Mode) { XVtc_Timing Timing; /* Verify arguments */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); XVtc_ConvVideoMode2Timing(InstancePtr, Mode, &Timing); XVtc_SetGeneratorTiming(InstancePtr, &Timing); } /*****************************************************************************/ /** * * This function gets the video timing structure settings currently used by * generator in the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param TimingPtr is a pointer to a Video Timing Structure to be set. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetGeneratorTiming(XVtc *InstancePtr, XVtc_Timing *TimingPtr) { XVtc_Polarity Polarity; XVtc_Signal Signal; XVtc_HoriOffsets Hoff; /* Verify arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(TimingPtr != NULL); Signal.OriginMode = 1; XVtc_GetPolarity(InstancePtr, &Polarity); XVtc_GetGeneratorHoriOffset(InstancePtr, &Hoff); XVtc_GetGenerator(InstancePtr, &Signal); XVtc_ConvSignal2Timing(InstancePtr, &Signal, &Hoff, &Polarity, TimingPtr); } /*****************************************************************************/ /** * * This function gets the video mode currently used by the generator * in the VTC core. If the video mode is unknown or not recognized, then 0 * will be returned. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * * @return VideoMode is the video mode of the VTC core. * * @note Note. * ******************************************************************************/ u16 XVtc_GetGeneratorVideoMode(XVtc *InstancePtr) { u16 mode; XVtc_Timing Timing; /* Verify arguments */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); XVtc_GetGeneratorTiming(InstancePtr, &Timing); mode = XVtc_ConvTiming2VideoMode(InstancePtr, &Timing); return mode; } /*****************************************************************************/ /** * * This function gets the video timing structure settings currently reported by * the detector in the VTC core. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * @param TimingPtr is a pointer to a Video Timing structure to be set. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_GetDetectorTiming(XVtc *InstancePtr, XVtc_Timing *TimingPtr) { XVtc_Polarity Polarity; XVtc_Signal Signal; XVtc_HoriOffsets Hoff; /* Verify arguments */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(TimingPtr != NULL); Signal.OriginMode = 1; XVtc_GetDetector(InstancePtr, &Signal); XVtc_GetDetectorPolarity(InstancePtr, &Polarity); XVtc_GetDetectorHoriOffset(InstancePtr, &Hoff); XVtc_ConvSignal2Timing(InstancePtr, &Signal, &Hoff, &Polarity, TimingPtr); } /*****************************************************************************/ /** * * This function gets the video mode currently reported by the detector * in the VTC core. If the video mode is unknown or not recognized, then 0 * will be returned. * * @param InstancePtr is a pointer to the VTC instance to be * worked on. * * @return VideoMode is the video mode of the VTC core. * * @note None. * ******************************************************************************/ u16 XVtc_GetDetectorVideoMode(XVtc *InstancePtr) { u16 mode; XVtc_Timing Timing; /* Verify arguments */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); XVtc_GetDetectorTiming(InstancePtr, &Timing); mode = XVtc_ConvTiming2VideoMode(InstancePtr, &Timing); return mode; } /*****************************************************************************/ /** * * This routine is a stub for the asynchronous callbacks. The stub is here in * case the upper layer forgot to set the handlers. On initialization, all * handlers except error handler are set to this callback. It is considered an * error for this handler to be invoked. * * @param CallBackRef is a callback reference passed in by the upper * layer when setting the callback functions, and passed back * to the upper layer when the callback is invoked. * * @return None. * * @note None. * ******************************************************************************/ static void StubCallBack(void *CallBackRef) { (void)CallBackRef; Xil_AssertVoidAlways(); } /*****************************************************************************/ /** * * This routine is a stub for the asynchronous error interrupt callback. The * stub is here in case the upper layer forgot to set the handler. On * initialization, Error interrupt handler is set to this callback. It is * considered an error for this handler to be invoked. * * @param CallBackRef is a callback reference passed in by the upper * layer when setting the callback functions, and passed back to * the upper layer when the callback is invoked. * @param ErrorMask is a bit mask indicating the cause of the error. Its * value equals 'OR'ing one or more XVTC_IXR_*_MASK values defined * in xvtc_hw.h. * * @return None. * * @note None. * ******************************************************************************/ static void StubErrCallBack(void *CallBackRef, u32 ErrorMask) { (void)CallBackRef; (void)ErrorMask; Xil_AssertVoidAlways(); }