From dec394b31f44fd468a061ab9f2b2ef526c9653ac Mon Sep 17 00:00:00 2001 From: 1624952103 Date: Tue, 9 Jun 2026 14:24:31 +0800 Subject: [PATCH] =?utf8?q?=E5=85=85=E7=94=B5IC=E8=87=AA=E5=8A=A8=E8=AF=86?= =?utf8?q?=E5=88=AB=E5=88=87=E6=8D=A2=E4=B8=8D=E5=90=8C=E9=85=8D=E7=BD=AE?= =?utf8?q?=EF=BC=8C=E5=AF=B9=E8=AF=9D=E6=8F=90=E4=BE=9B=E5=85=AC=E5=85=B1?= =?utf8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../debug_output_notification.cpp | 8 +- .../wearable/ohos_startup/ohosfwk_startup.c | 28 +- .../config/target_config/brandy/config.py | 2 +- .../UI/producttest/src/testchanging.cpp | 14 +- code/sdk/zhihui/drivers/charge/CMakeLists.txt | 28 -- .../sdk/zhihui/drivers/charge/hp4570/hp4570.c | 11 +- .../sdk/zhihui/drivers/charge/hp4570/hp4570.h | 8 + .../zhihui/drivers/charge/sgm41562/sgm41562.c | 172 ++++++++---- .../zhihui/drivers/charge/sgm41562/sgm41562.h | 33 ++- .../zhihui/services/battery/CMakeLists.txt | 1 + .../battery/service/battery_driver.cpp | 71 +++-- .../battery/service/battery_service.cpp | 110 ++++---- .../services/battery/service/charge_ic.cpp | 260 ++++++++++++++++++ .../services/battery/service/charge_ic.h | 50 ++++ .../factorytest_protocol.c | 30 +- 15 files changed, 600 insertions(+), 226 deletions(-) create mode 100644 code/sdk/zhihui/services/battery/service/charge_ic.cpp create mode 100644 code/sdk/zhihui/services/battery/service/charge_ic.h diff --git a/code/sdk/application/wearable/fd272/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp b/code/sdk/application/wearable/fd272/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp index fae720977..d6f7b500c 100644 --- a/code/sdk/application/wearable/fd272/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp +++ b/code/sdk/application/wearable/fd272/service/msg_center/src/notify/debug_output_notification/debug_output_notification.cpp @@ -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 } diff --git a/code/sdk/application/wearable/ohos_startup/ohosfwk_startup.c b/code/sdk/application/wearable/ohos_startup/ohosfwk_startup.c index 96a96477d..974c582cd 100644 --- a/code/sdk/application/wearable/ohos_startup/ohosfwk_startup.c +++ b/code/sdk/application/wearable/ohos_startup/ohosfwk_startup.c @@ -24,11 +24,9 @@ #if defined(SUPPORT_BATTERY_SERVICE) #include "battery_service.h" +#include "charge_ic.h" #endif -#ifdef ENABLE_HP4570 -#include "hp4570.h" -#endif #include "vibrator_service.h" #define POWER_ON_VOLTAGE_STABILIZE_MS 1000 @@ -161,9 +159,11 @@ void ohos_show_bootup_logo(void) return; } - #ifdef ENABLE_HP4570 - hp4570n_init(HP4570N); - #endif + + // hp4570n_init(HP4570N); + + charge_ic_init(); + //显示充电图片 ShowGraphicChargingLogo(); @@ -187,14 +187,14 @@ void ohos_show_bootup_logo(void) { uapi_watchdog_kick(); uapi_tcxo_delay_ms(5000); -#ifdef ENABLE_HP4570 - if (hp4570n_read_status_wdt_fault()) - { - PRINT("[battery] HP4570 WDT fault, hp4570n_reset()\r\n"); - hp4570n_reset(); - } - hp4570n_wdt_rst(); -#endif +// #ifdef ENABLE_HP4570 +// if (hp4570n_read_status_wdt_fault()) +// { +// PRINT("[battery] HP4570 WDT fault, hp4570n_reset()\r\n"); +// hp4570n_reset(); +// } +// hp4570n_wdt_rst(); +// #endif } else mcu_reset(); diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py index c1ceb6e3b..1006a591b 100644 --- a/code/sdk/build/config/target_config/brandy/config.py +++ b/code/sdk/build/config/target_config/brandy/config.py @@ -1162,7 +1162,7 @@ target = { 'PPG_HX3695', 'ROTARYENCODER_HX3508', 'ENABLE_HP4570', - # 'ENABLE_SGM41562', + 'ENABLE_SGM41562', '-:SUPPORT_ALIPAY_SEC', ], #添加自定义应用 diff --git a/code/sdk/zhihui/UI/producttest/src/testchanging.cpp b/code/sdk/zhihui/UI/producttest/src/testchanging.cpp index 0833dcc07..a2fe31e84 100644 --- a/code/sdk/zhihui/UI/producttest/src/testchanging.cpp +++ b/code/sdk/zhihui/UI/producttest/src/testchanging.cpp @@ -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; } diff --git a/code/sdk/zhihui/drivers/charge/CMakeLists.txt b/code/sdk/zhihui/drivers/charge/CMakeLists.txt index f3cbc4de8..b4834cb1f 100644 --- a/code/sdk/zhihui/drivers/charge/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/charge/CMakeLists.txt @@ -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 ) diff --git a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c index c90184171..cd4e9f54a 100644 --- a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c +++ b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.c @@ -177,8 +177,8 @@ bool hp4570n_init(uint8_t chip_ver){ ret = hp4570n_set_low_chrg_ipre_mA(30); printf("hp4570n_set_low_chrg_ipre_mA(30) ret:%d\n",ret); - ret = hp4570n_set_chrg_ichg_mA(260); - printf("hp4570n_set_chrg_ichg_mA(260) ret:%d\n",ret); + ret = hp4570n_set_chrg_ichg_mA(256); + printf("hp4570n_set_chrg_ichg_mA(256) ret:%d\n",ret); ret = hp4570n_set_chrg_iterm_mA(30); printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret); @@ -199,6 +199,7 @@ bool hp4570n_init(uint8_t chip_ver){ hp4570n_set_rst_vsys_wvbus_en(false); + hp4570n_set_wdt_timer_en(false); #if 0 uint8_t value = 0; @@ -1081,8 +1082,8 @@ void hp4570n_reset(void) ret = hp4570n_set_low_chrg_ipre_mA(30); printf("hp4570n_set_low_chrg_ipre_mA(30) ret:%d\n",ret); - ret = hp4570n_set_chrg_ichg_mA(260); - printf("hp4570n_set_chrg_ichg_mA(260) ret:%d\n",ret); + ret = hp4570n_set_chrg_ichg_mA(256); + printf("hp4570n_set_chrg_ichg_mA(256) ret:%d\n",ret); ret = hp4570n_set_chrg_iterm_mA(30); printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret); @@ -1102,4 +1103,6 @@ void hp4570n_reset(void) hp4570n_set_vindpm_en(true); hp4570n_set_rst_vsys_wvbus_en(false); + + hp4570n_set_wdt_timer_en(false); } \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.h b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.h index 7e95e9fc2..8b48d096d 100644 --- a/code/sdk/zhihui/drivers/charge/hp4570/hp4570.h +++ b/code/sdk/zhihui/drivers/charge/hp4570/hp4570.h @@ -28,6 +28,10 @@ #include #include "std_def.h" +#ifdef __cplusplus +extern "C" { +#endif + // for example // Avoid using "X", x stands for General Condition enum hp4570n_chip_ver { @@ -527,4 +531,8 @@ uint8_t hp4570n_get_id(void); void hp4570n_reset(void); +#ifdef __cplusplus +} +#endif + #endif // HP4570N_CHARGER_H \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c b/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c index ffd12c6ed..f3df6f73d 100644 --- a/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c +++ b/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.c @@ -1,4 +1,6 @@ +#include + #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,®_data); @@ -1132,7 +1184,7 @@ int sgm41562_hw_init(void) sgm41562_read_reg(SGM41562_CHRG_REG_D,®_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,®_data); - printf("SGM41562_CHRG_REG_0 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_1,®_data); - printf("SGM41562_CHRG_REG_1 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_2,®_data); - printf("SGM41562_CHRG_REG_2 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_3,®_data); - printf("SGM41562_CHRG_REG_3 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_4,®_data); - printf("SGM41562_CHRG_REG_4 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_5,®_data); - printf("SGM41562_CHRG_REG_5 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_6,®_data); - printf("SGM41562_CHRG_REG_6 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_7,®_data); - printf("SGM41562_CHRG_REG_7 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_8,®_data); - printf("SGM41562_CHRG_REG_8 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_9,®_data); - printf("SGM41562_CHRG_REG_9 :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_A,®_data); - printf("SGM41562_CHRG_REG_A :0x%x\n",reg_data); - - sgm41562_read_reg(SGM41562_CHRG_REG_B,®_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,®_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,®_data); - printf("SGM41562_CHRG_REG_D :0x%x\n",reg_data); + (void)sgm41562_dump_debug_registers(buf, sizeof(buf)); + printf("%s", buf); } diff --git a/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h b/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h index 9250c2982..e5e357be3 100644 --- a/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h +++ b/code/sdk/zhihui/drivers/charge/sgm41562/sgm41562.h @@ -1,10 +1,15 @@ #ifndef SGM41562_CHARGER_H #define SGM41562_CHARGER_H -#include #include +#include +#include #include "std_def.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifndef GENMASK #define GENMASK(h, l) (((uint8_t) -1 >> (7 - (h))) & ~((1U << (l)) - 1)) #endif @@ -258,8 +263,34 @@ struct sgm41562_state { int sgm41562_hw_init(void); +bool sgm41562_probe(void); + void sgm41562_read_all_reg(void); +size_t sgm41562_dump_debug_registers(char *buf, size_t buf_len); + void sgm41562_wdt_rst(void); +void sgm41562_set_charge_en(bool en); + +void sgm41562_set_batfet_dis(bool en); + +/** + * @brief 关机低功耗配置;默认仅调寄存器降压不降 Qswitch。 + * 定义 SGM41562_USE_FET_DIS_SHIP=1 且 nINT 有外部上拉时才置 FET_DIS 进船运。 + */ +void sgm41562_entry_shipmode(void); + +bool sgm41562_set_chrg_ichg_mA(uint16_t current_mA); + +bool sgm41562_read_chrg_stat_chrg_done(void); + +uint8_t sgm41562_get_id(void); + +void sgm41562_reset(void); + +#ifdef __cplusplus +} +#endif + #endif /* _SGM41562_CHARGER_H */ diff --git a/code/sdk/zhihui/services/battery/CMakeLists.txt b/code/sdk/zhihui/services/battery/CMakeLists.txt index 7d927110f..24c87cdea 100644 --- a/code/sdk/zhihui/services/battery/CMakeLists.txt +++ b/code/sdk/zhihui/services/battery/CMakeLists.txt @@ -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 diff --git a/code/sdk/zhihui/services/battery/service/battery_driver.cpp b/code/sdk/zhihui/services/battery/service/battery_driver.cpp index 30b4f61c4..7159db32f 100644 --- a/code/sdk/zhihui/services/battery/service/battery_driver.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_driver.cpp @@ -73,15 +73,14 @@ typedef enum { // #include "cat1_utils.h" #include // #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; } diff --git a/code/sdk/zhihui/services/battery/service/battery_service.cpp b/code/sdk/zhihui/services/battery/service/battery_service.cpp index 44364c4f7..2781b00a2 100644 --- a/code/sdk/zhihui/services/battery/service/battery_service.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_service.cpp @@ -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 index 000000000..ca89491b9 --- /dev/null +++ b/code/sdk/zhihui/services/battery/service/charge_ic.cpp @@ -0,0 +1,260 @@ +/** + * Copyright (c) @CompanyNameMagicTag 2022-2026. All rights reserved. + * + * @brief I2C 探测 HP4570N / SGM41562,初始化与充电控制直接转调各驱动 + */ + +#include +#include +#include +#include +#include + +#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 index 000000000..25cfd7e0e --- /dev/null +++ b/code/sdk/zhihui/services/battery/service/charge_ic.h @@ -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 +#include +#include +#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 */ diff --git a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c index 53d30ab7c..49cc3a757 100644 --- a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c +++ b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c @@ -61,9 +61,9 @@ #include "lqbp_service.h" #include "lqbp002ta.h" #endif -#ifdef ENABLE_HP4570 -#include "hp4570.h" -#endif + +#include "charge_ic.h" + #include "ConfigModelC.h" @@ -521,15 +521,14 @@ void aging_task(void) aging_t.fail_num++; } -#ifdef ENABLE_HP4570 - uint8_t charge_id = hp4570n_get_id(); - if (charge_id != 0x2) + + uint8_t charge_id = charge_ic_get_id(); + if (charge_id != 0x2 || charge_id != 0x4) { aging_t.charge_error++; aging_t.fail_num++; } -#endif PRINT("充电 失败次数 : %d \r\n",aging_t.charge_error); /********************* 马达 老化测试*****************************/ //2min 震2s 停2s @@ -879,9 +878,9 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t bool state; state = uapi_get_charger_plug_status(); -#ifdef ENABLE_HP4570 - id = hp4570n_get_id(); - if (state != 1 || id != 0x2) +#if defined(ENABLE_HP4570) || defined(ENABLE_SGM41562) + id = charge_ic_get_id(); + if (state != 1 || id != 0x2 || id != 0X4) send_data[1] |= 1 << 0; #else if (!state) @@ -1044,10 +1043,7 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t mcu_pm_lcd_off(NULL,NULL) ; mcu_pm_remove_vote(NULL,NULL); -#ifdef ENABLE_HP4570 - hp4570n_set_batfet_dis(true); - hp4570n_set_ceb_en(false); -#endif + charge_ic_set_vbus_power(true); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON, BLE_TEST_CMD_COMMON_SUB_MODE_POWERCONSUMPTION, @@ -2102,9 +2098,9 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint { //获取充电IC ID uint8_t id = 0; -#ifdef ENABLE_HP4570 - id = hp4570n_get_id(); -#endif + + id = charge_ic_get_id(); + uint8_t send_data[2] = {0}; send_data[1] = id; factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, -- 2.17.1