rtc.c
来自「S3C24A0的完整BSP包,对开发此芯片的开发者很有用.」· C语言 代码 · 共 145 行
C
145 行
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
// Module: rtc.c
//
// Real-time clock (RTC) routines for the Samsung S3C24A0 processor
//
#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
#include <oal.h>
#include <s3c24a0.h>
//------------------------------------------------------------------------------
// Defines
#define FROM_BCD(n) ((((n) >> 4) * 10) + ((n) & 0xf))
//#define TO_BCD(n) ((((n) / 10) << 4) | ((n) % 10))
//------------------------------------------------------------------------------
//
// Function: OEMGetRealTime
//
// Reads the current RTC value and returns a system time.
//
BOOL OEMGetRealTime(SYSTEMTIME *pTime)
{
BOOL rc = FALSE;
volatile S3C24A0_RTC_REG *pRTCReg;
RETAILMSG(0,(_T("OEMGetRealTime()\r\n")));
// Get uncached virtual address
pRTCReg = OALPAtoVA(S3C24A0_BASE_REG_PA_RTC, FALSE);
pTime->wMilliseconds = 0;
RETAILMSG(0,(_T(" enter do while()\r\n")));
//pRTCReg->RTCCON = 1;
do
{
pTime->wSecond = FROM_BCD(pRTCReg->BCDSEC & 0x7f);
pTime->wMinute = FROM_BCD(pRTCReg->BCDMIN & 0x7f);
pTime->wHour = FROM_BCD(pRTCReg->BCDHOUR& 0x3f);
pTime->wDayOfWeek = (pRTCReg->BCDDAY - 1);
pTime->wDay = FROM_BCD(pRTCReg->BCDDATE & 0x3f);
pTime->wMonth = FROM_BCD(pRTCReg->BCDMON & 0x1f);
pTime->wYear = FROM_BCD(pRTCReg->BCDYEAR) + 2000 ;
}while(!pTime->wSecond);
RETAILMSG(0,(TEXT("OEMGetRealTime: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u rcnr=%0x\r\n"),
pTime->wYear, pTime->wMonth,pTime->wDay, pTime->wHour, pTime->wMinute,pTime->wSecond, pRTCReg->RTCCON));
RETAILMSG(0,(TEXT("OEMGetRealTime(register): Year: %x, Month: %x, Date: %x, Hour: %x, Minute: %x, second: %x rcnr=%0x\r\n"),
pRTCReg->BCDYEAR, pRTCReg->BCDMON,pRTCReg->BCDDATE, pRTCReg->BCDHOUR, pRTCReg->BCDMIN,pRTCReg->BCDSEC,pRTCReg->RTCCON));
if (pTime != NULL)
rc = TRUE;
// OALMSG(cond, exp)(0, (L"-OEMGetRealTime(rc = %d)\r\n", rc));
return rc;
}
//------------------------------------------------------------------------------
//
// Function: OEMSetRealTime
//
// Updates the RTC with the specified system time.
//
#define TO_BCD(n) ((((DWORD)(n) / 10) << 4) | ((DWORD)(n) % 10))
BOOL OEMSetRealTime(LPSYSTEMTIME pTime)
{
BOOL rc = FALSE;
volatile S3C24A0_RTC_REG *pRTCReg;
volatile S3C24A0_INTR_REG *pINTReg;
#if 1
static int firsttime = 0;
//RETAILMSG(1,(_T("OEMSetRealTime()\r\n")));
if ( firsttime == 0 )
{
//SYSTEMTIME defst = {2004, 10,1, 12, 13, 26, 0, 0};
pTime->wYear = 2004; pTime->wMonth = 10; pTime->wDayOfWeek = 5; pTime->wDay = 1;
pTime->wHour = 13; pTime->wMinute = 26; pTime->wSecond = 0;
firsttime = 1;
}
#endif
// Get uncached virtual address
pRTCReg = OALPAtoVA(S3C24A0_BASE_REG_PA_RTC, FALSE);
// RETAILMSG(1, (TEXT));
pINTReg = OALPAtoVA(S3C24A0_BASE_REG_PA_INTR, FALSE);
pRTCReg->RTCCON = (0x1); /* RTC Control Enable */
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->BCDDAY = (unsigned char)(pTime->wDayOfWeek + 1);
pRTCReg->BCDDATE = (unsigned char)TO_BCD(pTime->wDay );
pRTCReg->BCDMON = (unsigned char)TO_BCD(pTime->wMonth );
pRTCReg->BCDYEAR = (unsigned char)TO_BCD(((DWORD)pTime->wYear % 100));
pRTCReg->RTCCON = (0 << 0); /* RTC Control Disable */
pINTReg->SRCPND = BIT_RTC; /* RTC Alarm Interrupt Clear */
pINTReg->INTPND = BIT_RTC;
pINTReg->INTMSK &= ~BIT_RTC; /* RTC Alarm Enable */
RETAILMSG(0,(TEXT("OEMSetRealTime1: Year: %u, Month: %u, Day: %u, Hour: %u, Minute: %u, second: %u rcnr=%0x\r\n"),
pTime->wYear, pTime->wMonth,pTime->wDay, pTime->wHour, pTime->wMinute,pTime->wSecond, pRTCReg->RTCCON));
RETAILMSG(0,(TEXT("OEMSetRealTime1(register): Year: %x, Month: %x, Day: %x, Hour: %x, Minute: %x, second: %x rcnr=%0x\r\n"), \
pRTCReg->BCDYEAR, pRTCReg->BCDMON, pRTCReg->BCDDAY, pRTCReg->BCDHOUR, pRTCReg->BCDMIN, pRTCReg->BCDSEC, pRTCReg->RTCCON));
//RETAILMSG(1,(_T("OEMSetRealTime() Before Return\r\n")));
//while(1); //for debug purposes
rc = TRUE;
// OALMSG(OAL_RTC&&OAL_FUNC, (L"-OEMSetRealTime(rc = %d)\r\n", rc));
return rc;
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?