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

📄 rtc.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 3 页
字号:
			tmp |= RTC_IRQ_EN_TC;
			DRV_WriteReg(RTC_CII_EN,RTC_CII_EN_SEC);
			break;
		
		case TC_EN_ChkM:
			tmp |= RTC_IRQ_EN_TC;
			DRV_WriteReg(RTC_CII_EN,RTC_CII_EN_MIN);
			break;
			
	   case TC_EN_ChkH:
	      tmp |= RTC_IRQ_EN_TC;
	      DRV_WriteReg(RTC_CII_EN,RTC_CII_EN_HOU);
			break;
		
		case TC_EN_ChkD:
	      tmp |= RTC_IRQ_EN_TC;
	      DRV_WriteReg(RTC_CII_EN,RTC_CII_EN_DOM);
			break;
		
		case TC_EN_ChkW:
	      tmp |= RTC_IRQ_EN_TC;
	      DRV_WriteReg(RTC_CII_EN,RTC_CII_EN_DOW);
			break;
			
		case TC_EN_ChkMon:
	      tmp |= RTC_IRQ_EN_TC;
	      DRV_WriteReg(RTC_CII_EN,RTC_CII_EN_MTH);
			break;
			
		case TC_EN_ChkY:
	      tmp |= RTC_IRQ_EN_TC;
	      DRV_WriteReg(RTC_CII_EN,RTC_CII_EN_YEA);
			break;
    
      case TC_EN_NoChange:
         break;
         
		default:
			break;
	}
	DRV_WriteReg(RTC_IRQ_EN,tmp);
	DRV_WriteReg(RTC_BBPU,(BBPU|RTC_BBPU_KEY));/*0227 TY adds*/
}
/*
* FUNCTION                                                            
*	RTC_InitTC_Time
*
* DESCRIPTION                                                           
*   	Setup the current time
*
* CALLS  
*	This function is called to setup the current time
*
* PARAMETERS
*	rtctime: the current time.
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void RTC_InitTC_Time(t_rtc *rtctime)		//validate
{
   kal_uint32 savedMask=0, loop=0;
   
   if(rtc_timer_id!=0)
   {
   	kal_cancel_timer(rtc_timer_id);
   }	
	
   savedMask = SaveAndSetIRQMask();   
   /*update time*/
   DRV_WriteReg(RTC_TC_SEC,rtctime->rtc_sec);
	DRV_WriteReg(RTC_TC_MIN,rtctime->rtc_min);
	DRV_WriteReg(RTC_TC_HOU,rtctime->rtc_hour);
	DRV_WriteReg(RTC_TC_DOM,rtctime->rtc_day);
	/*DRV_WriteReg(RTC_TC_DOW,rtctime->rtc_wday);*/
	DRV_WriteReg(RTC_TC_MTH,rtctime->rtc_mon);
	DRV_WriteReg(RTC_TC_YEA,rtctime->rtc_year);
	RestoreIRQMask(savedMask);
	
	for(loop=0;loop<1000;loop++){};
	/*reset calibration, start after rtc initialization*/
   if(rtc_timer_id!=0)
   {
   	//kal_set_timer(rtc_timer_id, (kal_timer_func_ptr)rtc_timer, NULL, rtc_cali_tick_value+650,0);
   	rtc_cali_init((void*)rtc_timer_id);
   }	
	
	#ifdef RTC_Test
	RTC_delay();
	#endif
}
/*
* FUNCTION                                                            
*	RTC_Cali_Time
*
* DESCRIPTION                                                           
*   	update the current time
*
* CALLS  
*	This function is to update the current time
*
* PARAMETERS
*	rtctime: the current time.
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void RTC_Cali_Time(t_rtc *rtctime)		//validate
{   
   /*update time*/
   DRV_WriteReg(RTC_TC_SEC,rtctime->rtc_sec);
	DRV_WriteReg(RTC_TC_MIN,rtctime->rtc_min);
	DRV_WriteReg(RTC_TC_HOU,rtctime->rtc_hour);
	DRV_WriteReg(RTC_TC_DOM,rtctime->rtc_day);
	DRV_WriteReg(RTC_TC_MTH,rtctime->rtc_mon);
	DRV_WriteReg(RTC_TC_YEA,rtctime->rtc_year);	
}
/*
* FUNCTION                                                            
*	RTC_Check_Alarm
*
* DESCRIPTION                                                           
*   	check if alarm expires after calibrating time
*
* CALLS  
*	This function is to check if alarm expires after calibrating time
*
* PARAMETERS
*	rtctime: the current time.
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void RTC_Check_Alarm(t_rtc rtctime)		//validate
{   
   kal_uint8 irq=0;
   t_rtc alarm_time, current_time;
   kal_uint32 alarm_sec=0, current_sec=0, new_time=0;

   irq = DRV_Reg(RTC_IRQ_EN);
   /*configure alarm or not*/
   if(irq&RTC_IRQ_EN_AL)
   {
      RTC_GetALTime(&alarm_time);
      RTC_GetTime(&current_time);
      if(alarm_time.rtc_hour==0)
         alarm_sec=(kal_uint32)(24*3600+alarm_time.rtc_min*60+alarm_time.rtc_sec);
      else
         alarm_sec=(kal_uint32)(alarm_time.rtc_hour*3600+alarm_time.rtc_min*60+alarm_time.rtc_sec);
      if(current_time.rtc_hour==0)
         current_sec=(kal_uint32)(24*3600+current_time.rtc_min*60+current_time.rtc_sec);
      else
         current_sec=(kal_uint32)(current_time.rtc_hour*3600+current_time.rtc_min*60+current_time.rtc_sec);   
      /*exceed alarm or not*/         
      if(current_sec<alarm_sec)            
      {
         if(rtctime.rtc_hour==0)
            new_time=(kal_uint32)(24*3600+rtctime.rtc_min*60+rtctime.rtc_sec);
         else
            new_time=(kal_uint32)(rtctime.rtc_hour*3600+rtctime.rtc_min*60+rtctime.rtc_sec);   
         /*change alarm or not*/   
         if(new_time>=alarm_sec)               
         {
             RTC_SetAlarm(&rtctime);
         }   
      }   
   }	   
}
/*
* FUNCTION                                                            
*	RTC_GetTime
*
* DESCRIPTION                                                           
*   	Obtain the current time
*
* CALLS  
*	This function is called to obtain the current time
*
* PARAMETERS
*	rtctime: the current time.
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void RTC_GetTime(t_rtc *rtctime )		//validate
{
   kal_uint32 savedMask;

   savedMask = SaveAndSetIRQMask();   
	rtctime->rtc_sec = DRV_Reg(RTC_TC_SEC);
	rtctime->rtc_min = DRV_Reg(RTC_TC_MIN);
	rtctime->rtc_hour = DRV_Reg(RTC_TC_HOU);
	rtctime->rtc_day = DRV_Reg(RTC_TC_DOM);
	rtctime->rtc_mon = DRV_Reg(RTC_TC_MTH);
	rtctime->rtc_wday = DRV_Reg(RTC_TC_DOW);
	rtctime->rtc_year = DRV_Reg(RTC_TC_YEA);
	RestoreIRQMask(savedMask);
	#ifdef RTC_Test
	RTC_delay();
	#endif
}

/*
* FUNCTION                                                            
*	RTC_SetAlarm
*
* DESCRIPTION                                                           
*   	Setup the alarm time
*
* CALLS  
*	This function is called to setup the alarm time
*
* PARAMETERS
*	rtctime: the expected alarm time.
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void RTC_SetAlarm(t_rtc *rtctime )		//validate 
{
   kal_uint32 savedMask=0;
   savedMask = SaveAndSetIRQMask();
   DRV_WriteReg(RTC_AL_SEC,rtctime->rtc_sec);
	DRV_WriteReg(RTC_AL_MIN,rtctime->rtc_min);
	DRV_WriteReg(RTC_AL_HOU,rtctime->rtc_hour);
	DRV_WriteReg(RTC_AL_DOM,rtctime->rtc_day);
	DRV_WriteReg(RTC_AL_MTH,rtctime->rtc_mon);
	/*DRV_WriteReg(RTC_AL_DOW,rtctime->rtc_wday);*/
	DRV_WriteReg(RTC_AL_YEA,rtctime->rtc_year);
   RestoreIRQMask(savedMask);
	#ifdef RTC_Test
	RTC_delay();
	#endif
}

/*
* FUNCTION                                                            
*	RTC_GetALTime
*
* DESCRIPTION                                                           
*   	Obtain the alarm time
*
* CALLS  
*	This function is called to obtain the alarm time setting
*
* PARAMETERS
*	rtctime: the alarm time.
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void RTC_GetALTime(t_rtc *rtctime )		//validate
{
	rtctime->rtc_sec = DRV_Reg(RTC_AL_SEC);
	rtctime->rtc_min = DRV_Reg(RTC_AL_MIN);
	rtctime->rtc_hour = DRV_Reg(RTC_AL_HOU);
	rtctime->rtc_day = DRV_Reg(RTC_AL_DOM);
	rtctime->rtc_mon = DRV_Reg(RTC_AL_MTH);
	rtctime->rtc_wday = DRV_Reg(RTC_AL_DOW);
	rtctime->rtc_year = DRV_Reg(RTC_AL_YEA);
	#ifdef RTC_Test
	RTC_delay();
	#endif
}
//=================================================================
/*
* FUNCTION                                                            
*	RTC_LISR
*
* DESCRIPTION                                                           
*   	RTC interrupt handler
*
* CALLS  
*	This function is called when RTC intr. is coming
*
* PARAMETERS
*	None
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void RTC_HISR(void)
{
	kal_uint16 status;

#if ( (defined(MT6205)) || (defined(MT6208)) )
   kal_uint16 BBPU;
   kal_uint16 POLAR;
   kal_uint16 PWRSW;
   
   BBPU = DRV_Reg(RTC_BBPU);
   POLAR = BBPU & RTC_BBPU_PWR_POLARITY;
   POLAR >>= 1;
   PWRSW = BBPU & RTC_BBPU_PWR_SW;
   #ifdef MT6205
   PWRSW >>= 2;
   #else /*!MT6205*/
   PWRSW >>= 4;
   #endif   /*MT6205*/

   if (POLAR != PWRSW)
   {
      #ifndef __L1_STANDALONE__
      IRQMask(IRQ_RTC_CODE);
      ASSERT(0);
      return;
      #endif   /*__L1_STANDALONE__*/
   }
#endif   /*(MT6205,MT6208)*/ 
#if 0 /*remove this part because rtc initialization is before latch power*/
#if ( (defined(MT6205B)) ||defined(MT6226M)|| (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219)) ||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227)) )
/* under construction !*/
/* under construction !*/
      #ifndef __L1_STANDALONE__
/* under construction !*/
/* under construction !*/
      #endif   /*__L1_STANDALONE__*/
/* under construction !*/
#endif   /*(MT6205B,MT6218, MT6218B, MT6219,MT6217,MT6228, MT6229 */
#endif 
   
   status = DRV_Reg(RTC_IRQ_STATUS);
	if (status & RTC_IRQ_STATUS_AL_STAT)
	{
		RTC_CALLBAC.rtc_alfunc();	
		#if ( (defined(MT6205B))||defined(MT6226M) || (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219)) ||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227)) )
		// set AUTO_PDN bit of RTC_BBPU again which is cleared by RTC 
		{
		   kal_uint16 reg;
		
		   reg = DRV_Reg(RTC_BBPU);
		   reg |= RTC_BBPU_AUTOPDN; 
		   DRV_WriteReg(RTC_BBPU, reg );
		}		
		#endif		
	}
	if (status & RTC_IRQ_STATUS_TC_STAT)
	{
		RTC_CALLBAC.rtc_tcfunc();
		
	}
	
	IRQClearInt(IRQ_RTC_CODE);
	IRQUnmask(IRQ_RTC_CODE);
}

void RTC_LISR(void)
{
   IRQMask(IRQ_RTC_CODE);
   //kal_activate_hisr(RTCConfig.hisr);
    drv_active_hisr(DRV_RTC_HISR_ID);
}
/*
* FUNCTION                                                            
*	RTC_isFisrtOn
*
* DESCRIPTION                                                           
*   	Check whether RTC is first on
*
* CALLS  
*	This function is called to check whether RTC is first on
*
* PARAMETERS
*	None
*	
* RETURNS
*	KAL_TRUE: RTC is first on
*	KAL_FALSE: RTC is not first on
*
* GLOBALS AFFECTED
*   external_global
*/
kal_bool RTC_isFisrtOn(void)		//validate
{
	kal_uint16 key1 = DRV_Reg(RTC_POWERKEY1);
	kal_uint16 key2 = DRV_Reg(RTC_POWERKEY2);
	
	if ((key1 == RTC_POWERKEY1_KEY)&&(key2 == RTC_POWERKEY2_KEY))
	{
	   /*TY adds this 2004/10/21 to record this is first power on*/
	   //First_PowerOn=KAL_FALSE;
		return KAL_FALSE;
	}
	else
	{
	   /*TY adds this 2004/10/21 to record if this is first power on*/
	   First_PowerOn=KAL_TRUE;
		return KAL_TRUE;
	}
}
/*
* FUNCTION                                                            
*	RTC_is_MS_FirstPowerOn
*
* DESCRIPTION                                                           
*   	Check whether RTC is first power on
*
* CALLS  
*	This function is called by MMI. MMI wants to knows this status
*  whenever he wants but the function "RTC_isFisrtOn" is only valid
*  before calling DRV_POWERON function
*
* PARAMETERS
*	None
*	
* RETURNS
*	KAL_TRUE: RTC is first on
*	KAL_FALSE: RTC is not first on
*
* GLOBALS AFFECTED
*   external_global
*/
/*TY adds this 2004/10/21 to record if this is first power on*/	   
kal_bool RTC_is_MS_FirstPowerOn(void)		//validate
{
	if (First_PowerOn==KAL_FALSE)
	{	   
		return KAL_FALSE;
	}
	else
	{	   
		return KAL_TRUE;
	}
}
/*
* FUNCTION                                                            
*	RTC_setPWRKey
*
* DESCRIPTION                                                           
*   	Setup RTC power key
*
* CALLS  
*	This function is called when RTC is first on
*
* PARAMETERS
*	None
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void RTC_setPWRKey(void)		//validate
{
   DRV_WriteReg(RTC_POWERKEY1,RTC_POWERKEY1_KEY);

⌨️ 快捷键说明

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