原来做过RTC功能实现,今天看了另外一段代码,方法差不多,这里也贴出来,大家参考一下。
oemioctl.c这个文件还是不需要修改。只修改timer.c就可以了。
BOOL
OEMSetRealTime(LPSYSTEMTIME lpst)
{
#if 0
 volatile RTCreg *s2410RTC = (RTCreg *)RTC_BASE;
 
 // Enable RTC control.
 //
 s2410RTC->rRTCCON |= 1;
 s2410RTC->rBCDSEC  = (unsigned char)TO_BCD(lpst->wSecond );
 s2410RTC->rBCDMIN  = (unsigned char)TO_BCD(lpst->wMinute );
 s2410RTC->rBCDHOUR = (unsigned char)TO_BCD(lpst->wHour   );
 s2410RTC->rBCDDATE = (unsigned char)(lpst->wDayOfWeek + 1);
 s2410RTC->rBCDDAY  = (unsigned char)TO_BCD(lpst->wDay    );
 s2410RTC->rBCDMON  = (unsigned char)TO_BCD(lpst->wMonth  );
 s2410RTC->rBCDYEAR = (unsigned char)TO_BCD((lpst->wYear % 100));
 RETAILMSG(1,(TEXT("OEMSetRealTime: Year: %x, Month: %x, Day: %x, Hour: %x, Minute: %x, second: %x rcnr=%Xh\n"), \
     s2410RTC->rBCDYEAR, s2410RTC->rBCDMON,s2410RTC->rBCDDAY, s2410RTC->rBCDHOUR, s2410RTC->rBCDMIN,s2410RTC->rBCDSEC,s2410RTC->rRTCCON));
 // Disable RTC control.
 //
 s2410RTC->rRTCCON &= ~1;
 
 return(TRUE);
#else
 volatile RTCreg *s2410RTC = (RTCreg *)RTC_BASE;
  static int firsttime = 0;
  static int firstsettime = 0;
 // enable RTC control
 s2410RTC->rRTCCON =  0x1;
 
 if ( firsttime == 0 )
 {
  firsttime = 1;
  lpst->wYear  = FROM_BCD(s2410RTC->rBCDYEAR) + 2000 ;
  lpst->wMonth  = FROM_BCD(s2410RTC->rBCDMON   & 0x1f);
  lpst->wDay  = FROM_BCD(s2410RTC->rBCDDAY   & 0x3f);
 
  if (
       (lpst->wDay > 31)  || // 0 - 31
       (lpst->wMonth > 12) || // 0 - 12, Jan:1, Feb:2, ...
       (lpst->wMonth == 0) ||
       (lpst->wYear < 2000) || // We have a 100 year calander (2 BCD digits) with
       (lpst->wYear > 2099)  // a leap year generator hard-wired to year 2000.
     )  
   {
    s2410RTC->rBCDSEC  = (unsigned char)TO_BCD(lpst->wSecond );
    s2410RTC->rBCDMIN  = (unsigned char)TO_BCD(lpst->wMinute );
    s2410RTC->rBCDHOUR = (unsigned char)TO_BCD(lpst->wHour   );
    s2410RTC->rBCDDATE = (unsigned char)(lpst->wDayOfWeek + 1);
   
    lpst->wYear = 2006; lpst->wMonth = 1; lpst->wDay = 1;
    s2410RTC->rBCDDAY  = (unsigned char)TO_BCD(lpst->wDay    );
    s2410RTC->rBCDMON  = (unsigned char)TO_BCD(lpst->wMonth  );
    s2410RTC->rBCDYEAR = (unsigned char)TO_BCD((lpst->wYear % 100));
   }
  // disable RTC control
  s2410RTC->rRTCCON = 0; //&= ~0x1;
 }
 else
 {
 
 s2410RTC->rBCDSEC  = (unsigned char)TO_BCD(lpst->wSecond );
 s2410RTC->rBCDMIN  = (unsigned char)TO_BCD(lpst->wMinute );
 s2410RTC->rBCDHOUR = (unsigned char)TO_BCD(lpst->wHour   );
 s2410RTC->rBCDDATE = (unsigned char)(lpst->wDayOfWeek + 1);
 
 s2410RTC->rBCDDAY  = (unsigned char)TO_BCD(lpst->wDay    );
 s2410RTC->rBCDMON  = (unsigned char)TO_BCD(lpst->wMonth  );
 s2410RTC->rBCDYEAR = (unsigned char)TO_BCD((lpst->wYear % 100));
 RETAILMSG(1,(TEXT("OEMSetRealTime: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u rcnr=%Xh\n"), lpst->wYear, lpst->wMonth,lpst->wDay, lpst->wHour, lpst->wMinute,lpst->wSecond,s2410RTC->rRTCCON));
 RETAILMSG(1,(TEXT("OEMSetRealTime(register): Year: %x, Month: %x, Day: %x, Hour: %x, Minute: %x, second: %x rcnr=%Xh\n"), \
    s2410RTC->rBCDYEAR, s2410RTC->rBCDMON,s2410RTC->rBCDDAY, s2410RTC->rBCDHOUR, s2410RTC->rBCDMIN,s2410RTC->rBCDSEC,s2410RTC->rRTCCON));
 // disable RTC control
 s2410RTC->rRTCCON = 0; //&= ~0x1;
 
 // Just certify heart bit
// timer_cnt = 0;
 }
 return TRUE;
#endif 
}