USB或充电器插入消息传递流程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
__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)
{
....
}
双电池充电没法切换,切换后
相应电池框不跑格,屏闪