📄 pmic6318.c
字号:
/*****************************************************************************
* 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 + -