📄 rtc.c
字号:
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(¤t_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 + -