#include "battery_service.h"
#if defined(ENABLE_HP4570)
extern "C" {
-#include "hp4570.h"
+#include "charge_ic.h"
}
#endif
#endif
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
}
\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
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
{ \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
'PPG_HX3695',
'ROTARYENCODER_HX3508',
'ENABLE_HP4570',
- # 'ENABLE_SGM41562',
+ 'ENABLE_SGM41562',
'-:SUPPORT_ALIPAY_SEC',
],
#添加自定义应用
#ifdef SUPPORT_BATTERY_SERVICE
#include "battery_hal.h"
+#include "charge_ic.h"
#endif
#include "producttest/include/testView.h"
#endif
#include "pm_veto.h"
#include "pm.h"
-#ifdef ENABLE_HP4570
- #include "hp4570.h"
-#endif
+
#ifdef __cplusplus
#if __cplusplus
}
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
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;
}
#===============================================================================
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
)
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
\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
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
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
#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
\r
void hp4570n_reset(void);\r
\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
#endif // HP4570N_CHARGER_H
\ No newline at end of file
+#include <stdio.h>
+
#include "sgm41562.h"
#include "custom_utils.h"
// 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)
// 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)
(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)
{
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;
}
return ret;
}
+bool sgm41562_probe(void)
+{
+ return sgm41562_hw_chipid_detect() == 0;
+}
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__);
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;
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);
sgm41562_read_reg(SGM41562_CHRG_REG_D,®_data);
printf("SGM41562_CHRG_REG_D :0x%x\n",reg_data);
-
+#endif
return 0;
err_out:
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);
}
#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
\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
)
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
// #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)
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
/**
* 输入电池电压值
}
}
-#ifdef ENABLE_HP4570
- if (hp4570_check_charge_done(voltage, &percent)) {
+ if (battery_check_charge_done(voltage, &percent)) {
return percent;
}
-#endif
return percent;
}
#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"
#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 */
// 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
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();
- 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++;
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;
#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); //先读历史电量
--- /dev/null
+/**
+ * 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);
+}
--- /dev/null
+/**
+ * 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 */
#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
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
\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
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
{\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