/** * * Set the interrupt service option, which can configure the driver so that it * services only a single interrupt at a time when an interrupt occurs, or * services all pending interrupts when an interrupt occurs. The default * behavior when using the driver interface given in xintc.h file is to service * only a single interrupt, whereas the default behavior when using the driver * interface given in this file is to service all outstanding interrupts when an * interrupt occurs. * * @param BaseAddress is the unique identifier for a device. * @param Option is XIN_SVC_SGL_ISR_OPTION if you want only a single * interrupt serviced when an interrupt occurs, or * XIN_SVC_ALL_ISRS_OPTION if you want all pending interrupts * serviced when an interrupt occurs. * * @return None. * * @note * * Note that this function has no effect if the input base address is invalid. * ******************************************************************************/ void XIntc_SetIntrSvcOption(u32 BaseAddress, int Option) { XIntc_Config *CfgPtr; CfgPtr = LookupConfigByBaseAddress(BaseAddress); if (CfgPtr != NULL) { CfgPtr->Options = Option; } }
/** * * Register a handler function for a specific interrupt ID. The vector table * of the interrupt controller is updated, overwriting any previous handler. * The handler function will be called when an interrupt occurs for the given * interrupt ID. * * @param BaseAddress is the CPU Interface Register base address of the * interrupt controller whose vector table will be modified. * @param InterruptId is the interrupt ID to be associated with the input * handler. * @param Handler is the function pointer that will be added to * the vector table for the given interrupt ID. * @param CallBackRef is the argument that will be passed to the new * handler function when it is called. This is user-specific. * * @return None. * * @note * * Note that this function has no effect if the input base address is invalid. * ******************************************************************************/ void XScuGic_RegisterHandler(u32 BaseAddress, int InterruptId, Xil_InterruptHandler Handler, void *CallBackRef) { XScuGic_Config *CfgPtr; CfgPtr = LookupConfigByBaseAddress(BaseAddress); if (CfgPtr != NULL) { CfgPtr->HandlerTable[InterruptId].Handler = Handler; CfgPtr->HandlerTable[InterruptId].CallBackRef = CallBackRef; } }
/** * * Register a handler function for a specific interrupt ID. The vector table * of the interrupt controller is updated, overwriting any previous handler. * The handler function will be called when an interrupt occurs for the given * interrupt ID. * * @param BaseAddress is the CPU Interface Register base address of the * interrupt controller whose vector table will be modified. * @param InterruptId is the interrupt ID to be associated with the input * handler. * @param Handler is the function pointer that will be added to * the vector table for the given interrupt ID. * @param CallBackRef is the argument that will be passed to the new * handler function when it is called. This is user-specific. * * @return None. * * @note * * Note that this function has no effect if the input base address is invalid. * ******************************************************************************/ void XScuGic_RegisterHandler(u32 BaseAddress, s32 InterruptID, Xil_InterruptHandler IntrHandler, void *CallBackRef) { XScuGic_Config *CfgPtr; CfgPtr = LookupConfigByBaseAddress(BaseAddress); if(CfgPtr != NULL) { if( IntrHandler != NULL) { CfgPtr->HandlerTable[InterruptID].Handler = IntrHandler; } if( CallBackRef != NULL) { CfgPtr->HandlerTable[InterruptID].CallBackRef = CallBackRef; } } }
/** * * Set the interrupt service option, which can configure the driver so that it * services only a single interrupt at a time when an interrupt occurs, or * services all pending interrupts when an interrupt occurs. The default * behavior when using the driver interface given in xintc.h file is to service * only a single interrupt, whereas the default behavior when using the driver * interface given in this file is to service all outstanding interrupts when an * interrupt occurs. In Cascade mode same Option is set to Slave controllers. * * @param BaseAddress is the unique identifier for a device. * @param Option is XIN_SVC_SGL_ISR_OPTION if you want only a single * interrupt serviced when an interrupt occurs, or * XIN_SVC_ALL_ISRS_OPTION if you want all pending interrupts * serviced when an interrupt occurs. * * @return None. * * @note * * Note that this function has no effect if the input base address is invalid. * ******************************************************************************/ void XIntc_SetIntrSvcOption(u32 BaseAddress, int Option) { XIntc_Config *CfgPtr; CfgPtr = LookupConfigByBaseAddress(BaseAddress); if (CfgPtr != NULL) { CfgPtr->Options = Option; /* If Cascade mode set the option for all Slaves */ if (CfgPtr->IntcType != XIN_INTC_NOCASCADE) { int Index; for (Index = 1; Index <= XPAR_XINTC_NUM_INSTANCES - 1; Index++) { CfgPtr = XIntc_LookupConfig(Index); CfgPtr->Options = Option; } } } }
/** * * Register a handler function for a specific interrupt ID. The vector table * of the interrupt controller is updated, overwriting any previous handler. * The handler function will be called when an interrupt occurs for the given * interrupt ID. * * This function can also be used to remove a handler from the vector table * by passing in the XIntc_DefaultHandler() as the handler and NULL as the * callback reference. * In Cascade mode Interrupt Id is used to set Handler for corresponding Slave * Controller * * @param BaseAddress is the base address of the interrupt controller * whose vector table will be modified. * @param InterruptId is the interrupt ID to be associated with the input * handler. * @param Handler is the function pointer that will be added to * the vector table for the given interrupt ID. * @param CallBackRef is the argument that will be passed to the new * handler function when it is called. This is user-specific. * * @return None. * * @note * * Note that this function has no effect if the input base address is invalid. * ******************************************************************************/ void XIntc_RegisterHandler(u32 BaseAddress, int InterruptId, XInterruptHandler Handler, void *CallBackRef) { XIntc_Config *CfgPtr; CfgPtr = LookupConfigByBaseAddress(BaseAddress); if (CfgPtr != NULL) { if (InterruptId > 31) { CfgPtr = XIntc_LookupConfig(InterruptId/32); CfgPtr->HandlerTable[InterruptId%32].Handler = Handler; CfgPtr->HandlerTable[InterruptId%32].CallBackRef = CallBackRef; } else { CfgPtr->HandlerTable[InterruptId].Handler = Handler; CfgPtr->HandlerTable[InterruptId].CallBackRef = CallBackRef; } } }