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

📄 pwic.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 3 页
字号:
      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(&current_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 + -