代码功能概述
这段代码是一个处理5V充电LDO(低压差线性稳压器)插入事件的函数,主要用于管理耳机或类似设备在连接充电器时的行为。它包含了一系列条件检查和状态切换操作,以确保设备在充电时能正确处理各种情况,如断开不必要的功能、进入充电模式、处理TWS连接等。
代码逐行解释
1. 函数入口与日志记录
void charge_ldo5v_in_deal(void)
{
log_info("%s
", __FUNCTION__);
函数名称:charge_ldo5v_in_deal
功能:处理5V充电LDO插入事件
首先记录函数调用日志,使用__FUNCTION__
宏获取当前函数名
2. TWS同步处理(如果启用)
#if TCFG_IRSENSOR_ENABLE
if (get_bt_tws_connect_status()) {
tws_api_sync_call_by_uuid('T', SYNC_CMD_EARPHONE_CHAREG_START, 300);
}
#endif
条件编译:如果启用了红外传感器(TCFG_IRSENSOR_ENABLE
)
检查是否已连接TWS(True Wireless Stereo)
如果已连接,则通过UUID同步调用,通知对端耳机开始充电
3. 电源事件通知与充电状态重置
//插入交换
power_event_to_user(POWER_EVENT_POWER_CHANGE);
charge_full_flag = 0;
发送电源状态变化事件给用户
重置充电完成标志,表示开始充电
4. 禁用不必要的传感器(如果启用)
#if TCFG_GSENSOR_ENABLE
//入舱关闭gSensor
gSensor_wkupup_disable();
#endif
#if (TCFG_LP_TOUCH_KEY_ENABLE && !CHARGING_CLEAN_PHONE_INFO)
extern void lp_touch_key_charge_mode_enter();
lp_touch_key_charge_mode_enter();
#endif
#if TCFG_GX8002_NPU_ENABLE
extern void gx8002_module_suspend(u8 keep_vddio);
gx8002_module_suspend(0);
#endif
如果启用了重力传感器(GSensor),则禁用唤醒功能
如果启用了低功耗触摸按键,进入充电模式
如果启用了GX8002 NPU,暂停该模块以节省电量
5. 充电相关设置
#ifdef TCFG_CHARGE_CHECK_SET_LDOIN_PINR
charge_check_and_set_pinr(0);
#endif
#if TCFG_AUDIO_ANC_ENABLE
anc_suspend();
#endif
如果启用了充电检查功能,设置LDO输入引脚电阻
如果启用了主动降噪(ANC),暂停ANC功能
6. 测试盒与ANC盒状态清理
#if TCFG_TEST_BOX_ENABLE
chargestore_clear_testbox_status();
if (ldo5v_keep_timer) {
sys_timeout_del(ldo5v_keep_timer);
ldo5v_keep_timer = 0;
}
#endif
#if TCFG_ANC_BOX_ENABLE
ancbox_clear_status();
if (ldo5v_keep_timer) {
sys_timeout_del(ldo5v_keep_timer);
ldo5v_keep_timer = 0;
}
#endif
如果启用了测试盒功能,清除测试盒状态并删除可能存在的定时器
如果启用了ANC盒功能,清除ANC盒状态并删除可能存在的定时器
7. 充电存储功能重置
#if TCFG_CHARGESTORE_ENABLE
chargestore_shutdown_reset();
#endif
如果启用了充电存储功能,重置相关状态
8. 获取当前应用并检查充电开机条件
struct application *app;
app = get_current_app();
if (get_charge_poweron_en() == 0) {
获取当前运行的应用
检查是否允许充电时开机(get_charge_poweron_en()
返回0表示不允许)
9. 处理充电时不允许开机的情况
#if defined(TCFG_CHARGE_KEEP_UPDATA) && TCFG_CHARGE_KEEP_UPDATA
if (dual_bank_update_exist_flag_get() || classic_update_task_exist_flag_get()) {
return;
}
#endif
如果启用了充电时保持更新功能,并且存在双银行更新或经典更新任务,则直接返回
10. 处理无线麦克风情况
#if TCFG_WIRELESS_MIC_ENABLE
if (strcmp(app->name, APP_NAME_IDLE) != 0) {
sys_enter_soft_poweroff((void *)1);
}
#endif
如果启用了无线麦克风功能,并且当前应用不是空闲状态,则进入软关机状态
11. 处理TWS主设备连接状态
if (app && strcmp(app->name, APP_NAME_IDLE)) {
#if (TCFG_CHARGESTORE_ENABLE && TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
if (!chargestore_check_going_to_poweroff()) {
#endif
#if TCFG_USER_TWS_ENABLE
printf("----------------tws_api_get_tws_state %x
", tws_api_get_tws_state());
int deal_state = tws_api_get_tws_state();
if (tws_api_get_role() == TWS_ROLE_MASTER && deal_state & TWS_STA_SIBLING_CONNECTED && deal_state & TWS_STA_PHONE_CONNECTED && !(deal_state & TWS_STA_MONITOR_START)) {
if (ldo5v_in_reset_timer == 0) {
delay_timeout = 30;
ldo5v_in_reset_timer = sys_timer_add(NULL, ldo5v_in_reset_delay, 100);
}
} else {
if (ldo5v_in_reset_timer) {
sys_timer_del(ldo5v_in_reset_timer);
ldo5v_in_reset_timer = 0;
}
sys_enter_soft_poweroff((void *)1);
}
#else
sys_enter_soft_poweroff((void *)1);
#endif
如果当前应用不是空闲状态:
如果是TWS主设备,并且已连接对端耳机和手机,且未启动监听,则设置一个延迟重置定时器
否则,删除可能存在的定时器并进入软关机状态
12. 处理空闲状态下的充电
} else {
charge_start();
wdt_init(WDT_32S);
log_info("set wdt to 32s!
");
goto _check_reset;
}
如果当前应用是空闲状态:
启动充电过程
初始化看门狗定时器为32秒
跳转到检查重置标签
13. 处理允许充电时开机的情况
} else {
#if TCFG_CHARGE_CALIBRATION_ENABLE
if ((app == NULL) || strcmp(app->name, APP_NAME_IDLE)) {
ASSERT(0, "app not in IDLE mode, cannot call charge start!
");
}
#endif
charge_start();
goto _check_reset;
}
return;
如果允许充电时开机:
如果启用了充电校准功能,确保当前应用是空闲状态
启动充电过程
跳转到检查重置标签
14. 检查并处理关机充电问题
_check_reset:
//防止耳机低电时,插拔充电有几率出现关机不充电问题
if (app_var.goto_poweroff_flag) {
cpu_reset();
}
}
检查是否有关机标志
如果有,则执行CPU重置,防止低电量时插拔充电器导致的充电异常问题
代码逻辑总结
这个函数主要处理耳机或类似设备在插入5V充电器时的行为:
记录充电事件并通知系统
禁用不必要的功能(如传感器、ANC等)以节省电量
根据当前应用状态和配置决定是否进入充电模式
处理TWS连接状态,确保主设备在充电时能正确处理连接
防止低电量时插拔充电器导致的充电异常问题
整个流程通过大量条件编译和状态检查,确保在不同配置和场景下都能正确处理充电事件。
暂无评论内容