解决方案共享:
在函数
BOOL OALIoCtlHalInitRTC(
UINT32 code, VOID *pInpBuffer, UINT32 inpSize, VOID *pOutBuffer,
UINT32 outSize, UINT32 *pOutSize
) {
BOOL rc = FALSE;
SYSTEMTIME *pTime = (SYSTEMTIME*)pInpBuffer;
DWORD retry;
OALMSG(OAL_IOCTL&&OAL_FUNC, (L"+OALIoCtlHalInitRTC(...)\r\n"));
// Validate inputs
if (pInpBuffer == NULL || inpSize < sizeof(SYSTEMTIME)) {
NKSetLastError(ERROR_INVALID_PARAMETER);
OALMSG(OAL_ERROR, (
L"ERROR: OALIoCtlHalInitRTC: Invalid parameter\r\n"
));
goto cleanUp;
}
// Add static mapping for RTC alarm
OALIntrStaticTranslate(SYSINTR_RTC_ALARM, IRQ_RTC);
// Set time xiao add 2010.6.1
retry = 3;
while (TRUE) {
if (OEMGetRealTime(pTime)) break;
if (!retry--) break;
}
if (!retry && !rc) {
RETAILMSG(1, (L"!!!RTC init ERROR!!!\r\n"));
}
rc = OEMSetRealTime(pTime);
//add end
cleanUp:
OALMSG(OAL_IOCTL&&OAL_FUNC, (L"-OALIoCtlHalInitRTC(rc = %d)\r\n", rc));
return rc;
}
更改函数OEMSetRealTime,
BOOL OEMSetRealTime(LPSYSTEMTIME pTime)
{
BOOL rc = FALSE;
#if 0
S3C2440A_RTC_REG *pRTCReg;
OALMSG(OAL_RTC&&OAL_FUNC, (
L"+OEMSetRealTime(%d/%d/%d %d:%d:%d.%03d)\r\n",
pTime->wYear, pTime->wMonth, pTime->wDay, pTime->wHour, pTime->wMinute,
pTime->wSecond, pTime->wMilliseconds
));
if (pTime == NULL) goto cleanUp;
// The RTC will only support a BCD year value of 0 - 99. The year datum is
// 1980, so any dates greater than 2079 will fail unless the datum is
// adjusted.
if (pTime->wYear < RTC_YEAR_DATUM || (pTime->wYear - RTC_YEAR_DATUM) > 99) {
OALMSG(OAL_ERROR, (L"ERROR: OEMSetRealTime: "
L"RTC cannot support a year greater than %d or less than %d "
L"(value %d)\r\n", (RTC_YEAR_DATUM + 99), RTC_YEAR_DATUM,
pTime->wYear
));
goto cleanUp;
}
// Get uncached virtual address
pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);
// Enable RTC control.
SETREG32(&pRTCReg->RTCCON, 1);
OUTPORT32(&pRTCReg->BCDSEC, TO_BCD(pTime->wSecond));
OUTPORT32(&pRTCReg->BCDMIN, TO_BCD(pTime->wMinute));
OUTPORT32(&pRTCReg->BCDHOUR, TO_BCD(pTime->wHour));
OUTPORT32(&pRTCReg->BCDDATE, pTime->wDayOfWeek + 1);
OUTPORT32(&pRTCReg->BCDDAY, TO_BCD(pTime->wDay));
OUTPORT32(&pRTCReg->BCDMON, TO_BCD(pTime->wMonth));
OUTPORT32(&pRTCReg->BCDYEAR, TO_BCD(pTime->wYear - RTC_YEAR_DATUM));
// Disable RTC control.
CLRREG32(&pRTCReg->RTCCON, 1);
#else
S3C2440A_RTC_REG *pRTCReg;
static int firsttime = 0;
// Get uncached virtual address
pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);
// enable RTC control
SETREG32(&pRTCReg->RTCCON, 1);
if ( firsttime == 0 )
{
firsttime = 1;
pTime->wYear = FROM_BCD(pRTCReg->BCDYEAR) + 2000 ;
pTime->wMonth = FROM_BCD(pRTCReg->BCDMON & 0x1f);
pTime->wDay = FROM_BCD(pRTCReg->BCDDAY & 0x3f);
if (
(pTime->wDay > 31) || // 0 - 31
(pTime->wMonth > 12) || // 0 - 12, Jan:1, Feb:2, ...
(pTime->wMonth == 0) ||
(pTime->wYear < 2010) || // We have a 100 year calander (2 BCD digits) with
(pTime->wYear > 2049) // a leap year generator hard-wired to year 2000.
)
{
pTime->wYear = 2010; pTime->wMonth = 6; pTime->wDay = 1;
pRTCReg->BCDSEC = (unsigned char)TO_BCD(pTime->wSecond );
pRTCReg->BCDMIN = (unsigned char)TO_BCD(pTime->wMinute );
pRTCReg->BCDHOUR = (unsigned char)TO_BCD(pTime->wHour );
pRTCReg->BCDDATE = (unsigned char)(pTime->wDayOfWeek + 1);
pTime->wYear = 2010; pTime->wMonth = 6; pTime->wDay = 1;
pRTCReg->BCDDAY = (unsigned char)TO_BCD(pTime->wDay );
pRTCReg->BCDMON = (unsigned char)TO_BCD(pTime->wMonth );
pRTCReg->BCDYEAR = (unsigned char)TO_BCD((pTime->wYear % 100));
}
// disable RTC control
pRTCReg->RTCCON = 0; //&= ~0x1;
}
else
{
pRTCReg->BCDSEC = (unsigned char)TO_BCD(pTime->wSecond );
pRTCReg->BCDMIN = (unsigned char)TO_BCD(pTime->wMinute );
pRTCReg->BCDHOUR = (unsigned char)TO_BCD(pTime->wHour );
pRTCReg->BCDDATE = (unsigned char)(pTime->wDayOfWeek + 1);
pRTCReg->BCDDAY = (unsigned char)TO_BCD(pTime->wDay );
pRTCReg->BCDMON = (unsigned char)TO_BCD(pTime->wMonth );
pRTCReg->BCDYEAR = (unsigned char)TO_BCD((pTime->wYear % 100));
RETAILMSG(1,(TEXT("OEMSetRealTime: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u rcnr=%Xh\n"), pTime->wYear, pTime->wMonth,pTime->wDay, pTime->wHour, pTime->wMinute,pTime->wSecond,pRTCReg->RTCCON));
RETAILMSG(1,(TEXT("OEMSetRealTime(register): Year: %x, Month: %x, Day: %x, Hour: %x, Minute: %x, second: %x rcnr=%Xh\n"), \
pRTCReg->BCDYEAR, pRTCReg->BCDMON,pRTCReg->BCDDAY, pRTCReg->BCDHOUR, pRTCReg->BCDMIN,pRTCReg->BCDSEC,pRTCReg->RTCCON));
// disable RTC control
CLRREG32(&pRTCReg->RTCCON, 1);
// Just certify heart bit
// timer_cnt = 0;
}
#endif
// Done
rc = TRUE;
cleanUp:
OALMSG(OAL_RTC&&OAL_FUNC, (L"-OEMSetRealTime(rc = %d)\r\n", rc));
return rc;
}
更改宏定义:
#define RTC_YEAR_DATUM 2000 //1980
重新Build and Sysgen Current BSP, 烧写内核就可以了