📄 xgpiops_intr.c
字号:
** @param InstancePtr is a pointer to the XGpioPs instance.* @param Pin is the pin number for which the interrupt status is to be* cleared. Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1.** @note None.******************************************************************************/void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, int Pin){ u8 Bank; u8 PinNumber; u32 IntrReg; Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); /* * Get the Bank number and Pin number within the bank. */ XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); /* * Clear the specified pending interrupts. */ IntrReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTSTS_OFFSET); IntrReg &= (1 << Pin); XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTSTS_OFFSET, IntrReg);}/****************************************************************************//**** This function is used for setting the Interrupt Type, Interrupt Polarity and* Interrupt On Any for the specified GPIO Bank pins.** @param InstancePtr is a pointer to an XGpioPs instance.* @param Bank is the bank number of the GPIO to operate on.* Valid values are 0 to XGPIOPS_MAX_BANKS - 1.* @param IntrType is the 32 bit mask of the interrupt type.* 0 means Level Sensitive and 1 means Edge Sensitive.* @param IntrPolarity is the 32 bit mask of the interrupt polarity.* 0 means Active Low or Falling Edge and 1 means Active High or* Rising Edge.* @param IntrOnAny is the 32 bit mask of the interrupt trigger for* edge triggered interrupts. 0 means trigger on single edge using* the configured interrupt polarity and 1 means trigger on both* edges.** @return None.** @note This function is used for setting the interrupt related* properties of all the pins in the specified bank. The previous* state of the pins is not maintained.* To change the Interrupt properties of a single GPIO pin, use the* function XGpioPs_SetPinIntrType().******************************************************************************/void XGpioPs_SetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 IntrType, u32 IntrPolarity, u32 IntrOnAny){ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET, IntrType); XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTPOL_OFFSET, IntrPolarity); XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTANY_OFFSET, IntrOnAny);}/****************************************************************************//**** This function is used for getting the Interrupt Type, Interrupt Polarity and* Interrupt On Any for the specified GPIO Bank pins.** @param InstancePtr is a pointer to an XGpioPs instance.* @param Bank is the bank number of the GPIO to operate on.* Valid values are 0 to XGPIOPS_MAX_BANKS - 1.* @param IntrType returns the 32 bit mask of the interrupt type.* 0 means Level Sensitive and 1 means Edge Sensitive.* @param IntrPolarity returns the 32 bit mask of the interrupt* polarity. 0 means Active Low or Falling Edge and 1 means* Active High or Rising Edge.* @param IntrOnAny returns the 32 bit mask of the interrupt trigger for* edge triggered interrupts. 0 means trigger on single edge using* the configured interrupt polarity and 1 means trigger on both* edges.** @return None.** @note None.******************************************************************************/void XGpioPs_GetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 *IntrType, u32 *IntrPolarity, u32 *IntrOnAny){ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); *IntrType = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET); *IntrPolarity = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTPOL_OFFSET); *IntrOnAny = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTANY_OFFSET);}/****************************************************************************//**** This function is used for setting the IRQ Type of a single GPIO pin.** @param InstancePtr is a pointer to an XGpioPs instance.* @param Pin is the pin number whose IRQ type is to be set.* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1.* @param IrqType is the IRQ type for GPIO Pin. Use XGPIOPS_IRQ_TYPE_** defined in xgpiops.h to specify the IRQ type.** @return None.** @note None.******************************************************************************/void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, int Pin, u8 IrqType){ u32 IntrTypeReg; u32 IntrPolReg; u32 IntrOnAnyReg; u8 Bank; u8 PinNumber; Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); Xil_AssertVoid(IrqType <= XGPIOPS_IRQ_TYPE_LEVEL_LOW); /* * Get the Bank number and Pin number within the bank. */ XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); IntrTypeReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET); IntrPolReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTPOL_OFFSET); IntrOnAnyReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTANY_OFFSET); switch (IrqType) { case XGPIOPS_IRQ_TYPE_EDGE_RISING: IntrTypeReg |= (1 << PinNumber); IntrPolReg |= (1 << PinNumber); IntrOnAnyReg &= ~(1 << PinNumber); break; case XGPIOPS_IRQ_TYPE_EDGE_FALLING: IntrTypeReg |= (1 << PinNumber); IntrPolReg &= ~(1 << PinNumber); IntrOnAnyReg &= ~(1 << PinNumber); break; case XGPIOPS_IRQ_TYPE_EDGE_BOTH: IntrTypeReg |= (1 << PinNumber); IntrOnAnyReg |= (1 << PinNumber); break; case XGPIOPS_IRQ_TYPE_LEVEL_HIGH: IntrTypeReg &= ~(1 << PinNumber); IntrPolReg |= (1 << PinNumber); break; case XGPIOPS_IRQ_TYPE_LEVEL_LOW: IntrTypeReg &= ~(1 << PinNumber); IntrPolReg &= ~(1 << PinNumber); break; } XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET, IntrTypeReg); XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTPOL_OFFSET, IntrPolReg); XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTANY_OFFSET, IntrOnAnyReg);}/****************************************************************************//**** This function returns the IRQ Type of a given GPIO pin.** @param InstancePtr is a pointer to an XGpioPs instance.* @param Pin is the pin number whose IRQ type is to be obtained.* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1.** @return None.** @note Use XGPIOPS_IRQ_TYPE_* defined in xgpiops.h for the IRQ type* returned by this function.******************************************************************************/u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, int Pin){ u32 IntrType; u32 IntrPol; u32 IntrOnAny; u8 Bank; u8 PinNumber; u8 IrqType; Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertNonvoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); /* * Get the Bank number and Pin number within the bank. */ XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); IntrType = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET) & PinNumber; IntrPol = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTPOL_OFFSET) & PinNumber; IntrOnAny = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, ((Bank) * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTANY_OFFSET) & PinNumber; if (IntrType == 1) { if (IntrOnAny == 1) { IrqType = XGPIOPS_IRQ_TYPE_EDGE_BOTH; } else if (IntrPol == 1) { IrqType = XGPIOPS_IRQ_TYPE_EDGE_RISING; } else { IrqType = XGPIOPS_IRQ_TYPE_EDGE_FALLING; } } else { if (IntrPol == 1) { IrqType = XGPIOPS_IRQ_TYPE_LEVEL_HIGH; } else { IrqType = XGPIOPS_IRQ_TYPE_LEVEL_LOW; } } return IrqType;}/*****************************************************************************//**** This function sets the status callback function. The callback function is* called by the XGpioPs_IntrHandler when an interrupt occurs.** @param InstancePtr is a pointer to the XGpioPs instance.* @param CallBackRef is the upper layer callback reference passed back* when the callback function is invoked.* @param FuncPtr is the pointer to the callback function.*** @return None.** @note The handler is called within interrupt context, so it should do* its work quickly and queue potentially time-consuming work to a* task-level thread.*******************************************************************************/void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef, XGpioPs_Handler FuncPtr){ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(FuncPtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); InstancePtr->Handler = FuncPtr; InstancePtr->CallBackRef = CallBackRef;}/*****************************************************************************//**** This function is the interrupt handler for GPIO interrupts.It checks the* interrupt status registers of all the banks to determine the actual bank in* which an interrupt has been triggered. It then calls the upper layer callback* handler set by the function XGpioPs_SetBankHandler(). The callback is called* when an interrupt** @param InstancePtr is a pointer to the XGpioPs instance.** @return None.** @note This function does not save and restore the processor context* such that the user must provide this processing.*******************************************************************************/void XGpioPs_IntrHandler(XGpioPs *InstancePtr){ u8 Bank; u32 IntrStatus; u32 IntrEnabled; Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); for (Bank = 0; Bank < XGPIOPS_MAX_BANKS; Bank++) { IntrStatus = XGpioPs_IntrGetStatus(InstancePtr, Bank); if (IntrStatus != 0) { IntrEnabled = XGpioPs_IntrGetEnabled(InstancePtr, Bank); XGpioPs_IntrClear(InstancePtr, Bank, IntrStatus & IntrEnabled); InstancePtr->Handler((void *)InstancePtr-> CallBackRef, Bank, (IntrStatus & IntrEnabled)); } }}/*****************************************************************************//**** This is a stub for the status callback. The stub is here in case the upper* layers do not set the handler.** @param CallBackRef is a pointer to the upper layer callback reference* @param Bank is the GPIO Bank in which an interrupt occurred.* @param Status is the Interrupt status of the GPIO bank.** @return None.** @note None.*******************************************************************************/void StubHandler(void *CallBackRef, int Bank, u32 Status){ (void) CallBackRef; (void) Bank; (void) Status; Xil_AssertVoidAlways();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -