/****************************************************************************** * * 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_intr.c * * This file contains interrupt related functions of Xilinx VTC core. * Please see xvtc.h for more details of the core. * *
* 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_Exception
*                                                 RegisterHandler"
*                       "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_Exception
*                                                         Enable"
*                       "microblaze_disable_interrupts" -> "Xil_Exception
*                                                           Disable"
*                       "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_DCache
*                                                        InvalidateRange"
*
*                       "XCache_DisableDCache" -> "Xil_DCacheDisable"
*                       "XCache_DisableICache" -> "Xil_ICacheDisable"
*                       "XCache_EnableDCache" -> "Xil_DCacheEnableRegion"
*                       "XCache_EnableICache" -> "Xil_ICacheEnableRegion"
*                       "XCache_InvalidateDCacheLine" -> "Xil_DCache
*                                                             InvalidateRange"
*
*                       "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"
* 6.1   adk    08/23/14 Alligned doxygen tags.
* 
* ******************************************************************************/ /***************************** Include Files *********************************/ #include "xvtc.h" /************************** Constant Definitions *****************************/ /***************** Macros (Inline Functions) Definitions *********************/ /**************************** Type Definitions *******************************/ /************************** Function Prototypes ******************************/ /************************** Variable Definitions *****************************/ /************************** Function Definitions *****************************/ /*****************************************************************************/ /** * * This function is the interrupt handler for the VTC core. * * This handler reads the pending interrupt from the IER/ISR, determines the * source of the interrupts, calls according callbacks and finally clears the * interrupts. * * The application is responsible for connecting this function to the interrupt * system. Application beyond this driver is also responsible for providing * callbacks to handle interrupts and installing the callbacks using * XVtc_SetCallBack() during initialization phase. * * @param InstancePtr is a pointer to the XVtc instance that just * interrupted. * * @return None. * * @note None. * ******************************************************************************/ void XVtc_IntrHandler(void *InstancePtr) { u32 PendingIntr; u32 ErrorStatus; XVtc *XVtcPtr = (XVtc *) InstancePtr; /* Verify arguments. */ Xil_AssertVoid(XVtcPtr != NULL); Xil_AssertVoid(XVtcPtr->IsReady == XIL_COMPONENT_IS_READY); /* Get pending interrupts */ PendingIntr = XVtc_IntrGetPending(XVtcPtr); /* Clear pending interrupt(s) */ XVtc_IntrClear(XVtcPtr, PendingIntr); /* Spurious interrupt has happened */ if (0 == (PendingIntr | XVTC_IXR_ALLINTR_MASK)) { ErrorStatus = 0; XVtcPtr->ErrCallBack(XVtcPtr->ErrRef, ErrorStatus); return; } /* A generator event has happened */ if ((PendingIntr & XVTC_IXR_G_ALL_MASK)) XVtcPtr->GeneratorCallBack(XVtcPtr->GeneratorRef, PendingIntr); /* A detector event has happened */ if ((PendingIntr & XVTC_IXR_D_ALL_MASK)) XVtcPtr->DetectorCallBack(XVtcPtr->DetectorRef, PendingIntr); /* A frame sync is done */ if ((PendingIntr & XVTC_IXR_FSYNCALL_MASK)) XVtcPtr->FrameSyncCallBack(XVtcPtr->FrameSyncRef, PendingIntr); /* A signal lock is detected */ if ((PendingIntr & XVTC_IXR_LOCKALL_MASK)) XVtcPtr->LockCallBack(XVtcPtr->LockRef, PendingIntr); } /*****************************************************************************/ /** * * This routine installs an asynchronous callback function for the given * HandlerType: * *
* HandlerType              Callback Function Type
* -----------------------  --------------------------------------------------
* XVTC_HANDLER_FRAMESYNC   XVtc_FrameSyncCallBack
* XVTC_HANDLER_LOCK        XVtc_LockCallBack
* XVTC_HANDLER_DETECTOR    XVtc_DetectorCallBack
* XVTC_HANDLER_GENERATOR   XVtc_GeneratorCallBack
* XVTC_HANDLER_ERROR       XVtc_ErrCallBack
*
* HandlerType              Invoked by this driver when:
* -----------------------  --------------------------------------------------
* XVTC_HANDLER_FRAMESYNC   A frame sync event happens
* XVTC_HANDLER_LOCK        A signal lock event happens
* XVTC_HANDLER_DETECTOR    A detector related event happens
* XVTC_HANDLER_GENERATOR   A generator related event happens
* XVTC_HANDLER_ERROR       An error condition happens
* 
* * @param InstancePtr is a pointer to the XVtc instance to be worked * on. * @param HandlerType specifies which callback is to be attached. * @param CallBackFunc is the address of the callback function. * @param CallBackRef is a user data item that will be passed to the * callback function when it is invoked. * * @return * - XST_SUCCESS when handler is installed. * - XST_INVALID_PARAM when HandlerType is invalid. * * @note Invoking this function for a handler that already has been * installed replaces it with the new handler. * ******************************************************************************/ int XVtc_SetCallBack(XVtc *InstancePtr, u32 HandlerType, void *CallBackFunc, void *CallBackRef) { /* Verify arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* For specific handler type assigning callback function reference */ switch (HandlerType) { case XVTC_HANDLER_FRAMESYNC: InstancePtr->FrameSyncCallBack = (XVtc_CallBack) CallBackFunc; InstancePtr->FrameSyncRef = CallBackRef; break; case XVTC_HANDLER_LOCK: InstancePtr->LockCallBack = (XVtc_CallBack) CallBackFunc; InstancePtr->LockRef = CallBackRef; break; case XVTC_HANDLER_DETECTOR: InstancePtr->DetectorCallBack = (XVtc_CallBack) CallBackFunc; InstancePtr->DetectorRef = CallBackRef; break; case XVTC_HANDLER_GENERATOR: InstancePtr->GeneratorCallBack = (XVtc_CallBack) CallBackFunc; InstancePtr->GeneratorRef = CallBackRef; break; case XVTC_HANDLER_ERROR: InstancePtr->ErrCallBack = (XVtc_ErrorCallBack) CallBackFunc; InstancePtr->ErrRef = CallBackRef; break; default: return XST_INVALID_PARAM; } return XST_SUCCESS; }