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 + -
显示快捷键?