|
|
@@ -39,27 +39,60 @@ static const unsigned short rtc_ydays[2][13] = {
|
|
|
|
|
|
#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400)
|
|
|
|
|
|
-static void RTC_WaitNotBusy(void)
|
|
|
+static int RTC_WaitNotBusy(void)
|
|
|
{
|
|
|
+ int timeout = 1000;
|
|
|
+
|
|
|
TIMER_Udelay(10);
|
|
|
- while (RTC->RTCSTA & RTC_STA_BUSY);
|
|
|
+ while ((RTC->RTCSTA & RTC_STA_BUSY) && timeout--) {
|
|
|
+ TIMER_Udelay(1);
|
|
|
+ }
|
|
|
+ if (timeout < 0) {
|
|
|
+ printf("RTC_WaitNotBusy timeout.\n");
|
|
|
+ RTC->RTCCTL |= 1;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-void RTC_SendCmd(eRTCCmd cmd, int enable)
|
|
|
+int RTC_SendCmd(eRTCCmd cmd, int enable)
|
|
|
{
|
|
|
+ int retries = 10;
|
|
|
+
|
|
|
+retry:
|
|
|
RTC->ANAWEN = 1 << (cmd - RTC_PowerOff);
|
|
|
if (enable)
|
|
|
RTC->ANACTL = 1 << (cmd - RTC_PowerOff);
|
|
|
else
|
|
|
RTC->ANACTL = 0;
|
|
|
- RTC_WaitNotBusy();
|
|
|
+ if ((RTC_WaitNotBusy() < 0) && retries--) {
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
+ if (retries < 0) {
|
|
|
+ printf("RTC_SendCmd %d fail!\n", cmd);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-void RTC_WriteReg(eRTCCmd cmd, vu32 *reg, u32 value)
|
|
|
+int RTC_WriteReg(eRTCCmd cmd, vu32 *reg, u32 value)
|
|
|
{
|
|
|
+ int retries = 10;
|
|
|
+
|
|
|
+retry:
|
|
|
RTC->ANAWEN = 1 << (cmd - RTC_PowerOff);
|
|
|
*(vu32*)reg = value;
|
|
|
- RTC_WaitNotBusy();
|
|
|
+ if ((RTC_WaitNotBusy() < 0) && retries--) {
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
+ if (retries < 0) {
|
|
|
+ printf("RTC_WriteReg %d fail!\n", cmd);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
void RTC_SetWatchdog(eRTCWdtTmo tmo, int enable)
|