原来做过RTC功能实现,今天看了另外一段代码,方法差不多,这里也贴出来,大家参考一下。
oemioctl.c这个文件还是不需要修改。只修改timer.c就可以了。
BOOL
OEMSetRealTime(LPSYSTEMTIME lpst)
{
#if 0
volatile RTCreg *s2410RTC = (RTCreg *)RTC_BASE;
// Enable RTC control.
//
s2410RTC->rRTCCON |= 1;
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->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));
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));
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;
//
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;
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));
{
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));
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
}
s2410RTC->rRTCCON = 0; //&= ~0x1;
// Just certify heart bit
// timer_cnt = 0;
}
return TRUE;
#endif
}
转载于:https://blog.51cto.com/buaadallas/80933