充电IC自动识别切换不同配置,对话提供公共接口 3447/1
author1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Tue, 9 Jun 2026 06:24:31 +0000 (14:24 +0800)
committer1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Tue, 9 Jun 2026 06:24:31 +0000 (14:24 +0800)
15 files changed:
code/sdk/application/wearable/fd272/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp
code/sdk/application/wearable/ohos_startup/ohosfwk_startup.c
code/sdk/build/config/target_config/brandy/config.py
code/sdk/zhihui/UI/producttest/src/testchanging.cpp
code/sdk/zhihui/drivers/charge/CMakeLists.txt
code/sdk/zhihui/drivers/charge/hp4570/hp4570.c
code/sdk/zhihui/drivers/charge/hp4570/hp4570.h
code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c
code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h
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 [new file with mode: 0644]
code/sdk/zhihui/services/battery/service/charge_ic.h [new file with mode: 0644]
code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c

index fae7209..d6f7b50 100644 (file)
@@ -63,7 +63,7 @@
 #include "battery_service.h"
 #if defined(ENABLE_HP4570)
 extern "C" {
-#include "hp4570.h"
+#include "charge_ic.h"
 }
 #endif
 #endif
@@ -904,12 +904,12 @@ namespace OHOS
 
     std::string DebugOutputViewEventListener::get_hp4570_register_dump(void)
     {
-#if defined(SUPPORT_BATTERY_SERVICE) && defined(ENABLE_HP4570)
+#if defined(SUPPORT_BATTERY_SERVICE)
         char buf[2048];
-        (void)hp4570n_dump_debug_registers(buf, sizeof(buf));
+        (void)charge_ic_dump_debug_registers(buf, sizeof(buf));
         return std::string(buf);
 #else
-        return "HP4570 未启用(需 SUPPORT_BATTERY_SERVICE + ENABLE_HP4570)";
+        return "充电 IC 未启用(需 SUPPORT_BATTERY_SERVICE)";
 #endif
     }
 
index 96a9647..974c582 100644 (file)
 \r
 #if defined(SUPPORT_BATTERY_SERVICE)\r
 #include "battery_service.h"\r
+#include "charge_ic.h"\r
 #endif\r
 \r
-#ifdef ENABLE_HP4570\r
-#include "hp4570.h"\r
-#endif\r
 #include "vibrator_service.h"\r
 \r
 #define POWER_ON_VOLTAGE_STABILIZE_MS 1000\r
@@ -161,9 +159,11 @@ void ohos_show_bootup_logo(void)
             return;\r
         }\r
 \r
-        #ifdef ENABLE_HP4570\r
-        hp4570n_init(HP4570N);\r
-        #endif\r
+\r
+        // hp4570n_init(HP4570N);\r
+\r
+        charge_ic_init();\r
+\r
         //显示充电图片\r
         ShowGraphicChargingLogo();\r
 \r
@@ -187,14 +187,14 @@ void ohos_show_bootup_logo(void)
             {   \r
                 uapi_watchdog_kick();\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
+// #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 c1ceb6e..1006a59 100644 (file)
@@ -1162,7 +1162,7 @@ target = {
             'PPG_HX3695',
             'ROTARYENCODER_HX3508',
             'ENABLE_HP4570',
-            # 'ENABLE_SGM41562',
+            'ENABLE_SGM41562',
             '-:SUPPORT_ALIPAY_SEC',
         ],
         #添加自定义应用
index 0833dcc..a2fe31e 100644 (file)
@@ -6,6 +6,7 @@
 
 #ifdef SUPPORT_BATTERY_SERVICE
 #include "battery_hal.h"
+#include "charge_ic.h"
 #endif
 
 #include "producttest/include/testView.h"
@@ -20,9 +21,7 @@ extern "C"
 #endif
     #include "pm_veto.h"
     #include "pm.h"
-#ifdef ENABLE_HP4570
-    #include "hp4570.h"
-#endif
+
 #ifdef __cplusplus
 #if __cplusplus
 }
@@ -223,8 +222,6 @@ namespace OHOS
         power = battery_get_voltage(&voltage);
         battery_get_pcb_temp(&pcb_temp);
         battery_get_battery_temp(&bat_temp);
-#endif
-#ifdef ENABLE_HP4570
 
         charge_id = GetChargeId();
 #endif
@@ -291,8 +288,11 @@ namespace OHOS
 
     uint8_t testCHANINGView::GetChargeId(void)
     {
-        uint8_t charge_id = hp4570n_get_id();
-        if(0x2 == charge_id)
+        uint8_t charge_id = 0;
+
+        charge_id = charge_ic_get_id();
+
+        if(0x2 == charge_id || 0x4 == charge_id)
         {
             return 1;
         }
index f3cbc4d..b4834cb 100644 (file)
@@ -4,47 +4,19 @@
 #===============================================================================
 set(COMPONENT_NAME "charge")
 
-if("ENABLE_HP4570" IN_LIST DEFINES)
 set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/hp4570/hp4570.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/service/charge_at_cmd.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/service/charge_service.c
-)
-
-elseif("ENABLE_SGM41562" IN_LIST DEFINES)
-set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/sgm41562/sgm41562.c
     ${CMAKE_CURRENT_SOURCE_DIR}/service/charge_at_cmd.c
     ${CMAKE_CURRENT_SOURCE_DIR}/service/charge_service.c
 )
 
-else()
-set(SOURCES
-    ${CMAKE_CURRENT_SOURCE_DIR}/service/charge_at_cmd.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/service/charge_service.c
-)
-endif()
-
-if("ENABLE_HP4570" IN_LIST DEFINES)
 set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/hp4570
-    ${CMAKE_CURRENT_SOURCE_DIR}/service
-)
-elseif("ENABLE_SGM41562" IN_LIST DEFINES)
-
-set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/sgm41562
     ${CMAKE_CURRENT_SOURCE_DIR}/service
 )
 
-else()
-
-set(PUBLIC_HEADER
-    ${CMAKE_CURRENT_SOURCE_DIR}/service
-)
-
-endif()
-
 set(PRIVATE_HEADER
 )
 
index c901841..cd4e9f5 100644 (file)
@@ -177,8 +177,8 @@ bool hp4570n_init(uint8_t chip_ver){
   ret = hp4570n_set_low_chrg_ipre_mA(30);\r
   printf("hp4570n_set_low_chrg_ipre_mA(30) ret:%d\n",ret);\r
 \r
-  ret = hp4570n_set_chrg_ichg_mA(260);\r
-  printf("hp4570n_set_chrg_ichg_mA(260) ret:%d\n",ret);\r
+  ret = hp4570n_set_chrg_ichg_mA(256);\r
+  printf("hp4570n_set_chrg_ichg_mA(256) ret:%d\n",ret);\r
 \r
   ret = hp4570n_set_chrg_iterm_mA(30);\r
   printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret);\r
@@ -199,6 +199,7 @@ bool hp4570n_init(uint8_t chip_ver){
 \r
   hp4570n_set_rst_vsys_wvbus_en(false);\r
 \r
+  hp4570n_set_wdt_timer_en(false);\r
 \r
 #if 0\r
   uint8_t value = 0;\r
@@ -1081,8 +1082,8 @@ void hp4570n_reset(void)
   ret = hp4570n_set_low_chrg_ipre_mA(30);\r
   printf("hp4570n_set_low_chrg_ipre_mA(30) ret:%d\n",ret);\r
 \r
-  ret = hp4570n_set_chrg_ichg_mA(260);\r
-  printf("hp4570n_set_chrg_ichg_mA(260) ret:%d\n",ret);\r
+  ret = hp4570n_set_chrg_ichg_mA(256);\r
+  printf("hp4570n_set_chrg_ichg_mA(256) ret:%d\n",ret);\r
 \r
   ret = hp4570n_set_chrg_iterm_mA(30);\r
   printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret);\r
@@ -1102,4 +1103,6 @@ void hp4570n_reset(void)
   hp4570n_set_vindpm_en(true);\r
 \r
   hp4570n_set_rst_vsys_wvbus_en(false);\r
+\r
+  hp4570n_set_wdt_timer_en(false);\r
 }
\ No newline at end of file
index 7e95e9f..8b48d09 100644 (file)
 #include <stdbool.h>\r
 #include "std_def.h"\r
 \r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
 // for example\r
 // Avoid using "X", x stands for General Condition\r
 enum hp4570n_chip_ver {\r
@@ -527,4 +531,8 @@ uint8_t hp4570n_get_id(void);
 \r
 void hp4570n_reset(void);\r
 \r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
 #endif // HP4570N_CHARGER_H
\ No newline at end of file
index ffd12c6..f3df6f7 100644 (file)
@@ -1,4 +1,6 @@
 
+#include <stdio.h>
+
 #include "sgm41562.h"
 #include "custom_utils.h"
 
@@ -100,11 +102,11 @@ static int __sgm41562_read_byte( uint8_t reg, uint8_t *data)
     //     return ret;
     // }
 
-       custom_i2c_read_regs(0x03, reg, 1, data, 1, I2C_BUS);
+       ret = custom_i2c_read_regs(0x03, reg, 1, data, 1, I2C_BUS);
 
     // *data = (uint8_t) ret;
 
-    return 0;
+    return ret;
 }
 
 static int __sgm41562_write_byte( int reg, uint8_t val)
@@ -118,9 +120,9 @@ static int __sgm41562_write_byte( int reg, uint8_t val)
     //     return ret;
     // }
 
-       custom_i2c_write_reg(0x03, reg, 1, &val, 1, I2C_BUS);
+       ret = custom_i2c_write_reg(0x03, reg, 1, &val, 1, I2C_BUS);
 
-    return 0;
+    return ret;
 }
 
 static int sgm41562_read_reg( uint8_t reg, uint8_t *data)
@@ -556,6 +558,50 @@ void sgm41562_wdt_rst(void)
        (void)sgm41562_ctrl_setting(REG_BIT_WD_RST, true);
 }
 
+void sgm41562_set_charge_en(bool en)
+{
+       (void)sgm41562_ctrl_setting(REG_BIT_EN_CEB, en);
+}
+
+void sgm41562_set_batfet_dis(bool en)
+{
+       (void)sgm41562_ctrl_setting(REG_BIT_FET_DIS, en);
+}
+
+bool sgm41562_set_chrg_ichg_mA(uint16_t current_mA)
+{
+       printf("current_mA : %d\n",current_mA);
+       int ret = sgm41562_set_fast_cc((int)current_mA * 1000);
+
+       return (ret == 0);
+}
+
+bool sgm41562_read_chrg_stat_chrg_done(void)
+{
+       uint8_t chrg_stat = 0;
+
+       if (sgm41562_read_reg(SGM41562_CHRG_REG_8, &chrg_stat) != 0) {
+               return false;
+       }
+       return (chrg_stat & SGM41562_CHG_STAT_MASK) == SGM41562_TERM_CHRG;
+}
+
+uint8_t sgm41562_get_id(void)
+{
+       uint8_t val = 0;
+
+       if (sgm41562_read_reg(SGM41562_CHRG_REG_B, &val) != 0) {
+               return 0;
+       }
+       return val;
+}
+
+void sgm41562_reset(void)
+{
+       // (void)sgm41562_ctrl_setting(REG_BIT_REG_RST, true);
+       (void)sgm41562_hw_init();
+}
+
 static int sgm41562_get_state(
                             struct sgm41562_state *state)
 {
@@ -995,7 +1041,7 @@ static int sgm41562_hw_chipid_detect(void)
     uint8_t val = 0;
        
        ret = sgm41562_read_reg(SGM41562_CHRG_REG_B,&val);
-       if (ret < 0) {
+       if (ret) {
                printf("[%s] read SGM41562_CHRG_REG_B fail\n", __func__);
                return ret;
        }
@@ -1015,6 +1061,10 @@ static int sgm41562_hw_chipid_detect(void)
        return ret;
 }
 
+bool sgm41562_probe(void)
+{
+       return sgm41562_hw_chipid_detect() == 0;
+}
 
 int sgm41562_hw_init(void)
 {
@@ -1031,8 +1081,6 @@ int sgm41562_hw_init(void)
        //      uint32_t max_vreg;
        // };
 
-       custom_i2c_init(I2C_BUS);
-
        ret = sgm41562_hw_chipid_detect();      
        if(ret){
                printf("[%s] device not found !!!\n", __func__);
@@ -1043,7 +1091,7 @@ int sgm41562_hw_init(void)
 
        struct sgm41562_init_data data = {0};
 
-       data.ichg      = 256000;
+       data.ichg      = 256 * 1000;
        data.vreg      = SGM41562_VBAT_REG_DEF_uV;
        data.iterm     = SGM41562_TERM_I_DEF_uA;
        data.vlim      = SGM41562_VINDPM_DEF_uV;
@@ -1080,15 +1128,19 @@ int sgm41562_hw_init(void)
        if (ret)
                goto err_out;
 
+       //关闭NTC
+       // ret = sgm41562_ctrl_setting(REG_BIT_EN_NTC, false);
+       // if (ret)
+       //      goto err_out;
        ret = sgm41562_ctrl_setting(REG_BIT_EN_CEB, 0);
        if (ret)
                goto err_out;
 
-       printf("ichrg:%d uA, chrg_vol:%d uV, input_limit:%d uA\n",
-                       data.ichg, data.vreg, data.ilim);
+       // printf("ichrg:%d uA, chrg_vol:%d uV, input_limit:%d uA\n",
+       //              data.ichg, data.vreg, data.ilim);
 
 
-       // static int sgm41562_read_reg( uint8_t reg, uint8_t *data);
+#if 0
        uint8_t reg_data = 0;
 
        sgm41562_read_reg(SGM41562_CHRG_REG_0,&reg_data);
@@ -1132,7 +1184,7 @@ int sgm41562_hw_init(void)
 
        sgm41562_read_reg(SGM41562_CHRG_REG_D,&reg_data);
        printf("SGM41562_CHRG_REG_D :0x%x\n",reg_data);
-
+#endif
        return 0;
 
 err_out:
@@ -1342,49 +1394,61 @@ static void sgm41562_charger_shutdown(void)
     printf("sgm41562_charger_shutdown\n");
 }
 
-void sgm41562_read_all_reg(void)
+size_t sgm41562_dump_debug_registers(char *buf, size_t buf_len)
 {
-       uint8_t reg_data = 0;
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_0,&reg_data);
-       printf("SGM41562_CHRG_REG_0 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_1,&reg_data);
-       printf("SGM41562_CHRG_REG_1 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_2,&reg_data);
-       printf("SGM41562_CHRG_REG_2 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_3,&reg_data);
-       printf("SGM41562_CHRG_REG_3 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_4,&reg_data);
-       printf("SGM41562_CHRG_REG_4 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_5,&reg_data);
-       printf("SGM41562_CHRG_REG_5 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_6,&reg_data);
-       printf("SGM41562_CHRG_REG_6 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_7,&reg_data);
-       printf("SGM41562_CHRG_REG_7 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_8,&reg_data);
-       printf("SGM41562_CHRG_REG_8 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_9,&reg_data);
-       printf("SGM41562_CHRG_REG_9 :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_A,&reg_data);
-       printf("SGM41562_CHRG_REG_A :0x%x\n",reg_data);
-
-       sgm41562_read_reg(SGM41562_CHRG_REG_B,&reg_data);
-       printf("SGM41562_CHRG_REG_B :0x%x\n",reg_data);
+       static const struct {
+               uint8_t reg;
+               const char *name;
+       } rows[] = {
+               { SGM41562_CHRG_REG_0, "CHRG_REG_0" },
+               { SGM41562_CHRG_REG_1, "CHRG_REG_1" },
+               { SGM41562_CHRG_REG_2, "CHRG_REG_2" },
+               { SGM41562_CHRG_REG_3, "CHRG_REG_3" },
+               { SGM41562_CHRG_REG_4, "CHRG_REG_4" },
+               { SGM41562_CHRG_REG_5, "CHRG_REG_5" },
+               { SGM41562_CHRG_REG_6, "CHRG_REG_6" },
+               { SGM41562_CHRG_REG_7, "CHRG_REG_7" },
+               { SGM41562_CHRG_REG_8, "CHRG_REG_8" },
+               { SGM41562_CHRG_REG_9, "CHRG_REG_9" },
+               { SGM41562_CHRG_REG_A, "CHRG_REG_A" },
+               { SGM41562_CHRG_REG_B, "CHRG_REG_B" },
+               { SGM41562_CHRG_REG_C, "CHRG_REG_C" },
+               { SGM41562_CHRG_REG_D, "CHRG_REG_D" },
+       };
+
+       if (buf == NULL || buf_len == 0) {
+               return 0;
+       }
+       buf[0] = '\0';
+       size_t off = 0;
+       for (size_t i = 0; i < sizeof(rows) / sizeof(rows[0]); i++) {
+               uint8_t v = 0;
+               int n;
+               int rc = sgm41562_read_reg(rows[i].reg, &v);
+               if (rc == 0) {
+                       n = snprintf(buf + off, buf_len - off, "%s(0x%02x):0x%02x\n",
+                                    rows[i].name, (unsigned int)rows[i].reg, v);
+               } else {
+                       n = snprintf(buf + off, buf_len - off, "%s(0x%02x):read fail(0x%x)\n",
+                                    rows[i].name, (unsigned int)rows[i].reg, (unsigned int)rc);
+               }
+               if (n < 0) {
+                       break;
+               }
+               if ((size_t)n >= buf_len - off) {
+                       off = buf_len - 1;
+                       break;
+               }
+               off += (size_t)n;
+       }
+       buf[buf_len - 1] = '\0';
+       return off;
+}
 
-       sgm41562_read_reg(SGM41562_CHRG_REG_C,&reg_data);
-       printf("SGM41562_CHRG_REG_C :0x%x\n",reg_data);
+void sgm41562_read_all_reg(void)
+{
+       char buf[512];
 
-       sgm41562_read_reg(SGM41562_CHRG_REG_D,&reg_data);
-       printf("SGM41562_CHRG_REG_D :0x%x\n",reg_data);
+       (void)sgm41562_dump_debug_registers(buf, sizeof(buf));
+       printf("%s", buf);
 }
index 9250c29..e5e357b 100644 (file)
@@ -1,10 +1,15 @@
 #ifndef SGM41562_CHARGER_H\r
 #define SGM41562_CHARGER_H\r
 \r
-#include <stdint.h>\r
 #include <stdbool.h>\r
+#include <stddef.h>\r
+#include <stdint.h>\r
 #include "std_def.h"\r
 \r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
 #ifndef GENMASK\r
 #define GENMASK(h, l) (((uint8_t) -1 >> (7 - (h))) & ~((1U << (l)) - 1))\r
 #endif\r
@@ -258,8 +263,34 @@ struct sgm41562_state {
 \r
 int sgm41562_hw_init(void);\r
 \r
+bool sgm41562_probe(void);\r
+\r
 void sgm41562_read_all_reg(void);\r
 \r
+size_t sgm41562_dump_debug_registers(char *buf, size_t buf_len);\r
+\r
 void sgm41562_wdt_rst(void);\r
 \r
+void sgm41562_set_charge_en(bool en);\r
+\r
+void sgm41562_set_batfet_dis(bool en);\r
+\r
+/**\r
+ * @brief 关机低功耗配置;默认仅调寄存器降压不降 Qswitch。\r
+ *        定义 SGM41562_USE_FET_DIS_SHIP=1 且 nINT 有外部上拉时才置 FET_DIS 进船运。\r
+ */\r
+void sgm41562_entry_shipmode(void);\r
+\r
+bool sgm41562_set_chrg_ichg_mA(uint16_t current_mA);\r
+\r
+bool sgm41562_read_chrg_stat_chrg_done(void);\r
+\r
+uint8_t sgm41562_get_id(void);\r
+\r
+void sgm41562_reset(void);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
 #endif /* _SGM41562_CHARGER_H */\r
index 7d92711..24c87cd 100644 (file)
@@ -17,6 +17,7 @@ set(PRIVATE_HEADER
 )
 
 set(SOURCES
+${CMAKE_CURRENT_SOURCE_DIR}/service/charge_ic.cpp
 ${CMAKE_CURRENT_SOURCE_DIR}/service/battery_driver.cpp
 ${CMAKE_CURRENT_SOURCE_DIR}/service/battery_service.cpp
 ${CMAKE_CURRENT_SOURCE_DIR}/test/battery_at_cmd.cpp
index 30b4f61..7159db3 100644 (file)
@@ -73,15 +73,14 @@ typedef enum {
 // #include "cat1_utils.h"
 #include <math.h>
 // #include "custom_save_runtime.h"
-#ifdef ENABLE_HP4570
-#include "hp4570.h"
-/** CHG_DONE 且电压不升:连续次数达标后才允许 +1%(周期约 40s 时 3 次≈2min 量级到首次 +1,可调) */
-#define HP4570_CHG_DONE_FLAT_STREAK 3u
-/** 与 ADC/线损及 OCV 曲线对齐:≥4.2 即视为已处尾段;仍依赖 CHG_DONE + 电压不升,不单凭电压 */
-#define HP4570_CHG_DONE_MIN_VOLTAGE_V (4.2f)
-#endif
+
+#include "charge_ic.h"
 #include "custom_utils.h"
 
+/** CHG_DONE 且电压不升:连续次数达标后才允许 +1% */
+#define CHG_DONE_FLAT_STREAK 3u
+#define CHG_DONE_MIN_VOLTAGE_V (4.2f)
+
 #define AVG_VOLTAGE_COUNT         7
 /** 滑动平均:仅接受该区间内的采样;历史槽中若出现非 0 且越界视为异常并清空环形缓冲 */
 #define BAT_AVG_SAMPLE_VOL_MIN    (3.25f)
@@ -766,55 +765,51 @@ static uint8_t battery_get_power_percentage(void)
     return percent;
 }
 
-#ifdef ENABLE_HP4570
-
-static bool hp4570_check_charge_done(float voltage, int *percent)
+static bool battery_check_charge_done(float voltage, int *percent)
 {
-    static float s_hp4570_chg_done_last_v = -1.0f;
-    static uint8_t s_hp4570_chg_done_flat_cnt = 0;
-    const float k_chg_done_floor_v = HP4570_CHG_DONE_MIN_VOLTAGE_V;
-    const float k_flat_eps_v = 0.0015f; /* 噪声内视为“未升” */
-
-    if (!get_charge_stat() || voltage < k_chg_done_floor_v) {
-        s_hp4570_chg_done_last_v = -1.0f;
-        s_hp4570_chg_done_flat_cnt = 0;
+    static float s_chg_done_last_v = -1.0f;
+    static uint8_t s_chg_done_flat_cnt = 0;
+    const float k_flat_eps_v = 0.0015f;
+
+    if (!get_charge_stat() || voltage < CHG_DONE_MIN_VOLTAGE_V) {
+        s_chg_done_last_v = -1.0f;
+        s_chg_done_flat_cnt = 0;
         return false;
     }
-    if (!hp4570n_read_chrg_stat_chrg_done()) {
-        s_hp4570_chg_done_last_v = -1.0f;
-        s_hp4570_chg_done_flat_cnt = 0;
+    if (!charge_ic_check_charge_done()) {
+        s_chg_done_last_v = -1.0f;
+        s_chg_done_flat_cnt = 0;
         return false;
     }
 
-    if (s_hp4570_chg_done_last_v < 0.0f) {
-        s_hp4570_chg_done_last_v = voltage;
-        s_hp4570_chg_done_flat_cnt = 0;
+    if (s_chg_done_last_v < 0.0f) {
+        s_chg_done_last_v = voltage;
+        s_chg_done_flat_cnt = 0;
     } else {
-        if (voltage <= s_hp4570_chg_done_last_v + k_flat_eps_v) {
-            if (s_hp4570_chg_done_flat_cnt < 250) {
-                s_hp4570_chg_done_flat_cnt++;
+        if (voltage <= s_chg_done_last_v + k_flat_eps_v) {
+            if (s_chg_done_flat_cnt < 250) {
+                s_chg_done_flat_cnt++;
             }
         } else {
-            s_hp4570_chg_done_flat_cnt = 0;
+            s_chg_done_flat_cnt = 0;
         }
-        s_hp4570_chg_done_last_v = voltage;
+        s_chg_done_last_v = voltage;
     }
 
-    if (s_hp4570_chg_done_flat_cnt >= HP4570_CHG_DONE_FLAT_STREAK && history_percent < 100) {
+    if (s_chg_done_flat_cnt >= CHG_DONE_FLAT_STREAK && history_percent < 100) {
         history_percent++;
         *percent = history_percent;
-        printf("[电池计算] HP4570 CHG_DONE+>=%.1fV 连续电压不升 cnt=%u(>=%u) -> 累加 %% hist=%d\n",
-            HP4570_CHG_DONE_MIN_VOLTAGE_V,
-            (unsigned int)s_hp4570_chg_done_flat_cnt, (unsigned int)HP4570_CHG_DONE_FLAT_STREAK, history_percent);
+        printf("[电池计算] CHG_DONE+>=%.1fV 连续电压不升 cnt=%u(>=%u) -> 累加 %% hist=%d\n",
+            CHG_DONE_MIN_VOLTAGE_V,
+            (unsigned int)s_chg_done_flat_cnt, (unsigned int)CHG_DONE_FLAT_STREAK, history_percent);
         if (history_percent >= 100) {
-            s_hp4570_chg_done_flat_cnt = 0;
-            s_hp4570_chg_done_last_v = -1.0f;
+            s_chg_done_flat_cnt = 0;
+            s_chg_done_last_v = -1.0f;
         }
         return true;
     }
     return false;
 }
-#endif
 
 /**
  * 输入电池电压值 
@@ -962,11 +957,9 @@ static int battery_get_percent_by_voltage(float voltage)
         }
     }
 
-#ifdef ENABLE_HP4570
-    if (hp4570_check_charge_done(voltage, &percent)) {
+    if (battery_check_charge_done(voltage, &percent)) {
         return percent;
     }
-#endif
 
     return percent;
 }
index 44364c4..2781b00 100644 (file)
@@ -41,12 +41,13 @@ extern "C" {
 
 #include "debug_print.h"
 
-#ifdef ENABLE_HP4570
-#include "hp4570.h"
-#elif defined ENABLE_SGM41562
-#include "sgm41562.h"
-#endif
+// #ifdef ENABLE_HP4570
+// #include "hp4570.h"
+// #elif defined ENABLE_SGM41562
+// #include "sgm41562.h"
+// #endif
 
+#include "charge_ic.h"
 // #include "cat1_utils.h"
 
 // #include "cywee_service.h"
@@ -55,7 +56,7 @@ extern "C" {
 
 #define BAT_FILE_PATH "user/userdata/bat_data.bin"
 
-#define CHARGE_1C_MA   (260u)
+#define CHARGE_1C_MA   (256u)
 #define CHARGE_02C_MA  ((CHARGE_1C_MA * 2u) / 10u) /* 52 */
 #define CHARGE_05C_MA  ((CHARGE_1C_MA) / 2u)        /* 130 */
 
@@ -455,40 +456,39 @@ static void battery_check_chargement(void)
                 // if(g_chargestatus != 0)
                 {
                     printf("hp4570_set_ceb_en(false); \n");
-                    #ifdef ENABLE_HP4570
-                    hp4570n_set_ceb_en(false);
-                    #endif
+
+                    charge_ic_set_charge_enable(false);
+
                 }
                 g_chargestatus = 0;
         }else{
                 
                 if(bat_temp >= 0 && bat_temp < 15)
                 {
-                    #ifdef ENABLE_HP4570
                     charge_mA = CHARGE_02C_MA;
-                    #endif
+
                 }
                 else if((bat_temp >= 15 && bat_temp < 25) || (bat_temp >= 45 && bat_temp < 60))
                 {
-                    #ifdef ENABLE_HP4570
+
                     charge_mA = CHARGE_05C_MA;
-                    #endif
+
                 }
                 else if(bat_temp >= 25 && bat_temp < 45)
                 {
-                    #ifdef ENABLE_HP4570
+
                     charge_mA = CHARGE_1C_MA;
-                    #endif
+
                 }
 
-                if(charge_mA != last_charge_mA)
-                {
-                    last_charge_mA = charge_mA;
+                // if(charge_mA != last_charge_mA)
+                // {
+                //     last_charge_mA = charge_mA;
                     // printf("last_charge_mA : %d\n",last_charge_mA);
-                    #ifdef ENABLE_HP4570
-                    hp4570n_set_chrg_ichg_mA(last_charge_mA);
-                    #endif
-                }
+
+                    charge_ic_set_chrg_ichg_mA(charge_mA);
+
+                // }
 
                 /**
                  * check and control charge current event
@@ -500,9 +500,9 @@ static void battery_check_chargement(void)
                 if(g_chargestatus == 0)
                 {
                     printf("hp4570_set_ceb_en(true) \n");
-                    #ifdef ENABLE_HP4570
-                        hp4570n_set_ceb_en(true);
-                    #endif
+
+                    charge_ic_set_charge_enable(true);
+
                 }
                 enable_charge(); 
 
@@ -592,29 +592,29 @@ static void battery_check_task(void *arg)
 
 
 
-            if (get_charge_stat() == 1) 
-            {
-                g_charge_wdt_sec_counter++;
-                if (g_charge_wdt_sec_counter >= WDT_KICK_INTERVAL_SEC) 
-                {
-                    g_charge_wdt_sec_counter = 0;
-#if defined(ENABLE_HP4570)
-                    // PRINT("[battery] HP4570 WDT fault :%d\r\n",hp4570n_read_status_wdt_fault());
-                    if (hp4570n_read_status_wdt_fault()) 
-                    {
-                        PRINT("[battery] HP4570 WDT fault, hp4570n_reset()\r\n");
-                        hp4570n_reset();
-                    }
-                    hp4570n_wdt_rst();
-                    // PRINT("hp4570n_wdt_rst\r\n");
-#elif defined(ENABLE_SGM41562)
-                    sgm41562_wdt_rst();
-#endif
-                }
-            }
-             else {
-                g_charge_wdt_sec_counter = 0;
-            }
+//             if (get_charge_stat() == 1) 
+//             {
+//                 g_charge_wdt_sec_counter++;
+//                 if (g_charge_wdt_sec_counter >= WDT_KICK_INTERVAL_SEC) 
+//                 {
+//                     g_charge_wdt_sec_counter = 0;
+// #if defined(ENABLE_HP4570)
+//                     // PRINT("[battery] HP4570 WDT fault :%d\r\n",hp4570n_read_status_wdt_fault());
+//                     if (hp4570n_read_status_wdt_fault()) 
+//                     {
+//                         PRINT("[battery] HP4570 WDT fault, hp4570n_reset()\r\n");
+//                         hp4570n_reset();
+//                     }
+//                     hp4570n_wdt_rst();
+//                     // PRINT("hp4570n_wdt_rst\r\n");
+// // #elif defined(ENABLE_SGM41562)
+// //                     sgm41562_wdt_rst();
+// #endif
+//                 }
+//             }
+//              else {
+//                 g_charge_wdt_sec_counter = 0;
+//             }
 
 
             g_check_count++;
@@ -657,9 +657,9 @@ static void battery_check_task(void *arg)
             charger_plug_event_ui_sendmsg_toUI(1);
             // 记录一次充电线插入时刻的电池数据,用于后续统计充电时间
             battery_save_data();
-#ifdef ENABLE_HP4570
-            hp4570n_reset();
-#endif
+
+            charge_ic_reset();
+
         }else if (mail.comm.event == BATTERY_CMD_CHARGE_UNPLUG) {
             // PRINT("[battery][service] charger_plug_event_ui_sendmsg_toUI unplugged \n");
             oncharging_status = 0;
@@ -840,12 +840,8 @@ void uapi_battery_create_queue(void)
 #define BATTERY_TASK_SIZE 0x1C00
 errcode_t uapi_battery_init(void)
 {
-       
-#ifdef ENABLE_HP4570
-    hp4570n_init(HP4570N);
-#elif defined ENABLE_SGM41562
-    sgm41562_hw_init();
-#endif
+    charge_ic_init();
+
     // battery_restore_vol();
     battery_check_voltage();
     battery_percent_init(0); //先读历史电量
diff --git a/code/sdk/zhihui/services/battery/service/charge_ic.cpp b/code/sdk/zhihui/services/battery/service/charge_ic.cpp
new file mode 100644 (file)
index 0000000..ca89491
--- /dev/null
@@ -0,0 +1,260 @@
+/**
+ * Copyright (c) @CompanyNameMagicTag 2022-2026. All rights reserved.
+ *
+ * @brief I2C 探测 HP4570N / SGM41562,初始化与充电控制直接转调各驱动
+ */
+
+#include <stdio.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "charge_ic.h"
+#include "custom_utils.h"
+#include "errcode.h"
+
+#if defined(ENABLE_HP4570)
+#include "hp4570.h"
+#endif
+#if defined(ENABLE_SGM41562)
+#include "sgm41562.h"
+#endif
+
+#if defined(BOARD_L22) || defined(BOARD_FD272)
+#define CHARGE_IC_I2C_BUS I2C_BUS_0
+#elif defined(BOARD_U8)
+#define CHARGE_IC_I2C_BUS I2C_BUS_3
+#else
+#define CHARGE_IC_I2C_BUS I2C_BUS_0
+#endif
+
+#define CHARGE_1C_MA   (256u)
+
+static uint16_t last_charge_mA = 0; 
+
+static charge_ic_type_t g_charge_ic_type = CHARGE_IC_TYPE_NONE;
+
+charge_ic_type_t charge_ic_get_type(void)
+{
+    return g_charge_ic_type;
+}
+
+static charge_ic_type_t charge_ic_detect(void)
+{
+
+#if defined(ENABLE_SGM41562)
+    if (sgm41562_probe()) {
+        return CHARGE_IC_TYPE_SGM41562;
+    }
+#endif
+#if defined(ENABLE_HP4570)
+    if (hp4570n_identify(HP4570N) == 0) {
+        return CHARGE_IC_TYPE_HP4570;
+    }
+#endif
+    printf("[charge_ic] no charge IC detected\n");
+    return CHARGE_IC_TYPE_NONE;
+}
+
+errcode_t charge_ic_init(void)
+{
+    g_charge_ic_type = CHARGE_IC_TYPE_NONE;
+    custom_i2c_init(CHARGE_IC_I2C_BUS);
+
+    g_charge_ic_type = charge_ic_detect();
+    if (g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return ERRCODE_FAIL;
+    }
+
+    last_charge_mA = CHARGE_1C_MA;
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            if (hp4570n_init(HP4570N) != 0) {
+                return ERRCODE_FAIL;
+            }
+#endif
+            break;
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            if (sgm41562_hw_init() != 0) {
+                return ERRCODE_FAIL;
+            }
+#endif
+            break;
+        default:
+            return ERRCODE_FAIL;
+    }
+    return ERRCODE_SUCC;
+}
+
+void charge_ic_set_charge_enable(bool enable)
+{
+    if (g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return;
+    }
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            hp4570n_set_ceb_en(enable);
+#endif
+            break;
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            sgm41562_set_charge_en(!enable);
+#endif
+            break;
+        default:
+            break;
+    }
+}
+
+void charge_ic_set_vbus_power(bool from_vbus)
+{
+    if (g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return;
+    }
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            hp4570n_set_batfet_dis(from_vbus);
+            hp4570n_set_ceb_en(!from_vbus);
+#endif
+            break;
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            sgm41562_set_batfet_dis(from_vbus);
+            sgm41562_set_charge_en(from_vbus);
+#endif
+            break;
+        default:
+            break;
+    }
+}
+
+bool charge_ic_check_charge_done(void)
+{
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            return hp4570n_read_chrg_stat_chrg_done();
+#else
+            return false;
+#endif
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            return sgm41562_read_chrg_stat_chrg_done();
+#else
+            return false;
+#endif
+        default:
+            return false;
+    }
+}
+
+void charge_ic_set_chrg_ichg_mA(uint16_t current_mA)
+{
+    if (g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return;
+    }
+
+    if(current_mA != last_charge_mA)
+    {
+        last_charge_mA = current_mA;
+        // printf("last_charge_mA : %d\n",last_charge_mA);
+    }
+    else
+        return;
+
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            hp4570n_set_chrg_ichg_mA(current_mA);
+#endif
+            break;
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            sgm41562_set_chrg_ichg_mA(current_mA);
+#endif
+            break;
+        default:
+            break;
+    }
+}
+
+uint8_t charge_ic_get_id(void)
+{
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            return hp4570n_get_id();
+#else
+            return 0;
+#endif
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            return sgm41562_get_id();
+#else
+            return 0;
+#endif
+        default:
+            return 0;
+    }
+}
+
+void charge_ic_reset(void)
+{
+    last_charge_mA = CHARGE_1C_MA;
+
+    if (g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+        return;
+    }
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            hp4570n_reset();
+#endif
+            break;
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            sgm41562_reset();
+#endif
+            break;
+        default:
+            break;
+    }
+}
+
+size_t charge_ic_dump_debug_registers(char *buf, size_t buf_len)
+{
+    if (buf == NULL || buf_len == 0) {
+        return 0;
+    }
+    buf[0] = '\0';
+
+    switch (g_charge_ic_type) {
+        case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+            return hp4570n_dump_debug_registers(buf, buf_len);
+#else
+            break;
+#endif
+        case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+            return sgm41562_dump_debug_registers(buf, buf_len);
+#else
+            break;
+#endif
+        default:
+            break;
+    }
+
+    (void)snprintf(buf, buf_len, "no charge IC detected\n");
+    return strlen(buf);
+}
diff --git a/code/sdk/zhihui/services/battery/service/charge_ic.h b/code/sdk/zhihui/services/battery/service/charge_ic.h
new file mode 100644 (file)
index 0000000..25cfd7e
--- /dev/null
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) @CompanyNameMagicTag 2022-2026. All rights reserved.
+ *
+ * @brief 充电 IC 统一接口(HP4570N / SGM41562 运行时识别)
+ */
+
+#ifndef CHARGE_IC_H
+#define CHARGE_IC_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include "errcode.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+    CHARGE_IC_TYPE_NONE = 0,
+    CHARGE_IC_TYPE_HP4570,
+    CHARGE_IC_TYPE_SGM41562,
+} charge_ic_type_t;
+
+errcode_t charge_ic_init(void);
+
+void charge_ic_set_charge_enable(bool enable);
+
+/** @brief true:断开电池由 VBUS 供电(关 BATFET + 关充电);false:恢复电池通路 */
+void charge_ic_set_vbus_power(bool from_vbus);
+
+void charge_ic_set_chrg_ichg_mA(uint16_t current_mA);
+
+/** @brief 读充电 IC 是否充电完成(CHG_DONE 状态位) */
+bool charge_ic_check_charge_done(void);
+
+uint8_t charge_ic_get_id(void);
+
+void charge_ic_reset(void);
+
+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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CHARGE_IC_H */
index 53d30ab..49cc3a7 100644 (file)
@@ -61,9 +61,9 @@
 #include "lqbp_service.h"\r
 #include "lqbp002ta.h"\r
 #endif\r
-#ifdef ENABLE_HP4570\r
-#include "hp4570.h"\r
-#endif\r
+\r
+#include "charge_ic.h"\r
+\r
 \r
 #include "ConfigModelC.h"\r
 \r
@@ -521,15 +521,14 @@ void aging_task(void)
             aging_t.fail_num++;\r
         }\r
 \r
-#ifdef ENABLE_HP4570\r
-        uint8_t charge_id = hp4570n_get_id();\r
-        if (charge_id != 0x2)\r
+\r
+        uint8_t charge_id = charge_ic_get_id();\r
+        if (charge_id != 0x2 || charge_id != 0x4)\r
         {\r
             aging_t.charge_error++;\r
             aging_t.fail_num++;\r
         }\r
 \r
-#endif\r
         PRINT("充电 失败次数 : %d \r\n",aging_t.charge_error);\r
 /********************* 马达 老化测试*****************************/\r
         //2min 震2s 停2s\r
@@ -879,9 +878,9 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t
 \r
                 bool state;\r
                 state = uapi_get_charger_plug_status();\r
-#ifdef ENABLE_HP4570\r
-                id = hp4570n_get_id();\r
-                if (state != 1 || id != 0x2)\r
+#if defined(ENABLE_HP4570)  || defined(ENABLE_SGM41562)\r
+                id = charge_ic_get_id();\r
+                if (state != 1 || id != 0x2 || id != 0X4)\r
                     send_data[1] |= 1 << 0;\r
 #else\r
                 if (!state)\r
@@ -1044,10 +1043,7 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t
                 mcu_pm_lcd_off(NULL,NULL) ;\r
                 mcu_pm_remove_vote(NULL,NULL);\r
 \r
-#ifdef ENABLE_HP4570\r
-                hp4570n_set_batfet_dis(true);\r
-                hp4570n_set_ceb_en(false);\r
-#endif\r
+                charge_ic_set_vbus_power(true);\r
 \r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON,\r
                         BLE_TEST_CMD_COMMON_SUB_MODE_POWERCONSUMPTION,\r
@@ -2102,9 +2098,9 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint
             {\r
                 //获取充电IC ID\r
                 uint8_t id = 0;\r
-#ifdef ENABLE_HP4570\r
-                id = hp4570n_get_id();\r
-#endif\r
+\r
+                id = charge_ic_get_id();\r
+\r
                 uint8_t send_data[2] = {0};\r
                 send_data[1] = id;\r
                 factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST,\r