📄 pwic.c
字号:
if ((result < 950) && (result > 650))
break;
}
DRV_Reg(DRVPDN_CON2) |= DRVPDN_CON2_TDMA;
}
#endif /*(MT6205,MT6205B)*/
/*
* FUNCTION
* bmt_is_wdt_power
*
* DESCRIPTION
* This function is to check if phone is power on because WDT.
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
*
*
* GLOBALS AFFECTED
* None
*/
kal_bool is_wdt_power=KAL_FALSE;
kal_bool bmt_is_wdt_power(void)
{
return is_wdt_power;
}
/*
* FUNCTION
* bmt_is_chr_exist
*
* DESCRIPTION
* This function is to check if AC/USB exists at CHRPWRON/USBPWRON
*
* CALLS
*
* PARAMETERS
* power_on: power on type
*
* RETURNS
*
*
* GLOBALS AFFECTED
* None
*/
kal_bool bmt_is_chr_exist(kal_uint8 power_on)
{
#if defined(MT6305)
kal_uint8 eint=0;
kal_uint32 delay=0;
kal_uint16 status=0;
#if defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__)
eint = chr_usb_detect.chr_usb_eint;
#else
if(power_on==CHRPWRON||power_on==PRECHRPWRON)
eint=gCHRDET_EINT_NO;
#if defined(__USB_ENABLE__)
else if(power_on==USBPWRON||power_on==USBPWRON_WDT)
eint=gUSB_EINT_NO;
#endif
#endif
IRQMask(IRQ_EIT_CODE);
*EINT_MASK &= (kal_uint16)(~EINT_MASK_EINT(eint));
EINTaddr(eint) = EINT_CON_HIGHLEVEL;
*EINT_INTACK = EINT_INTACK_EINT(eint);
for(delay=0;delay<500;delay++);
status = *EINT_STATUS;
EINT_Mask(eint);
*EINT_INTACK = EINT_INTACK_EINT(eint);
IRQClearInt(IRQ_EIT_CODE);
IRQUnmask(IRQ_EIT_CODE);
if (status & EINT_STATUS_EINT(eint))
return KAL_TRUE;
else
return KAL_FALSE;
#elif defined(MT6318)/*XXXXX*/
#if defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__)
kal_bool status=KAL_FALSE;
#if !defined(__USB_ENABLE__)
if(power_on==CHRPWRON||power_on==PRECHRPWRON)
#else
if(power_on==CHRPWRON||power_on==PRECHRPWRON||
power_on==USBPWRON||power_on==USBPWRON_WDT)
#endif
status=pmic_is_chr_det(AC_CHR);
return status;
#else
eint = chr_usb_detect.chr_usb_eint;
kal_bool status=KAL_FALSE;
kal_bool status=KAL_FALSE;
//eint = chr_usb_detect.chr_usb_eint;
if(power_on==CHRPWRON||power_on==PRECHRPWRON)
status=pmic_is_chr_det(AC_CHR);
#if defined(__USB_ENABLE__)
else if(power_on==USBPWRON||power_on==USBPWRON_WDT)
status=pmic_is_chr_det(USB_CHR);
#endif
return status;
#endif/*one EINT*/
#endif/*6318*/
}
/*
* FUNCTION
* DRV_POWEROFF
*
* DESCRIPTION
* This function is to power off the targer.
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* None
*/
void DRV_POWEROFF(void) /*PW_KEYPRESS*/
{
#if ( (defined(MT6205)) || (defined(MT6208)) || (defined(FPGA)) )
//#ifdef PMIC_PRESENT
#if ( (defined(MT6318))|| (defined(MT6305)) )
kal_uint16 BBPU;
#endif /*PMIC_PRESENT*/
#endif /*MT6205,MT6208,FPGA*/
#if ( (defined(MT6205B)) || (defined(MT6218))|| (defined(MT6218B))|| (defined(MT6219)) ||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
//#ifdef PMIC_PRESENT
#if ( (defined(MT6318))|| (defined(MT6305)) )
kal_uint16 REG_COMM2;
kal_uint16 BBPU;
#endif
#endif /*MT6205B,MT6218*/
kal_uint16 index;
Drv_Deinit();
#ifdef ORDNANCE
*IRQ_MASK = (kal_uint16)(~(1 << IRQ_KPAD_CODE));
#endif /*ORDNANCE*/
#ifndef L1_NOT_PRESENT
L1T_Exit();
#endif /* !L1_NOT_PRESENT */
/* for BBPU can't be modify twice in a very short period*/
#if ( (defined(MT6205)) || (defined(MT6208)) || (defined(FPGA)) )
if (BMT.EINT2STATE == DETECTCHROUT)
return;
#endif
for(index=0;index<1000;index++);
#ifdef BMT_DEBUG
{
kal_uint32 count=0;
dbg_printWithTime("DRV_POWEROFF..\r\n");
while(count++ < 1000000);
}
#endif /*BMT_DEBUG*/
IRQMask(IRQ_RTC_CODE);
//#ifdef PMIC_PRESENT
#if ( (defined(MT6318))|| (defined(MT6305)) )
#if ( (defined(MT6205)) || (defined(MT6208)) || (defined(FPGA)) )
BBPU = DRV_Reg(RTC_BBPU);
BBPU |= (RTC_BBPU_KEY | RTC_BBPU_PWR_POLARITY | RTC_BBPU_PDN_XOSC32K);
BBPU &= ~RTC_BBPU_PWR_SW; //RTC_setPWRSW(KAL_TRUE);
DRV_WriteReg(RTC_BBPU,BBPU);
#endif /*MT6205,MT6208,FPGA*/
#if ( (defined(MT6205B)) || (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
REG_COMM2 = DRV_Reg(DRV_COMM_REG2);
REG_COMM2 |= DRV_COMM_REG2_NORMAL_RESET;
REG_COMM2 &= ~(DRV_COMM_REG2_RTCPWRON);/*TY add 0218*/
DRV_WriteReg(DRV_COMM_REG2,REG_COMM2);
BBPU = DRV_Reg(RTC_BBPU);/*0227 TY modifies*/
#if ( (defined(MT6205B))|| (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
BBPU |= (RTC_BBPU_AUTOPDN|RTC_BBPU_KEY);
BBPU &= ~RTC_BBPU_WRITE_EN;/*close RTC interface*/
#else
BBPU |= (RTC_BBPU_PWR_POLARITY|RTC_BBPU_AUTOPDN|RTC_BBPU_KEY);
#endif
BBPU &= ~RTC_BBPU_PWR_SW;
DRV_WriteReg(RTC_BBPU,BBPU);
#endif /*MT6205,MT6208,FPGA*/
#endif /*PMIC_PRESENT*/
}
/*
* FUNCTION
* DRV_POWERON
*
* DESCRIPTION
* This function is to power on the targer.
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
* KAL_TRUE: MS is first power on of RTC has been reset
* KAL_FALSE: otherwise.
*
* GLOBALS AFFECTED
* None
*/
kal_bool DRV_POWERON(void) /*PW_KEYPRESS*/
{
kal_uint32 BBPU;
kal_uint16 status;
t_rtc time;
kal_bool isFirstOn = KAL_FALSE;
//#ifdef BMT_DEBUG
kal_uint32 count = 0;
//#endif
#ifdef BMT_DEBUG
dbg_printWithTime("DRV_POWERON..\r\n");
#endif /*BMT_DEBUG*/
//Power ON
if (RTC_isFisrtOn()||(KAL_FALSE==RTC_is_config_valid()))
{
isFirstOn = KAL_TRUE;
time.rtc_sec=0;
time.rtc_min=0;
time.rtc_hour=0;
time.rtc_day=DEFAULT_HARDWARE_DAY;
time.rtc_wday=1;
time.rtc_mon=DEFAULT_HARDWARE_MON;
time.rtc_year = DEFAULT_HARDWARE_YEAR;
RTC_InitTC_Time(&time);
#if defined(MT6228)|| defined(MT6229) || defined(MT6230)|| defined(MT6227)|| defined(MT6226)||defined(MT6226M)
while(1)
{
if((DRV_Reg(RTC_TC_YEA)&RTC_TIME_BUSY)==0)
break;
}
#endif
status = DRV_Reg(RTC_IRQ_STATUS);
DRV_WriteReg(RTC_TC_DOW,1);
DRV_WriteReg(RTC_IRQ_EN,RTC_IRQ_EN_ALLOFF);
/*clear alarm mask*/
DRV_WriteReg(RTC_AL_MASK,0);
/*clearn BBPU alarm power on bit*/
BBPU = DRV_Reg(RTC_BBPU);
BBPU&=0xfe;
BBPU|=RTC_BBPU_KEY;
DRV_WriteReg(RTC_BBPU,BBPU);
RTC_setPWRKey();
#if defined(MT6228)|| defined(MT6229) || defined(MT6230)
while(1)
{
if((DRV_Reg(RTC_W_FLAG)&RTC_POWERKEY_BUSY)==0)
break;
}
#endif
#ifdef _SIMULATION
/*
* When running co-sim,
* the RTC registers are not stable soon after we set their value.
* Thus we have to delay for a while before first access.
*/
for (BBPU = 0; BBPU < 2000; BBPU++) {
}
#endif /* _SIMULATION */
//#if ( (defined(MT6218B)) || (defined(MT6219))||(defined(MT6217)) )
#if ( (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
/*HW bug fix: to cover 128ms de_bounce time*/
for(BBPU=0;BBPU<10000000;BBPU++)
{
t_rtc current_time;
kal_uint32 delay=0;
RTC_GetTime(¤t_time);
if((time.rtc_hour==current_time.rtc_hour)&&
(time.rtc_day==current_time.rtc_day)&&(time.rtc_wday==current_time.rtc_wday)&&(time.rtc_mon==current_time.rtc_mon)
&&(DRV_Reg(RTC_IRQ_EN)==RTC_IRQ_EN_ALLOFF)&&
(DRV_Reg(RTC_POWERKEY1)==RTC_POWERKEY1_KEY)&&(DRV_Reg(RTC_POWERKEY2)==RTC_POWERKEY2_KEY)&&
(DRV_Reg(RTC_AL_MASK)==0)&&((DRV_Reg(RTC_BBPU)&0x1)==0) )
break;
RTC_InitTC_Time(&time);
DRV_WriteReg(RTC_AL_MASK,0);
DRV_WriteReg(RTC_IRQ_EN,RTC_IRQ_EN_ALLOFF);
/*clearn BBPU alarm power on bit*/
BBPU = DRV_Reg(RTC_BBPU);
BBPU&=0xfe;
BBPU|=RTC_BBPU_KEY;
DRV_WriteReg(RTC_BBPU,BBPU);
for(delay=0;delay<500;delay++);
RTC_setPWRKey();
}
#endif
}
#ifdef BMT_DEBUG
for(count=0;count<1000;count++);
time.rtc_sec=0;
time.rtc_min=0;
time.rtc_hour=0;
time.rtc_day=1;
time.rtc_wday=1;
time.rtc_mon=1;
time.rtc_year = 0;
RTC_InitTC_Time(&time);
#endif /*BMT_DEBUG*/
#if ( (defined(MT6205)) || (defined(MT6208)) || (defined(FPGA)) )
BBPU = DRV_Reg(RTC_BBPU);
BBPU |= (RTC_BBPU_KEY|RTC_BBPU_PWR_POLARITY|RTC_BBPU_PDN_XOSC32K
|RTC_BBPU_PWR_SW|RTC_BBPU_ALARM_SW);
DRV_WriteReg(RTC_BBPU,BBPU);
#endif /*MT6205,MT6208,FPGA*/
#if ( (defined(MT6205B)) || (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
//DRV_WriteReg(RTC_BBPU,RTC_BBPU_POWERON);
BBPU = DRV_Reg(RTC_BBPU);/*0227 TY modifies*/
BBPU |= RTC_BBPU_POWERON;
DRV_WriteReg(RTC_BBPU,BBPU);
for(count=1000;count>0;count--)
{
kal_uint32 delay_tick;
if(( DRV_Reg(RTC_BBPU)&RTC_BBPU_PWR_SW)!=0)
break;
for (delay_tick = 10000; delay_tick >0; delay_tick--)
{
}
DRV_WriteReg(RTC_BBPU,BBPU);
}
#if ( (defined(MT6205B)) || (defined(MT6218)) || (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
BBPU = DRV_Reg(RTC_INFO1);
BBPU &= ~0x0e;
BBPU |= (0x00<<1); /*2ms debounce time*/
DRV_WriteReg(RTC_INFO1,BBPU);
#endif /*MT6205B*/
#endif /*MT6205,MT6208,FPGA*/
DRV_WriteReg(RTC_AL_DOW,DRV_Reg(RTC_TC_DOW));
return isFirstOn;
}
/*
* FUNCTION
* DRV_NFB_POWERON
*
* DESCRIPTION
* This function is to power on the targer.
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
* KAL_TRUE: MS is first power on of RTC has been reset
* KAL_FALSE: otherwise.
*
* GLOBALS AFFECTED
* None
*/
kal_bool DRV_NFB_POWERON(void) /*power function for NFB*/
{
#ifdef _NAND_FLASH_BOOTING_
if(BMT.PWRon == PWRKEYPWRON)
DRV_POWERON();
#endif
}
/*
* FUNCTION
* CHRDET_HISR
*
* DESCRIPTION
* This function is the interrupt handler for EINT1
*
* CALLS
*
* PARAMETERS
* None
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* None
*/
void CHRDET_HISR(void)
{
extern void bmt_charger_action(kal_bool in);
kal_uint8 state;
BMT.EINT2STATE = !BMT.EINT2STATE;
#if defined(MT6305) && !defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__)
chrdet_level_config(BMT.EINT2STATE);
#endif
state = !BMT.EINT2STATE;
if (state == DETECTCHRIN)
{
#ifdef BMT_DEBUG
dbg_printWithTime("CHARGER_PLUGIN\r\n");
#endif /*BMT_DEBUG*/
bmt_set_chr_status(bmt_chr_in);
bmt_charger_action(KAL_TRUE);
}
else
{
#ifdef BMT_DEBUG
dbg_printWithTime("CHARGER_PLUGOUT\r\n");
#endif /*BMT_DEBUG*/
bmt_set_chr_status(bmt_chr_out);
bmt_charger_action(KAL_FALSE);
}
#if defined(MT6305) && !defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__)
EINT_UnMask(gCHRDET_EINT_NO);
#endif
}
/*
* FUNCTION
* chrdet_level_config
*
* DESCRIPTION
* This function is setup the configuration of external interrupt 1.
*
* CALLS
*
* PARAMETERS
* state: DETECTCHRIN or DETECTCHROUT
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* None
*/
void chrdet_level_config(kal_uint8 state)
{
if (state == DETECTCHRIN)
EINT_Set_Polarity(gCHRDET_EINT_NO,LEVEL_HIGH);
else
EINT_Set_Polarity(gCHRDET_EINT_NO,LEVEL_LOW);
}
/*************************************************************************
* FUNCTION
* PW_is_RTC_expired
*
* DESCRIPTION
* Check if RTC alarm is expired.
*
* PARAMETERS
* None
*
* RETURNS
* KAL_TRUE: MS is powered on with RTC alarm expired.
* KAL_FALSE: vise versa,
* GLOBALS AFFECTED
*
*
*************************************************************************/
#if ( (!defined(__L1_STANDALONE__)) && (!defined(MT6208)) )
kal_bool PW_is_RTC_expired(void)
{
#if ( (defined(MT6205)) || (defined(MT6208)) || (defined(MT6218)))
kal_uint16 BBPU;
kal_uint16 POLAR;
kal_uint16 PWRSW;
#endif /*(MT6205,MT6208)*/
kal_uint32 currtime;
kal_uint32 al_currtime;
t_rtc time_current;
t_rtc time_alarm;
#if ( (defined(MT6205)) || (defined(MT6208)) || (defined(MT6218)))
// get Polarity and BBPU bit
BBPU = DRV_Reg(RTC_BBPU);
POLAR = BBPU & RTC_BBPU_PWR_POLARITY;
POLAR >>= 1;
PWRSW = BBPU & RTC_BBPU_PWR_SW;
#if ( (defined(MT6205)) || (defined(MT6218)))
PWRSW >>= 2;
#elif ( (defined(MT6208)) )
PWRSW >>= 4;
#endif /*(MT6208)*/
#endif /*(MT6205,MT6208)*/
// BBPU bit is set
#if ( (defined(MT6205)) || (defined(MT6208)) || (defined(MT6218)) )
if (POLAR == PWRSW)
#elif ( (defined(MT6205B)) || (defined(MT6218B))|| (defined(MT6219))||(defined(MT6217))||(defined(MT6228))|| defined(MT6229) || defined(MT6230)|| (defined(MT6226))|| (defined(MT6227))||defined(MT6226M) )
if (DRV_Reg(RTC_BBPU) & RTC_BBPU_PWR_SW)
#elif ( (defined(FPGA)) )
if (0)
#endif /*(MT6205B)*/
{
RTC_GetTime(&time_current);
RTC_GetALTime(&time_alarm);
currtime = (kal_uint32)(time_current.rtc_hour*3600+time_current.rtc_min*60+time_current.rtc_sec);
al_currtime = (kal_uint32)(time_alarm.rtc_hour*3600+time_alarm.rtc_min*60+time_alarm.rtc_sec);
// current time >= (alarm time + 20 seconds )
if ((time_current.rtc_year == time_alarm.rtc_year) &&
(time_current.rtc_mon == time_alarm.rtc_mon) &&
(time_current.rtc_day == time_alarm.rtc_day) &&
(currtime >= (al_currtime)) &&
(currtime < (al_currtime+20))
)
{
#ifdef BMT_DEBUG
dbg_printWithTime("RTCPWRON\r\n");
#endif /*BMT_DEBUG*/
return KAL_TRUE;
}
}
return KAL_FALSE;
}
/*************************************************************************
* FUNCTION
* PW_is_charger_usb_present
*
* DESCRIPTION
* Check if charger or usb is connected now ?
*
* PARAMETERS
* None
*
* RETURNS
* KAL_TRUE: MS is powered on with RTC alarm expired.
* KAL_FALSE: vise versa,
* GLOBALS AFFECTED
* None
*
* Note
* Charger and usb cannot exist simutaneously
*
*************************************************************************/
kal_bool PW_is_usb_present(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -