[杰理]充电逻辑

代码功能概述

这段代码是一个处理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连接状态,确保主设备在充电时能正确处理连接
防止低电量时插拔充电器导致的充电异常问题

整个流程通过大量条件编译和状态检查,确保在不同配置和场景下都能正确处理充电事件。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容