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

📄 pmic6318.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *    pmic6318.c
 *
 * Project:
 * --------
 *   Maui_Software
 *
 * Description:
 * ------------
 *   This Module defines functions that PMIC 6318 can support
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 ****************************************************************************/
 #if ( (defined(MT6318))  )
#include 	"kal_release.h"
#include 	"stack_common.h"  
#include 	"stack_msgs.h"
#include 	"app_ltlcom.h"       /* Task message communiction */
#include 	"drv_comm.h"
#include    "drvsignals.h"
#include 	"reg_base.h"
#include 	"pmic6318_hw.h"
#include 	"pmic6318_sw.h"
#include 	"b2psi_hw.h"
#include 	"b2psi_sw.h"
#include 	"intrCtrl.h"
#include	   "stack_ltlcom.h"       /*msg_send_ext_queue.....definitions*/
#include	   "stack_config.h"        /*MOD_UART1_HISR,MOD_UART2_HISR*/
#include    "eint.h"
#include    "drvsignals.h"

typedef  struct
{
   kal_int16       tq_start;
   kal_int16       max_start;
   kal_int16       max_end;
   kal_int16       max_diff;

}  sMTMAXTIME;
sMTMAXTIME  pmic_duration;
    
pmic_chrdect_callbac_struct PMIC_CHRDET;    
    
kal_uint8 pmic_reg_save[PMIC_MAX_REG];
kal_uint16 pmic_max_bl_clk;
   
/*
* FUNCTION                                                            
*	pmic_init
*
* DESCRIPTION                                                           
*   PMIC6318 driver initial function
*
* CALLS  
*	
*
* PARAMETERS
*	None
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void pmic_init(void)
{  
   kal_uint8 index ;
   extern void pmic_customization_init(void);
   /*????need remove*/   
   for(index=0;index<PMIC_MAX_REG;index++)
   {
      pmic_reg_save[index]=B2PSI_read((index<<PMIC_SHIFT_BITS));  
   }     
   pmic_adc_measure_div2(KAL_TRUE);
   pmic_adc_measure_sel(PMIC_ADC_ISENSE);
   pmic_adc_measure_sel(PMIC_ADC_VBAT);  
   pmic_charge_pump_init((CHARGE_PUMP_LEVEL3|CHARGE_PUMP_CTRL_SET));
   pmic_customization_init();  
   /*temp, force LCD on*/
   //B2PSI_write(0xff,PMIC_LDO_STAT);  
   B2PSI_write(0x63,PMIC_EXTRAS);       
}   

/*
* FUNCTION                                                            
*	pmic_led_config
*
* DESCRIPTION                                                           
*  Adjust LED driver current and duty cycle
*
* CALLS  
*	It is called by UEM
*
* PARAMETERS
*	led_conf: current and duty cycle setting
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
/*LED control*/
void pmic_led_config(pmic_led_struct *led_conf)
{   
   kal_uint8 pwm_d=0;
   kal_uint8 data;
   kal_uint32 savedMask;
    
   pwm_d=((led_conf->duty_cycle*32)/100);
   if(pwm_d<1) 
       pwm_d=0;
   else    
      pwm_d--;
   pwm_d=pwm_d&0x1f;
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(led_conf->type>>PMIC_SHIFT_BITS)];
   if(led_conf->type==KP_LED||led_conf->type==BL_LED) 
   {
      data=(data&0xE0)|pwm_d;
   }
   else
   {
      data=(data&0x80)|(pwm_d|led_conf->current);
   }
   B2PSI_write(data, led_conf->type);
   RestoreIRQMask(savedMask);
}
/*
* FUNCTION                                                            
*	pmic_dim_enable
*
* DESCRIPTION                                                           
*  Turn on or turn DIM clock
*
* CALLS  
*	
*
* PARAMETERS
*  enable: on or off
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void pmic_dim_enable(kal_bool enable)
{
   kal_uint8 data;  
   data=pmic_reg_save[(PMIC_LDO_STAT>>PMIC_LDO_STAT)];
   
   if(enable==KAL_TRUE)
   {      
      data|=DIM_ON;               
   }   
   else if(enable==KAL_FALSE)
   {
      data&=~DIM_ON;                  
   }      
   B2PSI_write(data,PMIC_LDO_STAT);   
}   
/*
* FUNCTION                                                            
*	pmic_led_enable
*
* DESCRIPTION                                                           
*  Turn on or turn off LED 
*
* CALLS  
*	It is called by UEM
*
* PARAMETERS
*	type: LED type
*  enable: on or off
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
/*start and stop*/
kal_uint16 led_status=0;
void pmic_led_enable(pmic_led_type type, kal_bool enable)
{
   kal_uint8 data;
   kal_uint8 bl_data;
   kal_uint32 savedMask;
   
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(type>>PMIC_SHIFT_BITS)];
   
   if(enable==KAL_TRUE)
   {
      pmic_dim_enable(KAL_TRUE);/*turn on dim first.*/
      pmic_chr_pump_enable(KAL_TRUE);
      data|=LED_ON;   
      if(type!=BL_LED)
         led_status|=(1<<(type>>PMIC_SHIFT_BITS));
   }   
   else if(enable==KAL_FALSE)
   {
      data&=~LED_ON;
      if(type!=BL_LED)
         led_status&=~(1<<(type>>PMIC_SHIFT_BITS));            
   }   
   B2PSI_write(data,type);
      
   if(led_status==0)  
   {
         pmic_chr_pump_enable(KAL_FALSE);      
      bl_data=pmic_reg_save[(BL_LED>>PMIC_SHIFT_BITS)];
      bl_data&=0x80;
      if(bl_data==0)/*turn off dim when no one use it.*/
         pmic_dim_enable(KAL_FALSE);                  
   }      
   RestoreIRQMask(savedMask);            
}   
/*
* FUNCTION                                                            
*	pmic_rgb_dim_clk_setting
*
* DESCRIPTION                                                           
*  Adjust dim clock
*
* CALLS  
*	It is called adjust dim clock
*
* PARAMETERS
*	clk: dim clock
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
/*This only for R/G/B/KP */
/*Note the maximum clk is 1K*/
void pmic_rgb_dim_clk_setting(kal_uint32 clk)
{
   kal_uint8 div;
   kal_uint8 data;
   kal_uint32 savedMask;
   if(clk>=1000)
      clk=1000;
   if(clk==0)
      clk=1;   
      
   div=(1000/clk)-1;
   div=div&0xf;
   
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_DIM_CLOCK>>PMIC_SHIFT_BITS)];   
   data&=0xf0;
   div=data|div;
   B2PSI_write(div, PMIC_DIM_CLOCK);
   RestoreIRQMask(savedMask); 
} 

/*????new bl setting*/
void pmic_bl_div_bypass(kal_bool enable)
{
   kal_uint8 data;
   kal_uint32 savedMask;
   
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_BLLED_DRIVER>>PMIC_SHIFT_BITS)];

   if(enable==KAL_TRUE)
   {
      data|=BL_DIV_BYPASS;   
      pmic_max_bl_clk=25000;/*25K*/
   }   
   else if(enable==KAL_FALSE)
   {
      data&=~BL_DIV_BYPASS;
      pmic_max_bl_clk=1000;/*1K*/
   }            
   B2PSI_write(data, PMIC_BLLED_DRIVER);    
   RestoreIRQMask(savedMask);      
}
void pmic_bl_dim_clk_setting(kal_uint32 clk)
{
   kal_uint8 div=1;
   kal_uint8 data;
   kal_uint32 savedMask;      
   
   if(pmic_max_bl_clk==25000)
   {
      if(clk>=25000)
         clk=25000; 
      div=(25000/clk)-1;      
   }   
   else if(pmic_max_bl_clk==1000)
   {
      if(clk>=1000)
         clk=1000;       
      div=(1000/clk)-1;      
   }      
   
   div=div&0xf;
   div=div<<4;   
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_DIM_CLOCK>>PMIC_SHIFT_BITS)];   
   data&=0x0f;
   div=data|div;
   B2PSI_write(div, PMIC_DIM_CLOCK);
   RestoreIRQMask(savedMask); 
}
/*????new adc control*/
void pmic_adc_measure_div2(kal_bool enable)
{
   kal_uint8 data;
   kal_uint32 savedMask;
   
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_EXTRAS>>PMIC_SHIFT_BITS)];
   /**/
   if(enable==KAL_TRUE)
   {
      data&=~VBHSEL_DIV2;      
   }   
   else if(enable==KAL_FALSE)
   {      
      data|=VBHSEL_DIV2;         
   }            
   B2PSI_write(data, PMIC_EXTRAS);    
   RestoreIRQMask(savedMask);      
}
void pmic_adc_measure_sel(adc_type sel)
{
   
   kal_uint8 data;
   kal_uint32 savedMask; 
   
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_EXTRAS>>PMIC_SHIFT_BITS)];
   sel=sel<<5;
   //data=data&0x9f;
   if (sel==PMIC_ADC_OFF)
      data=data&0x9f;
   data=data|sel;
   /**/   
   B2PSI_write(data, PMIC_EXTRAS);    
   RestoreIRQMask(savedMask);      
}
/*
* FUNCTION                                                            
*	pmic_charge_current_offset
*
* DESCRIPTION                                                           
*  Configure charging current offser
*
* CALLS  
*	It is called by BMT task
*
* PARAMETERS
*	offset: current offset
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/     
void pmic_charge_current_offset(kal_int8 offset)
{
   kal_uint8 setting;
   kal_uint32 savedMask;
   kal_uint8 data;
   
   if(offset>12)
      offset=12;
   else if(offset<-16)
      offset=-16;
      
   setting=4+(offset/4);
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_CHARGER_CTRL2>>PMIC_SHIFT_BITS)];
   data&=0xf8;
   data|=setting;   
   B2PSI_write(data, PMIC_CHARGER_CTRL2);    
   RestoreIRQMask(savedMask);
} 

void pmic_clear_ov(void)
{
   kal_uint32 savedMask;
   kal_uint8 data;
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_CHARGER_CTRL2>>PMIC_SHIFT_BITS)];
   data&=~0x4;
   B2PSI_write(data, PMIC_CHARGER_CTRL2);    
   RestoreIRQMask(savedMask);
}   

/*
* FUNCTION                                                            
*	pmic_vibrator_enable
*
* DESCRIPTION                                                           
*  Turn on or turn off Vibrator 
*
* CALLS  
*	It is called by UEM
*
* PARAMETERS
*	enable: on or off
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/  
void pmic_vibrator_enable(kal_bool enable)
{
   kal_uint8 data;
   kal_uint32 savedMask;

   savedMask = SaveAndSetIRQMask();
   
   data=pmic_reg_save[(PMIC_MISC>>PMIC_SHIFT_BITS)];
   if(enable==KAL_TRUE)
   {
      data|=VIBRATOR_ON;   
   }   
   else if(enable==KAL_FALSE)
   {
      data&=~VIBRATOR_ON;
   }            
   B2PSI_write(data, PMIC_MISC);    
   RestoreIRQMask(savedMask);      
} 
/*
* FUNCTION                                                            
*	pmic_speker_enable
*
* DESCRIPTION                                                           
*  Turn on or turn off speaker amp
*
* CALLS  
*	It is called by audio driver
*
* PARAMETERS
*	enable: on or off
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/  
void pmic_speaker_enable(kal_bool enable)
{
   kal_uint8 data;
   kal_uint32 savedMask;
   /*audio invoke this in LISR, dont disable interrupt*/
   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_MISC>>PMIC_SHIFT_BITS)];
   if(enable==KAL_TRUE)
   {
      data|=SPEAKER_ON;   
   }   
   else if(enable==KAL_FALSE)
   {
      data&=~SPEAKER_ON;
   }            
   //L1D_MeasureMaxDuration_Start( &pmic_duration );
   B2PSI_write(data, PMIC_MISC);          
   //L1D_MeasureMaxDuration_Stop( &pmic_duration );
   RestoreIRQMask(savedMask);
}   
/*
* FUNCTION                                                            
*	pmic_vsim_sel
*
* DESCRIPTION                                                           
*  Adjust vsim voltage source
*
* CALLS  
*	Adjust vsim voltage source
*
* PARAMETERS
*	vol: sim voltage source
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
/*VIM 1.8V/3.0V sel*/
void pmic_vsim_sel(sim_vol vol)
{
   kal_uint8 data;
   kal_uint32 savedMask;

   savedMask = SaveAndSetIRQMask();
   data=pmic_reg_save[(PMIC_MISC>>PMIC_SHIFT_BITS)];

   if(vol==VSIM_3)        
   {
      data|=VSIM_SEL_3;   
   }   
   else if(vol==VSIM_1_8)
   {
      data&=~VSIM_SEL_3;/*1.8V*/
   }            
   B2PSI_write(data, PMIC_MISC);  
   RestoreIRQMask(savedMask);        
}
/*
* FUNCTION                                                            
*	pmic_vmc_enable
*
* DESCRIPTION                                                           
*  Turn on or turn off VM LDO
*
* CALLS  
*	It is called by MSDC driver
*
* PARAMETERS
*	enable: on or off
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void pmic_vmc_enable(kal_bool enable)
{
   kal_uint8 data;
   kal_uint32 savedMask;
   
    savedMask = SaveAndSetIRQMask();
    data=pmic_reg_save[(PMIC_MISC>>PMIC_SHIFT_BITS)];
   
   if(enable==KAL_TRUE)
   {
      data|=VMC_ON;   
   }   
   else if(enable==KAL_FALSE)
   {
      data&=~VMC_ON;
   }            
   B2PSI_write(data, PMIC_MISC);          
   RestoreIRQMask(savedMask); 
}
void pmic_vmc_sel(vmc_sel_enum sel)
{
   kal_uint8 data;
   kal_uint32 savedMask;
   
   savedMask = SaveAndSetIRQMask();   
   
   data=pmic_reg_save[(PMIC_EXTRAS>>PMIC_SHIFT_BITS)];   
      
   if(sel==VMC_3V)
   {
      data|=VMC_SEL_MASK;   
   }   
   else if(sel==VMC_2_8V)
   {
      data&=~VMC_SEL_MASK;
   }            
   B2PSI_write(data, PMIC_EXTRAS);          
   RestoreIRQMask(savedMask); 
}

/*
* FUNCTION                                                            
*	pmic_vb_sel
*
* DESCRIPTION                                                           
*  Adjust vd voltage source
*
* CALLS  
*	
*
* PARAMETERS
*	sel: vd voltage source selection
*	
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
/*the same as VASEL*/

⌨️ 快捷键说明

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