/** * * This function returns the alarm event status by reading * interrupt status register. * * @param InstancePtr is a pointer to the XRtcPsu instance. * * @return Returns 1 if the alarm event is generated.Else 0. * * @note This API is used in polled mode operation of RTC. * This also clears interrupt status alarm bit. * *****************************************************************************/ u32 XRtcPsu_IsAlarmEventGenerated(XRtcPsu *InstancePtr) { u32 Status; /* Loop the interrupt status register for Alarm Event */ if ((XRtcPsu_ReadReg(InstancePtr->RtcConfig.BaseAddr + XRTC_INT_STS_OFFSET) & (XRTC_INT_STS_ALRM_MASK)) == 0U) { Status = 0U; } else { /* Clear the interrupt status register */ XRtcPsu_WriteReg((InstancePtr)->RtcConfig.BaseAddr + XRTC_INT_STS_OFFSET, XRTC_INT_STS_ALRM_MASK); Status = 1U; } return Status; }
/** * * This function is the interrupt handler for the driver. * It must be connected to an interrupt system by the application such that it * can be called when an interrupt occurs. * * @param InstancePtr contains a pointer to the driver instance * * @return None. * * @note None. * ******************************************************************************/ void XRtcPsu_InterruptHandler(XRtcPsu *InstancePtr) { u32 IsrStatus; Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* * Read the interrupt ID register to determine which * interrupt is active. */ IsrStatus = ~(XRtcPsu_ReadReg(InstancePtr->RtcConfig.BaseAddr + XRTC_INT_MSK_OFFSET)); IsrStatus &= XRtcPsu_ReadReg(InstancePtr->RtcConfig.BaseAddr + XRTC_INT_STS_OFFSET); /* * Clear the interrupt status to allow future * interrupts before this generated interrupt is serviced. */ XRtcPsu_WriteReg(InstancePtr->RtcConfig.BaseAddr + XRTC_INT_STS_OFFSET, IsrStatus); /* Handle the generated interrupts appropriately. */ /* Alarm interrupt */ if((IsrStatus & XRTC_INT_STS_ALRM_MASK) != (u32)0) { if(InstancePtr->IsPeriodicAlarm != 0U) { XRtcPsu_SetAlarm(InstancePtr, (XRtcPsu_GetCurrentTime(InstancePtr)+InstancePtr->PeriodicAlarmTime),1U); } /* * Call the application handler to indicate that there is an * alarm interrupt. If the application cares about this alarm, * it will act accordingly through its own handler. */ InstancePtr->Handler(InstancePtr->CallBackRef, XRTCPSU_EVENT_ALARM_GEN); } /* Seconds interrupt */ if((IsrStatus & XRTC_INT_STS_SECS_MASK) != (u32)0) { /* Set the CurrTimeUpdated flag to 1 */ InstancePtr->CurrTimeUpdated = 1; if(InstancePtr->TimeUpdated == (u32)1) { /* Clear the TimeUpdated */ InstancePtr->TimeUpdated = (u32)0; } /* * Call the application handler to indicate that there is an * seconds interrupt. If the application cares about this seconds * interrupt, it will act accordingly through its own handler. */ InstancePtr->Handler(InstancePtr->CallBackRef, XRTCPSU_EVENT_SECS_GEN); } }