当前位置:文档之家› USB或充电器插入消息传递流程

USB或充电器插入消息传递流程

__CHINA_CHARGER_STANDARD__ , __FUE__ 和DRV_USB_IP_V3 在23,25平台上这些都宏未定义
__CHARGER_USB_DETECT_WIHT_ONE_EINT__ 有定义

刚开机时,运行bmt_task_main()--bmt_main.c bmt_task_main()中调用pmic_adpt_reg_chr_usb()对 USB_CHARGER 注册中断函数
void bmt_task_main(task_entry_struct *task_entry_ptr)
{
....
pmic_adpt_reg_chr_usb();
while(1)
{
.....
}
....
}

pwic.c --BMT_Charge()
{
...
if(data==(char)KAL_TRUE)
{

}
else
{
中添加 dbg_print()会引起开不了机!
}
...
}

void pmic_adpt_reg_chr_usb(void)
{
#if defined(PMIC_6318_REG_API)/*XXXXX*/

创建一个ADC通道,用于检测电源电压的

#if defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__)
/* Create adc object first here. */
chr_usb_detect.chr_usb_adc_logical_id = adc_sche_create_object(MOD_BMT, chr_usb_detect.chr_usb_adc,10,3, KAL_TRUE);
#endif

PMIC_ChrDet_Registration(AC_CHR, CHR_USB_EINT_HISR); //PMIC_CHRDET.pmic_ac_det()指向中断函数CHR_USB_EINT_HISR

#if !defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__) //此宏已定义,不走
EINT_Registration(gCHRDET_EINT_NO,KAL_TRUE,LEVEL_LOW,PMIC_HISR, KAL_TRUE);
#else
EINT_Registration(chr_usb_detect.chr_usb_eint,KAL_TRUE,LEVEL_LOW,PMIC_HISR, KAL_FALSE); //注册USB_CHARGER中断,
中断函数为PMIC_HISR
#if defined(DRV_R269)
EINT_SW_Debounce_Modify(chr_usb_detect.chr_usb_eint, 95); //修改中断响应时间
#else
EINT_SW_Debounce_Modify(chr_usb_detect.chr_usb_eint, 20);
#endif
#endif
#elif defined(PMIC_6326_REG_API)

....

#endif
}

充电器 或USB 插入流程:
pmic6318.c--pmic_hisr()--pmic_ac_det()
pwic.c--CHR_USB_EINT_HISR()--CHR_USB IN
pwic.c--check_charger_or_usb()--CHARGER_PRESENT
pwic.c--CHRDET_HISR()--CHARGER_PLUGIN
bmt_main.c--charge IN bmt_task_main()--case MSG_ID_BMT_CHARGER_IND!
uem_proc_msg.c--PMIC_CHARGER_IN--uemdrv_pmic_ind()
bmtutil.c--bmt_charge_start()
PwronCharger.c--BatteryStatusRsp()--case PMIC_CHARGER_IN:
PwronCharger.c--initializeChargingSrc() //charger in 关机状态下才走到 USBDevice.c-- InitializeUsbScr() //USB 插入
PwronCharger.c--ShowChargingScr () --g_pwr_context.PowerOnMode=2
PwronCharger.c--initializeChargingSrc
PwronCharger.c--BatteryStatusRsp()--p->battery_status=0--case PMIC_VBAT_STATUS:



充电器 或 USB 拔出流程:
pmic6318.c--pmic_hisr()--pmic_ac_det()
pwic.c--CHR_USB_EINT_HISR()--CHR_USB OUT
pwic.c--CHRDET_HISR()--CHARGER_PLUGOUT
pwic.c--CHR_USB_PLUG_OUT()--CHARGER_PRESENT
bmt_main.c--bmt_task_main()--case MSG_ID_BMT_CHARGER_IND chr plugout
uem_proc_msg.c--uemdrv_pmic_ind()--case pmic_charger_out
bmtutil.c--bmt_charge_end()
PwronCharger.c--BatteryStatusRsp()--cas

e PMIC_CHARGER_OUT:





1)充电器插入发生中断,进入中断函数:
pmic6318.c void PMIC_HISR(void)
{
...
/*plug in */
if(PMIC_CHRDET.pmic_ac_det!=NULL)
{
PMIC_CHRDET.pmic_ac_det(); //PMIC_CHRDET.pmic_ac_det()指向中断函数CHR_USB_EINT_HISR
}
if (diff& USB_DET_MASK)
{
if(PMIC_CHRDET.pmic_usb_det!=NULL)
PMIC_CHRDET.pmic_usb_det();
}
...
}

static void CHR_USB_EINT_HISR(void)---pwic.c
{
chr_usb_detect.chr_usb_state = (kal_bool)(!((kal_uint8)chr_usb_detect.chr_usb_state));
if(chr_usb_detect.chr_usb_state) //USB 或 CHARGER 插入操作
{
if (bmt_event_sche_active == 1)
{

。。。
if (usb_charger_eint_reg_handle == 0xFF)
{
GPTI_GetHandle(&usb_charger_eint_reg_handle);
}
GPTI_StartItem(usb_charger_eint_reg_handle,
1,
usb_charger_eint_reg_adc_measurement_cb,
NULL);
}
else
{
// bmt task is NOT setting event scheduler, we can set directly
adc_sche_set_timer_page_align(KAL_FALSE);

ADC任务调试,进入check_charger_or_usb(),通过D-上的电压值判断是 USB 还是 CHARGER
adc_sche_add_item(chr_usb_detect.chr_usb_adc_logical_id,check_charger_or_usb,adc_sche_measure);
}



}
else //USB 或 CHARGER 拔出操作
{

。。。
}
}

__CHINA_CHARGER_STANDARD__ , __FUE__ 和DRV_USB_IP_V3 在23,25平台上这些都宏未定义
__CHARGER_USB_DETECT_WIHT_ONE_EINT__ 有定义
#if !defined(DRV_USB_IP_V3) //宏 DRV_USB_IP_V3 未定义,故走
static void check_charger_or_usb(kal_uint8 sche_id)--PWIC.C
{
volt= (kal_int32)VOL_RESULT[chr_usb_detect.chr_usb_adc_logical_id];//获取ADC值
state=bmt_check_ac_usb(volt);//返回 USB_PRESENT 或 CHARGER_PRESENT
//通过电压ADC判断是 USB 还是 CHARGER .如果volt<1.4V,为USB(USB_PRESENT);volt>=1.4V,为CHARGER(CHARGER_PRESENT),
//详见chr_parameter.c中的bmt_check_ac_usb()

if(BMT.PWRon==(kal_uint8)USBPWRON||BMT.PWRon==(kal_uint8)USBPWRON_WDT||state==USB_PRESENT)
{

chr_usb_detect.chr_usb_present = USB_PRESENT;
CHRDET_HISR();
#if defined(__USB_ENABLE__)
USB_EINT_HISR();
#endif // #if defined(__USB_ENABLE__)
}
else
{
chr_usb_detect.chr_usb_present = CHARGER_PRESENT;

CHRDET_HISR();

}

}

pwic.c
void CHRDET_HISR(void)
{

if (state == DETECTCHRIN)
{
bmt_set_chr_status(bmt_chr_in);
}
else
{
bmt_set_chr_status(bmt_chr_out);
}
}



2)发送消息给BMT
bmt_main.c
void bmt_set_chr_status(Charger_Status status)
{
chr_status = status;
if (chr_read_flag == 0)
{
chr_read_flag = 1;
BMT_sendMes(MOD_EINT_HISR/*MOD_BMT*/,MSG_ID_BMT_CHARGER_IND);
}
}



3)BMT接收消息,

再发送给UEM

bmt_main.c
Charger_Status bmt_read_chr_status(void)
{
chr_read_flag = 0;
return chr_status;
}

void bmt_task_main(task_entry_struct *task_entry_ptr)
{
while(1)
{
receive_msg_ext_q(task_info_g[task_entry_ptr->task_indx].task_ext_qid, ¤t_ilm);

switch(current_ilm.msg_id)
{
。。。。
case MSG_ID_BMT_CHARGER_IND:
if (bmt_read_chr_status() == bmt_chr_in)
{
。。。。
BMT_sendMes2UEM(BMT_CHARGER_IN);
bmt_charge_start();
}
else if(bmt_read_chr_status() == bmt_chr_out)
{
。。。。
BMT_sendMes2UEM(BMT_CHARGER_OUT);
bmt_charge_end();
}

。。。。
}
。。。。
}


4)BMT发送消息给UEM(user equipment manage)
void BMT_sendMes2UEM(BMT_CHR_STAT status)
{
#ifndef L4_NOT_PRESENT
ilm_struct *BMT_ilm;

drvuem_pmic_ind_struct *BMT_Prim;

BMT_Prim = (drvuem_pmic_ind_struct*)
construct_local_para(sizeof(drvuem_pmic_ind_struct), TD_CTRL);
BMT_Prim->status= status;

DRV_BuildPrimitive(BMT_ilm, //消息载体
MOD_BMT, //发送模块
MOD_UEM, //接收模块
MSG_ID_DRVUEM_PMIC_IND, //消息ID
BMT_Prim);
msg_send_ext_queue(BMT_ilm); //发送到队列中
#endif /*L4_NOT_PRESENT*/
}

5)UEM接收消息
uem_main.c

void uem_main(ilm_struct *ilm_ptr)
{
switch (ilm_ptr->msg_id)
{
.....
case MSG_ID_DRVUEM_PMIC_IND:
uemdrv_pmic_ind_hdlr(ilm_ptr->local_para_ptr, ilm_ptr->peer_buff_ptr);
break;
.....
}

具体实现
uem_msg_hdlr.c

void uemdrv_pmic_ind_hdlr(local_para_struct *local_para_ptr, peer_buff_struct *peer_buff_ptr)
{
uem_bmt_struct bmt_status;

drvuem_pmic_ind_struct *msg_ptr = NULL;

msg_ptr = (drvuem_pmic_ind_struct*) local_para_ptr;

uem_get_bat_status(&bmt_status); //获取电池状态

bmt_status.status = uem_battery_status_convert((kal_uint8) msg_ptr->status);

uem_set_bat_status(bmt_status); //设置电池状态

uemdrv_pmic_ind(bmt_status.status);

return;
}


uem_proc_msg.c
void uemdrv_pmic_ind(kal_uint8 status_type)
{
case PMIC_CHARGER_IN: /* Charger plug in */
{
{
#if defined(PLUTO_MMI)此宏已定义


#else /* defined(PLUTO_MMI) */
。。。
#endif /* defined(PLUTO_MMI) */
break;
}
}

bmt_task_main()中往下运行到bmt_charge_start()
void bmt_task_main(task_entry_struct *task_entry_ptr)
{
while(1)
{
receive_msg_ext_q(task_info_g[task_entry_ptr->task_indx].task_ext_qid, ¤t_ilm);



switch(current_ilm.msg_id)
{
。。。。
case MSG_ID_BMT_CHARGER_IND:
if (bmt_read_chr_status() == bmt_chr_in)
{
。。。。
BMT_sendMes2UEM(BMT_CHARGER_IN);
bmt_charge_start(); //此句
}
else if(bmt_read_chr_status() == bmt_chr_out)
{
。。。。
BMT_sendMes2UEM(BMT_CHARGER_OUT);
bmt_charge_end();
}

。。。。
}
。。。。
}

void bmt_charge_start(void)
{
。。。
#ifdef MTK_SLEEP_ENABLE
L1SM_SleepDisable(bmt_sm_handle);
#endif

读取各个通道的ADC值
for(index=0;index{
adc_sche_modify_parameters(bmt_bmtid_adcscheid[index],1,1);
adc_sche_add_item(bmt_bmtid_adcscheid[index],bmt_measure_complete1[index], bmt_adc_sche_measure);
}

adc_sche_set_timer_page_align(KAL_FALSE);

打开充电计时器,最长6小时,如果充电时间到达6小时,即使未充满也会停止充电
stack_start_timer(&ChargeTimeout_timer, 0, KAL_TICKS_1_MIN*60*6);
。。。
}


MMI进行相应的处理
void BatteryStatusRsp(void *info)
{

switch (p->battery_status)
{
#ifdef __MMI_USB_SUPPORT__
case PMIC_USB_CHARGER_IN: USB插入从此进
string_id = STR_USB_CHARGER_CONNECTED;
/* PASS */
#endif /* __MMI_USB_SUPPORT__ */
case PMIC_CHARGER_IN: 充电器插入从此进
{
置充电器已连接的标志变量:
#if defined(__DUAL_BATTERY_SUPPORT__)
if (dual_battery.current_battery_no == Battery_No1)
{
dualbattery_context[Battery_No1].isChargerConnected=1;
dualbattery_context[Battery_No2].isChargerConnected=0;
}
else
{
dualbattery_context[Battery_No1].isChargerConnected=0;
dualbattery_context[Battery_No2].isChargerConnected=1;
}
#else
g_charbat_context.isChargerConnected = 1;
#endif


插入充电器提示,电池图标等
。。。
break;
}
。。。


#ifdef __MMI_USB_SUPPORT__
case PMIC_USB_NO_CHARGER_OUT:
case PMIC_USB_CHARGER_OUT:
string_id = STR_USB_CHARGER_REMOVED;
/* PASS */
#endif /* __MMI_USB_SUPPORT__ */
case PMIC_CHARGER_OUT:
{


}
}
。。。
}

以下分两路关机状态下和开机状态下

关机下:
初始化充电图标
void InitializeChargingScr(void)
{
。。。
}

显示充电图标
void ShowChargingScr(void)
{
。。。
}

开机下:
void BatteryStatusIndication(U8 battery_voltage)
{
....
}


双电池充电没法切换,切换后

相应电池框不跑格,屏闪

相关主题
文本预览
相关文档 最新文档