int32_t DrvRTC_Open (S_DRVRTC_TIME_DATA_T *sPt) { uint32_t u32Reg; volatile int32_t i32delay=1000; RTC_TLR_T tlr = {0}; RTC_CLR_T clr = {0}; /*-----------------------------------------------------------------------------------------------------*/ /* DO BASIC JUDGEMENT TO Check RTC time data value is reasonable or not. */ /*-----------------------------------------------------------------------------------------------------*/ if ( ((sPt->u32Year - DRVRTC_YEAR2000) > 99)| ((sPt->u32cMonth == 0) || (sPt->u32cMonth > 12))| ((sPt->u32cDay == 0) || (sPt->u32cDay > 31))) { return E_DRVRTC_ERR_CALENDAR_VALUE; } if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12) { if ( (sPt->u32cHour == 0) || (sPt->u32cHour > 12) ) { return E_DRVRTC_ERR_TIMESACLE_VALUE ; } } else if (sPt->u8cClockDisplay == DRVRTC_CLOCK_24) { if (sPt->u32cHour > 23) { return E_DRVRTC_ERR_TIMESACLE_VALUE ; } } else { return E_DRVRTC_ERR_TIMESACLE_VALUE ; } if ((sPt->u32cMinute > 59) | (sPt->u32cSecond > 59) | (sPt->u32cSecond > 59)) { return E_DRVRTC_ERR_TIME_VALUE ; } if (sPt->u32cDayOfWeek > 6) { return E_DRVRTC_ERR_DWR_VALUE ; } /*-----------------------------------------------------------------------------------------------------*/ /* Important, call RTC_WriteEnable() before write data into any register. */ /* User should be write data as soon as possible.Access enable wiil clear after 200ms */ /*-----------------------------------------------------------------------------------------------------*/ g_u32Reg = DrvRTC_WriteEnable(); if (g_u32Reg != 0) { return E_DRVRTC_ERR_FAILED; } /*-----------------------------------------------------------------------------------------------------*/ /* Second, set RTC 24/12 hour setting */ /*-----------------------------------------------------------------------------------------------------*/ if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12) { DrvRTC_WriteEnable(); RTC->TSSR.HR24 = DRVRTC_CLOCK_12; /*-------------------------------------------------------------------------------------------------*/ /* important, range of 12-hour PM mode is 21 upto 32 */ /*-------------------------------------------------------------------------------------------------*/ if (sPt->u8cAmPm == DRVRTC_PM) sPt->u32cHour += 20; } else /* RTC_CLOCK_24 */ { DrvRTC_WriteEnable(); RTC->TSSR.HR24 = DRVRTC_CLOCK_24; RTCDEBUG ("RTC: 24-hour\n"); } /*-----------------------------------------------------------------------------------------------------*/ /* Set RTC Calender Loading */ /*-----------------------------------------------------------------------------------------------------*/ u32Reg = ((sPt->u32Year - DRVRTC_YEAR2000) / 10) << 20; u32Reg |= (((sPt->u32Year - DRVRTC_YEAR2000) % 10) << 16); u32Reg |= ((sPt->u32cMonth / 10) << 12); u32Reg |= ((sPt->u32cMonth % 10) << 8); u32Reg |= ((sPt->u32cDay / 10) << 4); u32Reg |= (sPt->u32cDay % 10); g_u32Reg = u32Reg; DrvRTC_WriteEnable(); RTC->TSSR.HR24 = DRVRTC_CLOCK_24; outpw(&RTC->CLR, (uint32_t)g_u32Reg); /*-----------------------------------------------------------------------------------------------------*/ /* Set RTC Time Loading */ /*-----------------------------------------------------------------------------------------------------*/ u32Reg = ((sPt->u32cHour / 10) << 20); u32Reg |= ((sPt->u32cHour % 10) << 16); u32Reg |= ((sPt->u32cMinute / 10) << 12); u32Reg |= ((sPt->u32cMinute % 10) << 8); u32Reg |= ((sPt->u32cSecond / 10) << 4); u32Reg |= (sPt->u32cSecond % 10); g_u32Reg = u32Reg; DrvRTC_WriteEnable(); outpw(&RTC->TLR, (uint32_t)g_u32Reg); outpw(&RTC->DWR, sPt->u32cDayOfWeek); RTC->TTR.TWKE = sPt->u8IsEnableWakeUp; /* Waiting for RTC settings stable */ while(i32delay--); return E_SUCCESS; }
/* Update current date/time or alarm date/time from RTC */ //*--------------------------------------------------------------------------------------------------------*/ int32_t DrvRTC_Write(E_DRVRTC_TIME_SELECT eTime, S_DRVRTC_TIME_DATA_T *sPt) { uint32_t u32Reg; /*-----------------------------------------------------------------------------------------------------*/ /* Check RTC time data value is reasonable or not. */ /*-----------------------------------------------------------------------------------------------------*/ if ( ((sPt->u32Year - DRVRTC_YEAR2000) > 99)| ((sPt->u32cMonth == 0) || (sPt->u32cMonth > 12))| ((sPt->u32cDay == 0) || (sPt->u32cDay > 31))) { RTCDEBUG ("\nRTC: Year value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } if ((sPt->u32Year - DRVRTC_YEAR2000) > 99) { RTCDEBUG ("\nRTC: Year value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } if ((sPt->u32cMonth == 0) || (sPt->u32cMonth > 12)) { RTCDEBUG ("\nRTC: Month value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } if ((sPt->u32cDay == 0) || (sPt->u32cDay > 31)) { RTCDEBUG ("\nRTC: Day value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12) { if ((sPt->u32cHour == 0) || (sPt->u32cHour > 12)) { RTCDEBUG ("\nRTC: Hour value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } } else if (sPt->u8cClockDisplay == DRVRTC_CLOCK_24) { if (sPt->u32cHour > 23) { RTCDEBUG ("\nRTC: Hour value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } } else { RTCDEBUG ("\nRTC: Clock mode is incorrect\n"); return E_DRVRTC_ERR_FAILED; } if (sPt->u32cMinute > 59) { RTCDEBUG ("\nRTC: Minute value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } if (sPt->u32cSecond > 59) { RTCDEBUG ("\nRTC: Second value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } if (sPt->u32cDayOfWeek > 6) { RTCDEBUG ("\nRTC: Day of week value is incorrect\n"); return E_DRVRTC_ERR_FAILED; } /*-----------------------------------------------------------------------------------------------------*/ /* Important, call RTC_Open() before write data into any register. */ /*-----------------------------------------------------------------------------------------------------*/ g_u32Reg = DrvRTC_WriteEnable(); if (g_u32Reg != 0) { return E_DRVRTC_ERR_FAILED; } switch (eTime) { case DRVRTC_CURRENT_TIME: /*---------------------------------------------------------------------------------------------*/ /* Second, set RTC time data. */ /*---------------------------------------------------------------------------------------------*/ if (sPt->u8cClockDisplay == DRVRTC_CLOCK_12) { g_chHourMode = DRVRTC_CLOCK_12; RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_12; RTCDEBUG ("RTC: 12-hour\n"); /*-----------------------------------------------------------------------------------------*/ /* important, range of 12-hour PM mode is 21 upto 32 */ /*-----------------------------------------------------------------------------------------*/ if (sPt->u8cAmPm == DRVRTC_PM) sPt->u32cHour += 20; } else { /* RTC_CLOCK_24 */ g_chHourMode = DRVRTC_CLOCK_24; RTC->TSSR.HR24_HR12 = DRVRTC_CLOCK_24; RTCDEBUG ("RTC: 24-hour\n"); } RTC->DWR.DWR = sPt->u32cDayOfWeek; /*---------------------------------------------------------------------------------------------*/ /* Second, set RTC time data. */ /*---------------------------------------------------------------------------------------------*/ u32Reg = ((sPt->u32Year - DRVRTC_YEAR2000) / 10) << 20; u32Reg |= (((sPt->u32Year - DRVRTC_YEAR2000) % 10) << 16); u32Reg |= ((sPt->u32cMonth / 10) << 12); u32Reg |= ((sPt->u32cMonth % 10) << 8); u32Reg |= ((sPt->u32cDay / 10) << 4); u32Reg |= (sPt->u32cDay % 10); g_u32Reg = u32Reg; DrvRTC_WriteEnable(); outpw(&RTC->CLR, (uint32_t)g_u32Reg); RTCDEBUG ("RTC: REG_RTC_CLR[0x%08x]\n", inpw(&RTC->CLR)); u32Reg = ((sPt->u32cHour / 10) << 20); u32Reg |= ((sPt->u32cHour % 10) << 16); u32Reg |= ((sPt->u32cMinute / 10) << 12); u32Reg |= ((sPt->u32cMinute % 10) << 8); u32Reg |= ((sPt->u32cSecond / 10) << 4); u32Reg |= (sPt->u32cSecond % 10); g_u32Reg = u32Reg; DrvRTC_WriteEnable(); outpw(&RTC->TLR, (uint32_t)g_u32Reg); RTCDEBUG ("RTC: REG_RTC_TLR[0x%08x]\n", inpw(&RTC->TLR)); return E_SUCCESS; case DRVRTC_ALARM_TIME: g_pfnRTCCallBack_Alarm = NULL; /* Initial call back function.*/ /*---------------------------------------------------------------------------------------------*/ /* Set Calender alarm time data. */ /*---------------------------------------------------------------------------------------------*/ u32Reg = ((sPt->u32Year - DRVRTC_YEAR2000) / 10) << 20; u32Reg |= (((sPt->u32Year - DRVRTC_YEAR2000) % 10) << 16); u32Reg |= ((sPt->u32cMonth / 10) << 12); u32Reg |= ((sPt->u32cMonth % 10) << 8); u32Reg |= ((sPt->u32cDay / 10) << 4); u32Reg |= (sPt->u32cDay % 10); g_u32Reg = u32Reg; DrvRTC_WriteEnable(); outpw(&RTC->CAR, (uint32_t)g_u32Reg); RTCDEBUG ("RTC: REG_RTC_CAR[0x%08x]\n", inpw(&RTC->CAR)); if (g_chHourMode == DRVRTC_CLOCK_12) { if (sPt->u8cAmPm == DRVRTC_PM) /* important, range of 12-hour PM mode is 21 upto 32 */ sPt->u32cHour += 20; } /*---------------------------------------------------------------------------------------------*/ /* Set Time alarm time data. */ /*---------------------------------------------------------------------------------------------*/ u32Reg = ((sPt->u32cHour / 10) << 20); u32Reg |= ((sPt->u32cHour % 10) << 16); u32Reg |= ((sPt->u32cMinute / 10) << 12); u32Reg |= ((sPt->u32cMinute % 10) << 8); u32Reg |= ((sPt->u32cSecond / 10) << 4); u32Reg |= (sPt->u32cSecond % 10); g_u32Reg = u32Reg; DrvRTC_WriteEnable(); outpw(&RTC->TAR, (uint32_t)g_u32Reg); RTCDEBUG ("RTC: REG_RTC_TAR[0x%08x]\n", inpw(&RTC->TAR)); /*---------------------------------------------------------------------------------------------*/ /* Finally, enable alarm interrupt. */ /*---------------------------------------------------------------------------------------------*/ DrvRTC_EnableInt(DRVRTC_ALARM_INT,NULL); RTC->TTR.TWKE = sPt->u8IsEnableWakeUp; return E_SUCCESS; default: { return E_DRVRTC_ERR_ENOTTY; } } }