优化41562与4570的耦合,修复41562的船运模式
authorcaisking <caiyqm@qq.com>
Tue, 16 Jun 2026 09:34:39 +0000 (17:34 +0800)
committercaisking <caiyqm@qq.com>
Tue, 16 Jun 2026 09:34:39 +0000 (17:34 +0800)
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/ohos_startup/ohosfwk_startup.c
code/sdk/zhihui/services/battery/CMakeLists.txt
code/sdk/zhihui/services/battery/service/battery_driver.cpp
code/sdk/zhihui/services/battery/service/battery_service.cpp
code/sdk/zhihui/services/battery/service/charge_ic.cpp
code/sdk/zhihui/services/battery/service/charge_ic.h
code/sdk/zhihui/services/cc_cycle_service/CMakeLists.txt
code/sdk/zhihui/services/cc_cycle_service/cc_cycle_service.c
code/sdk/zhihui/services/cc_cycle_service/cc_cycle_service.h
code/sdk/zhihui/utils/custom_utils.c

index 61d07d8..7441e37 100644 (file)
@@ -87,6 +87,7 @@
 #endif\r
 #ifdef SUPPORT_BATTERY_SERVICE\r
 #include "battery_service.h"\r
+#include "charge_ic.h"\r
 #endif\r
 #ifdef SUPORT_MAG_SERVICE\r
 #include "mag_service.h"\r
@@ -545,8 +546,12 @@ static void thread_main(const void *unused)
     (void)nv_upg_upgrade_task_process();\r
     thread_init();\r
 \r
+#ifdef SUPPORT_BATTERY_SERVICE\r
+    (void)charge_ic_init();\r
+#endif\r
+\r
     //尽早显示启动logo ,需要 lcd 驱动,mount file system , power_display 线程管理 lcd背光\r
-    ohos_show_bootup_logo();  \r
+    ohos_show_bootup_logo();\r
     \r
 #ifdef SUPPORT_AT_VIBRATOR\r
     uapi_vibrator_service_init();\r
index 974c582..865e02a 100644 (file)
 #include "charge_ic.h"\r
 #endif\r
 \r
+#if defined(ENABLE_SGM41562)\r
+#include "sgm41562.h"\r
+#endif\r
+\r
 #include "vibrator_service.h"\r
 \r
 #define POWER_ON_VOLTAGE_STABILIZE_MS 1000\r
@@ -150,28 +154,23 @@ void ohos_show_bootup_logo(void)
     {\r
         #if defined(SUPPORT_BATTERY_SERVICE)\r
 \r
-        extern uint8_t get_charge_stat(void);\r
-        if(!get_charge_stat())\r
-        {\r
+        (void)charge_ic_init();\r
+        charge_ic_prepare_low_power_charge();\r
+\r
+        if (!charge_ic_is_adapter_present_retry(3, 200)) {\r
             PRINT("low power, need charge\n");\r
             uapi_tcxo_delay_ms(1000);\r
             mcu_poweroff();\r
             return;\r
         }\r
 \r
-\r
-        // hp4570n_init(HP4570N);\r
-\r
-        charge_ic_init();\r
-\r
         //显示充电图片\r
         ShowGraphicChargingLogo();\r
 \r
 \r
         while(1)\r
         {\r
-            if(!get_charge_stat())\r
-            {\r
+            if (!charge_ic_is_adapter_present()) {\r
                 PRINT("low power, need charge\n");\r
                 uapi_tcxo_delay_ms(1000);\r
                 mcu_poweroff();\r
@@ -186,15 +185,10 @@ void ohos_show_bootup_logo(void)
             if(check_power_on_voltage())\r
             {   \r
                 uapi_watchdog_kick();\r
+#if defined(ENABLE_SGM41562)\r
+                sgm41562_read_all_reg();\r
+#endif\r
                 uapi_tcxo_delay_ms(5000);\r
-// #ifdef ENABLE_HP4570\r
-//                 if (hp4570n_read_status_wdt_fault()) \r
-//                 {\r
-//                     PRINT("[battery] HP4570 WDT fault, hp4570n_reset()\r\n");\r
-//                     hp4570n_reset();\r
-//                 }\r
-//                 hp4570n_wdt_rst();\r
-// #endif\r
             }\r
             else\r
                 mcu_reset();\r
index bd9da71..b9d001d 100644 (file)
@@ -11,6 +11,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/test
 ${CMAKE_CURRENT_SOURCE_DIR}/service
 )
 set(PRIVATE_HEADER
+    ${ROOT_DIR}/zhihui/drivers/charge
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits
     ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
     ${ROOT_DIR}/application/wearable/nativeapp/nativeui/heartrate/include
index b1d271d..82ccbbd 100644 (file)
@@ -665,7 +665,11 @@ void battery_restore_vol(void)
     batteryservice_get_voltage_by_channel(&cur_vol,ADC_CHANNEL_BAT_VOLTAGE);
 
     if (bat_vol.percent > 0 && bat_vol.percent <= 100) {
-        float threshold = get_charge_stat() ? 0.4f : 0.25f;
+        uint8_t adapter_present = get_charge_stat();
+        if (!adapter_present && charge_ic_is_inited()) {
+            adapter_present = charge_ic_is_adapter_present() ? 1 : 0;
+        }
+        float threshold = adapter_present ? 0.4f : 0.25f;
         if (fabsf(cur_vol - bat_vol.avg_vol) < threshold) {
             history_percent = bat_vol.percent;
         }
index f275a91..c7c5b4e 100644 (file)
@@ -43,12 +43,11 @@ extern "C" {
 
 extern uint8_t is_doing_shutdown_or_reboot(void);
 
-#ifdef ENABLE_HP4570
-#include "hp4570.h"
+#include "charge_ic_config.h"
+
+#ifdef ENABLE_CC_CYCLE
 #include "cc_cycle_service.h"
 extern uint8_t cc_cycle_is_discharge_phase(void);
-#elif defined ENABLE_SGM41562
-#include "sgm41562.h"
 #endif
 
 #include "charge_ic.h"
@@ -60,10 +59,6 @@ extern uint8_t cc_cycle_is_discharge_phase(void);
 
 #define BAT_FILE_PATH "user/userdata/bat_data.bin"
 
-#define CHARGE_1C_MA   (256u)
-#define CHARGE_02C_MA  ((CHARGE_1C_MA * 2u) / 10u) /* 52 */
-#define CHARGE_05C_MA  ((CHARGE_1C_MA) / 2u)        /* 130 */
-
 bool batteryservice_get_voltage_by_channel(float *voltage, uint8_t channel);
 battery_info_t *get_current_battery_info(void);
 static bool g_batter_service_initialled = false;
@@ -419,7 +414,7 @@ static void battery_check_chargement(void)
     if (is_doing_shutdown_or_reboot()) {
         return;
     }
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     /* 拷机放电:Hi-Z/禁充由 cc_cycle 管;拷机充电:走正常温控与 ICHG 档位 */
     if (cc_cycle_is_discharge_phase()) {
         return;
@@ -518,33 +513,42 @@ static void battery_check_chargement(void)
                 }
                 g_chargestatus = 0;
         }else{
-                
+                uint16_t charge_1c_mA = charge_ic_get_1c_mA();
+
                 if(bat_temp >= 0 && bat_temp < 15)
                 {
-                    charge_mA = CHARGE_02C_MA;
+                    charge_mA = charge_1c_mA * 2u / 10u;
 
                 }
                 else if((bat_temp >= 15 && bat_temp < 25) || (bat_temp >= 45 && bat_temp < 60))
                 {
 
-                    charge_mA = CHARGE_05C_MA;
+                    charge_mA = charge_1c_mA / 2u;
 
                 }
                 else if(bat_temp >= 25 && bat_temp < 45)
                 {
 
-                    charge_mA = CHARGE_1C_MA;
+                    charge_mA = charge_1c_mA;
 
                 }
+                else if (bat_temp >= 60)
+                {
+                    PRINT("battery temp >= 60, disable charge !\r\n");
+                    charge_ic_set_charge_enable(false);
+                    g_chargestatus = 0;
+                    return;
+                }
+                else
+                {
+                    charge_mA = charge_1c_mA;
+                }
 
-                // if(charge_mA != last_charge_mA)
-                // {
-                //     last_charge_mA = charge_mA;
-                    // printf("last_charge_mA : %d\n",last_charge_mA);
-
-                    charge_ic_set_chrg_ichg_mA(charge_mA);
+                if (charge_mA == 0) {
+                    charge_mA = charge_1c_mA;
+                }
 
-                // }
+                charge_ic_set_chrg_ichg_mA(charge_mA);
 
                 /**
                  * check and control charge current event
@@ -716,6 +720,11 @@ static void battery_check_task(void *arg)
             battery_save_data();
 
             charge_ic_reset();
+            {
+                char reg_buf[512];
+                (void)charge_ic_dump_debug_registers(reg_buf, sizeof(reg_buf));
+                printf("[battery] charge plug reg dump:\n%s", reg_buf);
+            }
 
         }else if (mail.comm.event == BATTERY_CMD_CHARGE_UNPLUG) {
             // PRINT("[battery][service] charger_plug_event_ui_sendmsg_toUI unplugged \n");
@@ -882,8 +891,8 @@ errcode_t battery_charger_plug_event_callback(uint8_t plugged)
     if(plugged == 1){
         send_battery_svr_cmd_msg(BATTERY_CMD_CHARGE_PLUG);
         batinfo->usb_plugged = true;
-#ifdef ENABLE_HP4570
-        /* VBUS/插线状态已更新后再通知拷机,且不在本线程做 HP4570/UI */
+#ifdef ENABLE_CC_CYCLE
+        /* VBUS/插线状态已更新后再通知拷机,且不在本线程做充电 IC/UI */
         cc_cycle_on_charger_plug(1);
 #endif
     }else{
@@ -909,7 +918,7 @@ errcode_t uapi_battery_init(void)
 {
     charge_ic_init();
 
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     cc_cycle_early_boot_sync();
 #endif
     // battery_restore_vol();
index 80ccb2b..bd74aea 100644 (file)
@@ -13,6 +13,8 @@
 #include "charge_ic.h"
 #include "custom_utils.h"
 #include "errcode.h"
+#include "button_porting.h"
+#include "tcxo.h"
 
 #if defined(ENABLE_HP4570)
 #include "hp4570.h"
 #define CHARGE_IC_I2C_BUS I2C_BUS_0
 #endif
 
-#define CHARGE_1C_MA   (256u)
-
-static uint16_t last_charge_mA = 0; 
+static uint16_t last_charge_mA = 0;
 
 static charge_ic_type_t g_charge_ic_type = CHARGE_IC_TYPE_NONE;
+static bool g_charge_ic_inited = false;
+
+static void charge_ic_apply_1c_ichg(void)
+{
+    last_charge_mA = 0;
+    charge_ic_set_chrg_ichg_mA(charge_ic_get_1c_mA());
+}
 
 charge_ic_type_t charge_ic_get_type(void)
 {
     return g_charge_ic_type;
 }
 
+uint16_t charge_ic_get_1c_mA(void)
+{
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_SGM41562:
+            return CHARGE_1C_MA_SGM41562;
+        case CHARGE_IC_TYPE_HP4570:
+            return CHARGE_1C_MA_HP4570;
+        default:
+            return CHARGE_1C_MA_HP4570;
+    }
+}
+
 static charge_ic_type_t charge_ic_detect(void)
 {
 
@@ -59,8 +78,90 @@ static charge_ic_type_t charge_ic_detect(void)
     return CHARGE_IC_TYPE_NONE;
 }
 
+bool charge_ic_is_inited(void)
+{
+    return g_charge_ic_inited;
+}
+
+static bool charge_ic_read_ic_vbus_pg(void)
+{
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            return hp4570n_read_status_vbus_pg();
+#else
+            return false;
+#endif
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            return sgm41562_read_status_vbus_pg();
+#else
+            return false;
+#endif
+        default:
+            return false;
+    }
+}
+
+bool charge_ic_is_adapter_present(void)
+{
+    if (uapi_get_charger_plug_status()) {
+        return true;
+    }
+    if (!g_charge_ic_inited || g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return false;
+    }
+    return charge_ic_read_ic_vbus_pg();
+}
+
+bool charge_ic_is_adapter_present_retry(uint8_t tries, uint32_t delay_ms)
+{
+    if (tries == 0) {
+        return false;
+    }
+
+    for (uint8_t i = 0; i < tries; i++) {
+        if (charge_ic_is_adapter_present()) {
+            return true;
+        }
+        if (delay_ms > 0 && (i + 1) < tries) {
+            uapi_tcxo_delay_ms(delay_ms);
+        }
+    }
+    return false;
+}
+
+void charge_ic_prepare_low_power_charge(void)
+{
+    if (!g_charge_ic_inited || g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return;
+    }
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            (void)hp4570n_set_batfet_dis(false);
+#endif
+            break;
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            sgm41562_exit_shipmode();
+            uapi_tcxo_delay_ms(50);
+#endif
+            break;
+        default:
+            break;
+    }
+
+    charge_ic_set_charge_enable(true);
+}
+
 errcode_t charge_ic_init(void)
 {
+    if (g_charge_ic_inited) {
+        return ERRCODE_SUCC;
+    }
+
     g_charge_ic_type = CHARGE_IC_TYPE_NONE;
     custom_i2c_init(CHARGE_IC_I2C_BUS);
 
@@ -70,7 +171,7 @@ errcode_t charge_ic_init(void)
         return ERRCODE_FAIL;
     }
 
-    last_charge_mA = CHARGE_1C_MA;
+    last_charge_mA = charge_ic_get_1c_mA();
 
     switch (g_charge_ic_type) {
         case CHARGE_IC_TYPE_HP4570:
@@ -90,6 +191,9 @@ errcode_t charge_ic_init(void)
         default:
             return ERRCODE_FAIL;
     }
+
+    charge_ic_apply_1c_ichg();
+    g_charge_ic_inited = true;
     return ERRCODE_SUCC;
 }
 
@@ -212,12 +316,12 @@ uint8_t charge_ic_get_id(void)
 
 void charge_ic_reset(void)
 {
-    last_charge_mA = CHARGE_1C_MA;
-
     if (g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
         return;
     }
 
+    last_charge_mA = charge_ic_get_1c_mA();
+
     switch (g_charge_ic_type) {
         case CHARGE_IC_TYPE_HP4570:
 #if defined(ENABLE_HP4570)
@@ -232,6 +336,8 @@ void charge_ic_reset(void)
         default:
             break;
     }
+
+    charge_ic_apply_1c_ichg();
 }
 
 size_t charge_ic_dump_debug_registers(char *buf, size_t buf_len)
@@ -269,6 +375,111 @@ void charge_ic_shutdown_lpm(void)
     }
 
 #if defined(ENABLE_SGM41562)
-    sgm41562_entry_shipmode();
+    /*
+     * 用户关机须保持 BAT→SYS,MCU 才能进 ULP 且 ULP Systick 继续走时。
+     * entry_shipmode(FET_DIS) 会断电池,整机掉电,开机时间仍停在关机前时刻。
+     */
+    sgm41562_entry_shutdown_lpm();
+    sgm41562_set_batfet_dis(false);
+#endif
+}
+
+#if defined(ENABLE_CC_CYCLE)
+
+void charge_ic_set_cycle_charge_path(bool enable_charge)
+{
+    if (g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return;
+    }
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            if (enable_charge) {
+                hp4570n_set_hiz_en(false);
+                hp4570n_set_ceb_en(true);
+            } else {
+                hp4570n_set_ceb_en(false);
+                hp4570n_set_hiz_en(true);
+            }
+#endif
+            break;
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            if (enable_charge) {
+                sgm41562_exit_shipmode();
+                sgm41562_set_batfet_dis(false);
+                sgm41562_set_charge_en(false);
+                sgm41562_set_hiz_en(false);
+            } else {
+                sgm41562_set_charge_en(true);
+                sgm41562_set_hiz_en(true);
+                sgm41562_set_batfet_dis(false);
+            }
 #endif
+            break;
+        default:
+            break;
+    }
 }
+
+bool charge_ic_read_chrg_ichg_mA(uint16_t *current_mA)
+{
+    if (current_mA == NULL || g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return false;
+    }
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            return hp4570n_read_chrg_ichg_mA(current_mA);
+#else
+            return false;
+#endif
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            return sgm41562_read_chrg_ichg_mA(current_mA);
+#else
+            return false;
+#endif
+        default:
+            return false;
+    }
+}
+
+bool charge_ic_hw_is_actively_charging(void)
+{
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            if (hp4570n_read_chrg_stat_fast_chrg() || hp4570n_read_chrg_stat_pre_chrg() ||
+                hp4570n_read_chrg_stat_dead_chrg()) {
+                return true;
+            }
+            return false;
+#else
+            return false;
+#endif
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            return sgm41562_read_chrg_stat_fast_chrg() || sgm41562_read_chrg_stat_pre_chrg();
+#else
+            return false;
+#endif
+        default:
+            return false;
+    }
+}
+
+bool charge_ic_should_finish_cc_charging(uint8_t soc, uint8_t soc_full, uint8_t chg_done_min_soc)
+{
+    if (soc >= soc_full) {
+        return true;
+    }
+    if (charge_ic_check_charge_done() && soc >= chg_done_min_soc) {
+        return true;
+    }
+    return false;
+}
+
+#endif /* ENABLE_CC_CYCLE */
index b74fdf5..45cd2cb 100644 (file)
@@ -11,6 +11,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 #include "errcode.h"
+#include "charge_ic_config.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -22,6 +23,20 @@ typedef enum {
     CHARGE_IC_TYPE_SGM41562,
 } charge_ic_type_t;
 
+/** @brief 按已识别 IC 类型返回 1C 充电电流(mA),值来自 charge_ic_config.h 宏 */
+uint16_t charge_ic_get_1c_mA(void);
+
+bool charge_ic_is_inited(void);
+
+/** @brief MCU VBUS GPIO 或充电 IC PG 任一为真则视为已插适配器(需已 init) */
+bool charge_ic_is_adapter_present(void);
+
+/** @brief 多次采样适配器在位,tries 次、间隔 delay_ms */
+bool charge_ic_is_adapter_present_retry(uint8_t tries, uint32_t delay_ms);
+
+/** @brief 低电充电前:退出船运/开 BATFET 并允充 */
+void charge_ic_prepare_low_power_charge(void);
+
 errcode_t charge_ic_init(void);
 
 void charge_ic_set_charge_enable(bool enable);
@@ -43,9 +58,23 @@ charge_ic_type_t charge_ic_get_type(void);
 /** @brief 导出充电 IC 调试寄存器到 buf,返回写入字节数 */
 size_t charge_ic_dump_debug_registers(char *buf, size_t buf_len);
 
-/** @brief 关机前 SGM41562 进船运(FET_DIS);依赖开机 charge_ic_init 已识别 */
+/** @brief 关机前 41562 低功耗:禁充+HiZ,不断 BAT→SYS(保持 RTC/ULP 走时) */
 void charge_ic_shutdown_lpm(void);
 
+#if defined(ENABLE_CC_CYCLE)
+/** @brief 拷机充/放电路径:true=允充并退出 HiZ;false=禁充+HiZ(电池放电) */
+void charge_ic_set_cycle_charge_path(bool enable_charge);
+
+/** @brief 读 REG 配置的快充电流(mA) */
+bool charge_ic_read_chrg_ichg_mA(uint16_t *current_mA);
+
+/** @brief REG 状态:预充/快充进行中 */
+bool charge_ic_hw_is_actively_charging(void);
+
+/** @brief 拷机充电阶段是否应结束(SOC 满或 CHG_DONE) */
+bool charge_ic_should_finish_cc_charging(uint8_t soc, uint8_t soc_full, uint8_t chg_done_min_soc);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
index 0ffad5a..042d84a 100644 (file)
@@ -12,7 +12,9 @@ set(PRIVATE_HEADER
     ${ROOT_DIR}/zhihui/utils
     ${ROOT_DIR}/zhihui/services/battery/hal
     ${ROOT_DIR}/zhihui/services/battery/service
+    ${ROOT_DIR}/zhihui/drivers/charge
     ${ROOT_DIR}/zhihui/drivers/charge/hp4570
+    ${ROOT_DIR}/zhihui/drivers/charge/sgm41562
     ${ROOT_DIR}/zhihui/services/gnss/inc
     ${ROOT_DIR}/application/brandy/brandy_standard
     ${ROOT_DIR}/application/wearable/fd272/service/power_manager/include
index d98eb23..9b6cc9d 100644 (file)
@@ -2,6 +2,7 @@
 #include "custom_utils.h"
 #include "errcode.h"
 #include "battery_hal.h"
+#include "charge_ic_config.h"
 #include "cmsis_os2.h"
 #include "securec.h"
 #include "chip_system_time.h"
@@ -11,8 +12,8 @@
 #include <unistd.h>
 #include <time.h>
 
-#ifdef ENABLE_HP4570
-#include "hp4570.h"
+#ifdef ENABLE_CC_CYCLE
+#include "charge_ic.h"
 #include "battery_service.h"
 #include "power_display_service.h"
 #include "pm_definition.h"
 #include "pm.h"
 #endif
 
+#ifdef ENABLE_HP4570
+#include "hp4570.h"
+#endif
+
+#ifdef ENABLE_SGM41562
+#include "sgm41562.h"
+#endif
+
 #if defined(SUPPORT_GNSS)
 #include "gnss_ctl.h"
 #endif
@@ -179,14 +188,14 @@ static volatile uint8_t g_pending_charge_reconfig;
 
 static void cc_schedule_charge_reconfig(void)
 {
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     g_pending_charge_reconfig = 1;
 #endif
 }
 
 static void cc_flush_pending_charge_reconfig(void)
 {
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     if (g_pending_charge_reconfig) {
         g_pending_charge_reconfig = 0;
         battery_request_charge_reconfig();
@@ -615,16 +624,8 @@ static uint8_t cc_is_plugged(void)
  */
 static void cc_set_charge_enable(uint8_t on)
 {
-#ifdef ENABLE_HP4570
-    if (on) {
-        /* 恢复 VBUS 路径、允充;ICHG 由 battery_service 按温度/SOC 配置(非固定死 260mA) */
-        hp4570n_set_hiz_en(false);
-        hp4570n_set_ceb_en(true);
-        disable_02c();
-    } else {
-        hp4570n_set_ceb_en(false);
-        hp4570n_set_hiz_en(true);
-    }
+#ifdef ENABLE_CC_CYCLE
+    charge_ic_set_cycle_charge_path(on != 0);
 #else
     (void)on;
 #endif
@@ -640,7 +641,7 @@ static void cc_set_white_screen(uint8_t on)
     }
 }
 
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
 /* 拷机运行中:充/放电均常亮 + 禁灭屏超时;停止拷机时恢复 */
 static void cc_set_discharge_screen_hold(uint8_t on)
 {
@@ -783,9 +784,9 @@ static uint32_t cc_phase_duration_sec(uint32_t start_ts, uint32_t now)
 
 static uint8_t cc_read_charge_ic_id(void)
 {
-#ifdef ENABLE_HP4570
-    uint8_t id = hp4570n_get_id();
-    return (id == 0x2) ? 1 : 0;
+#ifdef SUPPORT_BATTERY_SERVICE
+    uint8_t id = charge_ic_get_id();
+    return (id == 0x2 || id == 0x4) ? 1 : 0;
 #else
     return 0;
 #endif
@@ -816,15 +817,42 @@ static void cc_fill_ic_status_fields(float *voltage, float *temp, uint8_t *charg
     if (charge_id != NULL) {
         *charge_id = cc_read_charge_ic_id();
     }
+#ifdef SUPPORT_BATTERY_SERVICE
+    if (charge_ic_get_type() == CHARGE_IC_TYPE_HP4570) {
 #ifdef ENABLE_HP4570
-    if (vbus_pg != NULL) {
-        *vbus_pg = hp4570n_read_status_vbus_pg() ? 1 : 0;
-    }
-    if (chrg_fast != NULL) {
-        *chrg_fast = hp4570n_read_chrg_stat_fast_chrg() ? 1 : 0;
-    }
-    if (chrg_done != NULL) {
-        *chrg_done = hp4570n_read_chrg_stat_chrg_done() ? 1 : 0;
+        if (vbus_pg != NULL) {
+            *vbus_pg = hp4570n_read_status_vbus_pg() ? 1 : 0;
+        }
+        if (chrg_fast != NULL) {
+            *chrg_fast = hp4570n_read_chrg_stat_fast_chrg() ? 1 : 0;
+        }
+        if (chrg_done != NULL) {
+            *chrg_done = hp4570n_read_chrg_stat_chrg_done() ? 1 : 0;
+        }
+#endif
+    } else if (charge_ic_get_type() == CHARGE_IC_TYPE_SGM41562) {
+#ifdef ENABLE_SGM41562
+        if (vbus_pg != NULL) {
+            *vbus_pg = sgm41562_read_status_vbus_pg() ? 1 : 0;
+        }
+        if (chrg_fast != NULL) {
+            *chrg_fast = (sgm41562_read_chrg_stat_fast_chrg() ||
+                sgm41562_read_chrg_stat_pre_chrg()) ? 1 : 0;
+        }
+        if (chrg_done != NULL) {
+            *chrg_done = sgm41562_read_chrg_stat_chrg_done() ? 1 : 0;
+        }
+#endif
+    } else {
+        if (vbus_pg != NULL) {
+            *vbus_pg = 0;
+        }
+        if (chrg_fast != NULL) {
+            *chrg_fast = 0;
+        }
+        if (chrg_done != NULL) {
+            *chrg_done = 0;
+        }
     }
 #else
     if (vbus_pg != NULL) {
@@ -866,8 +894,8 @@ static void cc_capture_defect_snapshot(uint8_t defect_type, uint8_t soc, uint32_
     snap.vbus_pg = vbus_pg;
     snap.chrg_fast = chrg_fast;
     snap.chrg_done = chrg_done;
-#ifdef ENABLE_HP4570
-    (void)hp4570n_dump_debug_registers(snap.reg_dump, sizeof(snap.reg_dump));
+#ifdef ENABLE_CC_CYCLE
+    (void)charge_ic_dump_debug_registers(snap.reg_dump, sizeof(snap.reg_dump));
 #endif
     cc_ensure_userdata_dir();
     uapi_save_file_data((char *)CC_CYCLE_DEFECT_SNAPSHOT_PATH, (uint8_t *)&snap,
@@ -887,32 +915,23 @@ static void cc_capture_defect_snapshot(uint8_t defect_type, uint8_t soc, uint32_
     cc_log_event_persist_locked(defect_name, now, soc);
 }
 
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
 static uint8_t cc_hw_is_actively_charging(void)
 {
-    if (hp4570n_read_chrg_stat_fast_chrg() || hp4570n_read_chrg_stat_pre_chrg() ||
-        hp4570n_read_chrg_stat_dead_chrg()) {
-        return 1;
-    }
-    return 0;
+    return charge_ic_hw_is_actively_charging() ? 1 : 0;
 }
 
 static uint8_t cc_should_finish_charging(uint8_t soc)
 {
-    if (soc >= CC_CYCLE_SOC_FULL) {
-        return 1;
-    }
-    if (hp4570n_read_chrg_stat_chrg_done() && soc >= CC_CYCLE_CHG_DONE_MIN_SOC) {
-        return 1;
-    }
-    return 0;
+    return charge_ic_should_finish_cc_charging(soc, CC_CYCLE_SOC_FULL,
+        CC_CYCLE_CHG_DONE_MIN_SOC) ? 1 : 0;
 }
 
 static uint16_t cc_read_configured_ichg_mA(void)
 {
     uint16_t ichg = 0;
 
-    if (hp4570n_read_chrg_ichg_mA(&ichg)) {
+    if (charge_ic_read_chrg_ichg_mA(&ichg)) {
         return ichg;
     }
     return 0;
@@ -951,7 +970,7 @@ static uint8_t cc_eval_charge_defect(uint8_t soc, uint32_t now)
         g_defect_soc_drop_base_soc = soc;
     }
 
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     if (defect == (uint8_t)CC_DEFECT_NONE && soc < CC_CYCLE_SOC_FULL) {
         uint8_t hw_chg = cc_hw_is_actively_charging();
         uint32_t chg_elapsed = 0;
@@ -1147,8 +1166,8 @@ static void cc_enter_charging_phase(void)
     }
     cc_set_charge_enable(1);
     cc_sync_discharge_soc_mode();
-#ifdef ENABLE_HP4570
-    /* 延迟到释放 cc_lock 后再重配,避免 UI 线程持锁时与 battery 任务并发访问 HP4570 */
+#ifdef ENABLE_CC_CYCLE
+    /* 延迟到释放 cc_lock 后再重配,避免 UI 线程持锁时与 battery 任务并发访问充电 IC */
     cc_schedule_charge_reconfig();
 #endif
     if (g_store.auto_running) {
@@ -1179,7 +1198,7 @@ static void cc_finish_charging_phase(uint8_t soc)
 
 static void cc_pick_initial_phase(uint8_t soc)
 {
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     if (soc >= CC_CYCLE_SOC_FULL || cc_should_finish_charging(soc)) {
         cc_enter_discharge_phase();
     } else if (soc <= CC_CYCLE_SOC_LOW) {
@@ -1205,7 +1224,7 @@ static void cc_release_hw_only_locked(void)
     cc_set_discharge_screen_hold(0);
     cc_set_charge_enable(1);
     battery_set_force_discharge_soc(0);
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     cc_schedule_charge_reconfig();
 #endif
 }
@@ -1268,7 +1287,7 @@ static void cc_tick(void)
         cc_clear_pending_charge();
         cc_clear_start_timestamps();
         battery_set_force_discharge_soc(0);
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
         cc_schedule_charge_reconfig();
 #endif
         g_pending_hide_burn_ui = 1;
@@ -1318,7 +1337,7 @@ static void cc_tick(void)
             cc_log_event_persist_locked("charge_start", now, soc);
         }
         cc_apply_charge_defect(soc, now);
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
         if (cc_should_finish_charging(soc)) {
             cc_finish_charging_phase(soc);
         }
@@ -1636,12 +1655,11 @@ uint8_t cc_cycle_get_charge_enable_intent(void)
 
 uint8_t cc_cycle_get_hw_is_charging(void)
 {
-#ifdef ENABLE_HP4570
-    if (hp4570n_read_chrg_stat_fast_chrg() || hp4570n_read_chrg_stat_pre_chrg() ||
-        hp4570n_read_chrg_stat_dead_chrg()) {
+#ifdef ENABLE_CC_CYCLE
+    if (charge_ic_hw_is_actively_charging()) {
         return 1;
     }
-    if (hp4570n_read_chrg_stat_chrg_done()) {
+    if (charge_ic_check_charge_done()) {
         return 0;
     }
 #endif
@@ -2193,10 +2211,10 @@ int cc_cycle_format_ic_status_live(char *buf, unsigned int buf_size)
     if (n < 0) {
         return 0;
     }
-#ifdef ENABLE_HP4570
+#ifdef SUPPORT_BATTERY_SERVICE
     if ((unsigned int)n < buf_size - 1) {
         size_t off = (size_t)n;
-        off += hp4570n_dump_debug_registers(buf + off, buf_size - off);
+        off += charge_ic_dump_debug_registers(buf + off, buf_size - off);
         (void)off;
     }
 #endif
@@ -2209,10 +2227,10 @@ int cc_cycle_format_ic_registers(char *buf, unsigned int buf_size)
         return 0;
     }
     buf[0] = '\0';
-#ifdef ENABLE_HP4570
-    return (int)hp4570n_dump_debug_registers(buf, buf_size);
+#ifdef SUPPORT_BATTERY_SERVICE
+    return (int)charge_ic_dump_debug_registers(buf, buf_size);
 #else
-    return snprintf_s(buf, buf_size, buf_size - 1, "HP4570 未启用");
+    return snprintf_s(buf, buf_size, buf_size - 1, "battery service 未启用");
 #endif
 }
 
index 098b6a8..182dbb1 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <stdint.h>
 #include "errcode.h"
+#include "charge_ic_config.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -27,7 +28,7 @@ typedef enum {
     CC_DEFECT_RED = 1,    /* 充电 SOC 下降 */
     CC_DEFECT_YELLOW = 2, /* 充电超 2h 未满 */
     CC_DEFECT_BLUE = 3,   /* SOC 卡在 ~80% */
-    CC_DEFECT_LOW_ICHG = 4, /* HP4570 配置 ICHG 持续过低(如10mA级) */
+    CC_DEFECT_LOW_ICHG = 4, /* 配置 ICHG 持续过低(如10mA级) */
     CC_DEFECT_HW_NO_CHG = 5, /* 拷机充电阶段 HW 未充且 SOC 长时间不涨 */
 } cc_cycle_defect_type_e;
 
@@ -63,10 +64,10 @@ uint16_t cc_cycle_get_round_count(void);
 uint8_t cc_cycle_get_soc(void);
 /* 软件意图:放电阶段为0(禁充),充电阶段为1(允充) */
 uint8_t cc_cycle_get_charge_enable_intent(void);
-/* HP4570 硬件充电状态:1=预充/快充中 */
+/* 硬件充电状态:1=预充/快充中 */
 uint8_t cc_cycle_get_hw_is_charging(void);
 uint8_t cc_cycle_is_active(void);
-/* 拷机开关开且已运行:允许控制 HP4570/GPS/常亮/SOC 特殊模式 */
+/* 拷机开关开且已运行:允许控制充电 IC/GPS/常亮/SOC 特殊模式 */
 uint8_t cc_cycle_is_active_hw(void);
 /* 仅放电阶段:拷机需接管 Hi-Z/禁充;充电阶段交还 battery_service 管电流 */
 uint8_t cc_cycle_is_discharge_phase(void);
@@ -110,7 +111,7 @@ uint8_t cc_cycle_take_defect_alarm(void);
 int cc_cycle_read_defect_snapshot(cc_cycle_defect_snapshot_t *out);
 /* 实时 IC 状态文本,buf 建议>=512 字节 */
 int cc_cycle_format_ic_status_live(char *buf, unsigned int buf_size);
-/* 仅 HP4570 寄存器 dump,与 Debug 页一致,buf 建议>=2048 字节 */
+/* 充电 IC 寄存器 dump,buf 建议>=2048 字节 */
 int cc_cycle_format_ic_registers(char *buf, unsigned int buf_size);
 
 #define CC_CYCLE_HISTORY_BUF_RECOMMEND 4096u
index afb00c1..d7a319c 100644 (file)
@@ -89,7 +89,8 @@ struct timezone {
 
 #include "custom_utils.h"
 #include "custom_save_runtime.h"
-#ifdef ENABLE_HP4570
+#include "charge_ic_config.h"
+#ifdef ENABLE_CC_CYCLE
 #include "cc_cycle_service.h"
 #endif
 
@@ -546,7 +547,7 @@ void shutdown_reboot_prejobs(uint8_t type)
 void start_shutdown_or_reboot(uint8_t type)
 {
     PRINT("[PWR_FLOW] start_shutdown_or_reboot: type=%d (prev=%d)\r\n", type, doing_shutdown_type);
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     cc_cycle_prepare_for_shutdown();
 #endif
     doing_shutdown_type = type;
@@ -903,7 +904,7 @@ if (custom_get_factory_test_flag() != 0 ) {
 
 #endif
 
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     cc_cycle_on_boot();
 #endif
 }
@@ -2573,7 +2574,7 @@ void uapi_restore_factory_setting(void)
     //恢复存储
     resume_report_log();
 
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     cc_cycle_clear_storage();
 #endif
     
@@ -2619,7 +2620,7 @@ void uapi_restore_factory_setting_and_shutdown(void)
     //恢复存储
     resume_report_log();
 
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
     cc_cycle_clear_storage();
 #endif