/** * * This function installs an asynchronous callback function for the given * HandlerType: * * <pre> * HandlerType Callback Function Type * ------------------------------ --------------------------------------------- * (XDPTXSS_HANDLER_DP_HPD_EVENT) XDp_TxSetHpdEventHandler * (XDPTXSS_HANDLER_DP_HPD_PULSE) XDp_TxSetHpdPulseHandler * </pre> * * @param InstancePtr is a pointer to the XDpTxSs core instance. * @param HandlerType specifies the type of handler. * @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 if callback function installed successfully. * - 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. * ******************************************************************************/ u32 XDpTxSs_SetCallBack(XDpTxSs *InstancePtr, u32 HandlerType, void *CallbackFunc, void *CallbackRef) { u32 Status; /* Verify arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertNonvoid(HandlerType >= XDPTXSS_HANDLER_DP_HPD_EVENT); Xil_AssertNonvoid(CallbackFunc != NULL); Xil_AssertNonvoid(CallbackRef != NULL); /* Assign callback based on handler type */ switch (HandlerType) { case XDPTXSS_HANDLER_DP_HPD_EVENT: XDp_TxSetHpdEventHandler(InstancePtr->DpPtr, CallbackFunc, CallbackRef); Status = XST_SUCCESS; break; case XDPTXSS_HANDLER_DP_HPD_PULSE: XDp_TxSetHpdPulseHandler(InstancePtr->DpPtr, CallbackFunc, CallbackRef); Status = XST_SUCCESS; break; default: Status = XST_INVALID_PARAM; break; } return Status; }
/** * * This function installs an asynchronous callback function for the given * HandlerType: * * <pre> * HandlerType Callback Function Type * ----------------------------------- ------------------------------------- * (XDPTXSS_HANDLER_DP_HPD_EVENT) XDp_TxSetHpdEventHandler * (XDPTXSS_HANDLER_DP_HPD_PULSE) XDp_TxSetHpdPulseHandler * (XDPTXSS_HANDLER_DP_LANE_COUNT_CHG) XDp_TxSetLaneCountChangeCallback * (XDPTXSS_HANDLER_DP_LINK_RATE_CHG) XDp_TxSetLinkRateChangeCallback * (XDPTXSS_HANDLER_DP_PE_VS_ADJUST) XDp_TxSetPeVsAdjustCallback * (XDPTXSS_HANDLER_DP_SET_MSA) XDp_TxSetMsaHandler * </pre> * * @param InstancePtr is a pointer to the XDpTxSs core instance. * @param HandlerType specifies the type of handler. * @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 if callback function installed successfully. * - 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. * ******************************************************************************/ u32 XDpTxSs_SetCallBack(XDpTxSs *InstancePtr, u32 HandlerType, void *CallbackFunc, void *CallbackRef) { u32 Status; /* Verify arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertNonvoid(HandlerType >= XDPTXSS_HANDLER_DP_HPD_EVENT); Xil_AssertNonvoid(CallbackFunc != NULL); Xil_AssertNonvoid(CallbackRef != NULL); /* Assign callback based on handler type */ switch (HandlerType) { case XDPTXSS_HANDLER_DP_HPD_EVENT: XDp_TxSetHpdEventHandler(InstancePtr->DpPtr, CallbackFunc, CallbackRef); Status = XST_SUCCESS; break; case XDPTXSS_HANDLER_DP_HPD_PULSE: XDp_TxSetHpdPulseHandler(InstancePtr->DpPtr, CallbackFunc, CallbackRef); Status = XST_SUCCESS; break; case XDPTXSS_HANDLER_DP_LANE_COUNT_CHG: XDp_TxSetLaneCountChangeCallback(InstancePtr->DpPtr, CallbackFunc, CallbackRef); Status = XST_SUCCESS; break; case XDPTXSS_HANDLER_DP_LINK_RATE_CHG: XDp_TxSetLinkRateChangeCallback(InstancePtr->DpPtr, CallbackFunc, CallbackRef); Status = XST_SUCCESS; break; case XDPTXSS_HANDLER_DP_PE_VS_ADJUST: XDp_TxSetPeVsAdjustCallback(InstancePtr->DpPtr, CallbackFunc, CallbackRef); Status = XST_SUCCESS; break; case XDPTXSS_HANDLER_DP_SET_MSA: XDp_TxSetMsaHandler(InstancePtr->DpPtr, CallbackFunc, CallbackRef); Status = XST_SUCCESS; break; default: Status = XST_INVALID_PARAM; break; } return Status; }
/** * This function sets up the interrupt system such that interrupts caused by * Hot-Plug-Detect (HPD) events and pulses are handled. This function is * application-specific for systems that have an interrupt controller connected * to the processor. The user should modify this function to fit the * application. * * @param InstancePtr is a pointer to the XDp instance. * @param IntcPtr is a pointer to the interrupt instance. * @param IntrId is the unique device ID of the interrupt controller. * @param DpIntrId is the interrupt ID of the DisplayPort TX connection to * the interrupt controller. * @param HpdEventHandler is a pointer to the handler called when an HPD * event occurs. * @param HpdPulseHandler is a pointer to the handler called when an HPD * pulse occurs. * * @return * - XST_SUCCESS if the interrupt system was successfully set up. * - XST_FAILURE otherwise. * * @note An interrupt controller must be present in the system, connected * to the processor and the DisplayPort TX core. * *******************************************************************************/ static u32 Dptx_SetupInterruptHandler(XDp *InstancePtr, INTC *IntcPtr, u16 IntrId, u16 DpIntrId, XDp_IntrHandler HpdEventHandler, XDp_IntrHandler HpdPulseHandler) { u32 Status; /* Set the HPD interrupt handlers. */ XDp_TxSetHpdEventHandler(InstancePtr, HpdEventHandler, InstancePtr); XDp_TxSetHpdPulseHandler(InstancePtr, HpdPulseHandler, InstancePtr); /* Initialize interrupt controller driver. */ #ifdef XPAR_INTC_0_DEVICE_ID Status = XIntc_Initialize(IntcPtr, IntrId); if (Status != XST_SUCCESS) { return XST_FAILURE; } #else XScuGic_Config *IntcConfig; IntcConfig = XScuGic_LookupConfig(IntrId); Status = XScuGic_CfgInitialize(IntcPtr, IntcConfig, IntcConfig->CpuBaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } XScuGic_SetPriorityTriggerType(IntcPtr, DpIntrId, 0xA0, 0x1); #endif /* XPAR_INTC_0_DEVICE_ID */ /* Connect the device driver handler that will be called when an * interrupt for the device occurs, the handler defined above performs * the specific interrupt processing for the device. */ #ifdef XPAR_INTC_0_DEVICE_ID Status = XIntc_Connect(IntcPtr, DpIntrId, (XInterruptHandler)XDp_InterruptHandler, InstancePtr); #else Status = XScuGic_Connect(IntcPtr, DpIntrId, (Xil_InterruptHandler)XDp_InterruptHandler, InstancePtr); #endif /* XPAR_INTC_0_DEVICE_ID */ if (Status != XST_SUCCESS) { return XST_FAILURE; } /* Start the interrupt controller. */ #ifdef XPAR_INTC_0_DEVICE_ID Status = XIntc_Start(IntcPtr, XIN_REAL_MODE); if (Status != XST_SUCCESS) { return XST_FAILURE; } XIntc_Enable(IntcPtr, DpIntrId); #else XScuGic_Enable(IntcPtr, DpIntrId); #endif /* XPAR_INTC_0_DEVICE_ID */ /* Initialize the exception table. */ Xil_ExceptionInit(); /* Register the interrupt controller handler with the exception table. */ Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)INTC_HANDLER, IntcPtr); /* Enable exceptions. */ Xil_ExceptionEnable(); return XST_SUCCESS; }