⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc.c

📁 最近在國外網站抓到的作業系統 以Arm為基礎去開發的
💻 C
字号:
/*************************************************************************
 *  Copyright (C) Asic Center. 2002
 *  All Rights Reserved
 *
 *  Filename : rtc.c
 *  Function : realtime clock
 *  Revision :
 *          2002/06/18     Pessia     Create this file, and add Power-Saving code;
************************************************************************/
#include "M68328.h"
#include "ros33.h"
#include "pwrctrl.h"
#include "systmr.h"
#include "hardware.h"
#include "hardware_reg.h"

extern void ret_int( void );
extern void sys_clk( void );

void run_rtc( void );
void stop_rtc( void );

/* Used to record how many ticks have passed,
  * it should be clear when system init  	*/
unsigned long	passedticks=0;
/* Record current clock */
unsigned long	currentclock=0;		

unsigned short cur_rtc_freq=0;


void init_rtc( void )
{
	/* RTC is enabled at reset by default,
	 * We choose SAM3(32Hz) to be used.
	 */
////	RTCCTL |= RTCCTL_ENABLE;
////	RTCISR = 0x0000;
////	RTCIENR &= 0x00C0;/* clear all bits except bit 6&7 */

	read_reg(RTC_CTRL) &= RTC_CTRL_RTCEN;			/*rtc enable*/
//	*(RP)RTC_IEN=(RTC_IEN_SECON);
	*(RP)RTC_IEN=(RTC_IEN_SAMON);

	cur_rtc_freq = 0;
}

void set_rtc( unsigned short freq )
{
	extern UINT MSPTICK;
	unsigned int freqvalue;
	
	/* close old interrupt */
	stop_rtc();
	
	cur_rtc_freq = freq;
	
	/* make sure to change timertask 's tick at the same time*/
	switch(freq)
	{
		case RTCIENR_256HZ:
			freqvalue = 0x80;break;
		case RTCISR_SAM3:
			freqvalue = 0x400;break;
		case RTCISR_1HZ:
		default:
			freqvalue = 0x8000;break;
	}
////	MSPTICK = 1000/freqvalue;
	write_reg(RTC_SAMP,  freqvalue<<16);

	/* enable new interrupt */
////	RTCIENR |= freq;
////	run_rtc();
}

void run_rtc( void )
{
	unmask_irq(INT_RTC);
	read_reg(RTC_CTRL) &= RTC_CTRL_RTCEN;			/*rtc enable*/
}

void stop_rtc( void )
{
	/* disable interrupt */
////	IMR |= (IMR_MRTC|IMR_MTMR1);
////	RTCIENR &= ~cur_rtc_freq;

	mask_irq(INT_RTC);
	read_reg(RTC_CTRL) = 0;			/*rtc disable*/
}

void rtc_isr( void )
{
	/* clear rtc interrupts */
////	RTCISR |= cur_rtc_freq;
	read_reg(RTC_ISTAT) |= 0X01;
	
#if 0
	/* power saving code */
	if( power_saving_flag )
	{
		switch( cur_pcs )
		{
			case PCS_IDLE:
			case PCS_DOZE:
				power_saving_counter++;
				break;
				
			case PCS_SLEEP:
				/******************************/
				/* here, we can add some special code to 
				 * check whether time-out timer exist or not.
				 * such operation can greatly reduce power-wasting. */
				 
				/******************************/
				/* take places of GPT  */
				sys_clk();
				break;
		}
	}
#endif
	
	//02-6-19 15:39 Pessia:
	//for debug, do not change timer_task at first!!!
	passedticks++;
	currentclock++;
	set_flg(TIMER_EVENT, TIMER_FLG);
}


void ENT_INT_RTC( void )
{
	ent_int();

	mask_irq(INT_GPT);
	//ENABLE_INT;
	
	rtc_isr();
	
	//DISABLE_INT;
	unmask_irq(INT_GPT);

	ret_int();
}

/*******************************************************************************
* read_rtc
*   Type : unsigned char
*   Ret val : rtc value
*   Argument : unsigned long reg register address want to read
*   Function : Read rtc value of minute, hour ,or day.
*******************************************************************************/
unsigned char read_rtc(unsigned long reg)
{
	unsigned char chrData = 0;
//	chrData = *(volatile unsigned char *)reg;
	return(chrData);
}

/*******************************************************************************
* Read_Second
*   Type : unsigned char
*   Ret val : none
*   Argument : time structure reference
*   Function : Read system time.
*******************************************************************************/
void ReadGlobalTime( ASIX_TIME *time )
{
	time->hour = *(RP)RTC_HMS >> 24;
	time->minute = (*(RP)RTC_HMS >> 16) & 0x3F;
	time->second = *(RP)RTC_HMS & 0x3F;
	return;
}

void ReadGlobalDate( ASIX_DATE *date )
{
	DWORD		days;
	ASIX_DATE	std_date;
	
  	days = (*(RP)RTC_YMD & 0x3F);
	std_date.year = StdYear;
	std_date.month = 1;
	std_date.day = 1;
	SysDateElapse( date, &std_date, days );

  	if( date->year > StdYear )
  	{
  		// 更新年份
  		std_date.year = date->year;
  		StdYear = date->year;
		days = SysGetElapsedDays( &days, &std_date, date );
	  	*(WORD *)M328_RTCDAY = (WORD)days;
  	}
	
	return;
}

void SetGlobalTime( ASIX_TIME *time )
{
   if((time->hour>23)||(time->hour<0))
     return;
   *(RP)RTC_HMS = ((unsigned int)time->hour)<<23;
   
   if((time->minute>59)||(time->minute<0))
   return;
   *(RP)RTC_HMS |= ((unsigned int)time->minute)<<16;
   
   if((time->second>59)||(time->second<0))
   return;
   *(RP)RTC_HMS |= (unsigned short)time->second;

	return;
}

void SetGlobalDate( ASIX_DATE *date )
{
	DWORD		days = 0;
	ASIX_DATE	std_date;
	
	std_date.year = date->year;
	std_date.month = 1;
	std_date.day = 1;
	SysGetElapsedDays( &days, &std_date, date );

  	// 更新年份
	StdYear = date->year;
  	
	*(RP)RTC_YMD &= ~0X3F;
	*(RP)RTC_YMD |= (WORD)days;
	
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -