读实时钟的代码:
BOOL OEMGetRealTime(SYSTEMTIME *pTime)
{
BOOL rc = FALSE;
S3C2440A_RTC_REG *pRTCReg;
UINT32 data;
UINT16 seconds;
OALMSG(OAL_RTC&&OAL_FUNC, (L"+OEMGetRealTime(pTime = 0x%x)\r\n", pTime));
if (pTime == NULL) goto cleanUp;
// Get uncached virtual address
pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);
do {
data = INPORT32(&pRTCReg->BCDSEC) & 0x7f;
seconds = FROM_BCD(data);
data = INPORT32(&pRTCReg->BCDYEAR);
pTime->wYear = FROM_BCD(data) + RTC_YEAR_DATUM;
data = INPORT32(&pRTCReg->BCDMON) & 0x1f;
pTime->wMonth = FROM_BCD(data);
data = INPORT32(&pRTCReg->BCDDAY) & 0x3f;
pTime->wDay = FROM_BCD(data);
pTime->wDayOfWeek = (WORD)INPORT32(&pRTCReg->BCDDATE) - 1;
data = INPORT32(&pRTCReg->BCDHOUR) & 0x3f;
pTime->wHour = FROM_BCD(data);
data = INPORT32(&pRTCReg->BCDMIN) & 0x7f;
pTime->wMinute = FROM_BCD(data);
data = INPORT32(&pRTCReg->BCDSEC) & 0x7f;
pTime->wSecond = FROM_BCD(data);
pTime->wMilliseconds = 0;
} while (pTime->wSecond != seconds);
// Done
rc = TRUE;
cleanUp:
OALMSG(OAL_FUNC, (L"-OEMGetRealTime(rc = %d)\r\n", rc));
return rc;
}
更新实时钟的代码:
BOOL OEMSetRealTime(LPSYSTEMTIME pTime)
{
BOOL rc = FALSE;
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);
// Done
rc = TRUE;
cleanUp:
OALMSG(OAL_RTC&&OAL_FUNC, (L"-OEMSetRealTime(rc = %d)\r\n", rc));
return rc;
}
设置闹铃时间:
BOOL OEMSetAlarmTime(SYSTEMTIME *pTime)
{
BOOL rc = FALSE;
S3C2440A_RTC_REG *pRTCReg;
UINT32 irq;
OALMSG(OAL_RTC&&OAL_FUNC, (
L"+OEMSetAlarmTime(%d/%d/%d %d:%d:%d.%03d)\r\n",
pTime->wMonth, pTime->wDay, pTime->wYear, pTime->wHour, pTime->wMinute,
pTime->wSecond, pTime->wMilliseconds
));
if (pTime == NULL) goto cleanUp;
// Get uncached virtual address
pRTCReg = OALPAtoVA(S3C2440A_BASE_REG_PA_RTC, FALSE);
// Enable RTC control
SETREG32(&pRTCReg->RTCCON, 1);
OUTPORT32(&pRTCReg->ALMSEC, TO_BCD(pTime->wSecond));
OUTPORT32(&pRTCReg->ALMMIN, TO_BCD(pTime->wMinute));
OUTPORT32(&pRTCReg->ALMHOUR, TO_BCD(pTime->wHour));
OUTPORT32(&pRTCReg->ALMDATE, TO_BCD(pTime->wDay));
OUTPORT32(&pRTCReg->ALMMON, TO_BCD(pTime->wMonth));
OUTPORT32(&pRTCReg->ALMYEAR, TO_BCD(pTime->wYear - RTC_YEAR_DATUM));
// Enable the RTC alarm interrupt
OUTPORT32(&pRTCReg->RTCALM, 0x7F);
// Disable RTC control.
CLRREG32(&pRTCReg->RTCCON, 1);
// Enable/clear RTC interrupt
irq = IRQ_RTC;
OALIntrDoneIrqs(1, &irq);
// Done
rc = TRUE;
cleanUp:
OALMSG(OAL_RTC&&OAL_FUNC, (L"-OEMSetAlarmTime(rc = %d)\r\n", rc));
return rc;
}