${ROOT_DIR}/zhihui/services/factorytest_service
${ROOT_DIR}/zhihui/services/cc_cycle_service
${ROOT_DIR}/zhihui/drivers/
+ ${ROOT_DIR}/zhihui/drivers/charge
${ROOT_DIR}/zhihui/drivers/charge/hp4570
+ ${ROOT_DIR}/zhihui/drivers/charge/sgm41562
${ROOT_DIR}/zhihui/4g/cat1Service/include
${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/include
${ROOT_DIR}/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/include
#ifndef CC_CYCLE_BURN_VIEW_H
#define CC_CYCLE_BURN_VIEW_H
+#include "charge_ic_config.h"
+
#include "View.h"
#include "components/ui_scroll_view.h"
#include "components/ui_view_group.h"
#include "components/ui_label.h"
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
#include "cc_cycle_service.h"
#endif
UILabel *statusLabel_{nullptr};
UILabel *footerLabel_{nullptr};
bool viewInit_{false};
+#ifdef ENABLE_CC_CYCLE
void UpdatePhaseBackground(cc_cycle_phase_e phase, uint8_t defectType);
+#endif
};
}
#include "producttest/include/testhrsenson.h" \r
#include "components/ui_label_button_ext.h"\r
#include "common/key_code.h"\r
+#include "charge_ic_config.h"\r
\r
\r
\r
#endif\r
LUMINANCE,\r
CHARG,\r
-#ifdef ENABLE_HP4570\r
+#ifdef ENABLE_CC_CYCLE\r
CCCYCLE,\r
#endif\r
SPEAK,\r
#ifndef TEST_VIEW_H\r
#define TEST_VIEW_H\r
\r
+#include "charge_ic_config.h"\r
+\r
#include "View.h"\r
\r
#include "components/ui_view_group.h"\r
#include "producttest/include/testhrsenson.h"\r
#include "producttest/include/testgsenson.h"\r
#include "producttest/include/testold.h"\r
-#ifdef ENABLE_HP4570\r
+#ifdef ENABLE_CC_CYCLE\r
#include "producttest/include/testCcCycle.h"\r
#endif\r
#include "producttest/include/testbt.h"\r
bool ChangeTPTESTView(int16_t thisView);\r
bool ChangLUMTESTView(int16_t thisView);\r
bool ChangchargingTESTView(int16_t thisView);\r
-#ifdef ENABLE_HP4570\r
+#ifdef ENABLE_CC_CYCLE\r
bool ChangeCcCycleTESTView(int16_t thisView);\r
#endif\r
bool ChangspeakTESTView(int16_t thisView);\r
testTPView *test_TP_view{nullptr};\r
testLUMView *test_lum_view{nullptr};\r
testCHANINGView *test_charging_view{nullptr};\r
-#ifdef ENABLE_HP4570\r
+#ifdef ENABLE_CC_CYCLE\r
testCcCycleView *test_cc_cycle_view{nullptr};\r
#endif\r
testSPEAKView *test_speak_view{nullptr};\r
+#include "charge_ic_config.h"
#include "AppViewIDs.h"
#include "NativeAbility.h"
#include "NativeRegisterManager.h"
#include <cstdlib>
#include <cstring>
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
#include "cc_cycle_service.h"
#endif
#include "alarm/include/AlarmClockModel.h"
static void cc_burn_check_alarm(void)
{
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
if (cc_cycle_take_defect_alarm() != 0) {
if (!g_ccBurnAlarmPlaying) {
::GraphicService::GetInstance()->PostGraphicEvent(cc_burn_alarm_start_on_graphic);
if (!cc_burn_ui_may_update()) {
return;
}
-#ifdef ENABLE_HP4570
- if (!cc_cycle_is_running()) {
- return;
+#ifdef ENABLE_CC_CYCLE
+ if (cc_cycle_is_running()) {
+ cc_burn_check_alarm();
}
- cc_burn_check_alarm();
#endif
OHOS::ccCycleBurnView *v = OHOS::ccCycleBurnView::GetInstance();
if (v == nullptr || !v->IsViewReady()) {
if (g_hideBurnUiPending) {
return;
}
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
if (!cc_cycle_is_running()) {
return;
}
g_hideBurnUiPending = 0;
return;
}
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
factorytest_set_pending_subview(OHOS::CCCYCLE);
#else
factorytest_set_pending_subview(OHOS::TESTVIEW);
g_hideBurnUiPending = 0;
g_burnUiValid = 1;
view_->AttachDragListener();
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
if (cc_cycle_is_running() && g_ccBurnRefreshTimer != nullptr) {
(void)osTimerStart(g_ccBurnRefreshTimer, 1000);
}
if (g_ccBurnRefreshTimer != nullptr) {
(void)osTimerStop(g_ccBurnRefreshTimer);
}
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
cc_cycle_on_burn_ui_exit();
#endif
{
+#include "charge_ic_config.h"
#include "producttest/include/ccCycleBurnView.h"
#include "producttest/include/ccCycleBurnPresenter.h"
#include "wearable_log.h"
#include "gfx_utils/color.h"
#include <cstdio>
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
#include "cc_cycle_service.h"
#include "battery_hal.h"
#endif
{
return g_burnView;
}
-
+#ifdef ENABLE_CC_CYCLE
void ccCycleBurnView::UpdatePhaseBackground(cc_cycle_phase_e phase, uint8_t defectType)
{
if (burnContentGroup_ == nullptr) {
phaseLabel_->SetText("空闲");
}
}
-
+#endif
void ccCycleBurnView::RefreshStatus(void)
{
if (!IsViewReady() || GetInstance() != this) {
return;
}
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
cc_cycle_phase_e p = cc_cycle_get_phase();
uint8_t defect = cc_cycle_get_defect_type();
UpdatePhaseBackground(p, defect);
#include <cstring>
#include <cstdlib>
-#ifdef ENABLE_HP4570
+#include "charge_ic_config.h"
+
+#ifdef ENABLE_CC_CYCLE
#include "cc_cycle_service.h"
#include "battery_hal.h"
if (buf == NULL || buf_size == 0) {
return;
}
- /* 与 debug 页 get_hp4570_register_dump 一致:仅 hp4570n_dump_debug_registers */
+ /* 与 cc_cycle 一致:走 charge_ic_dump_debug_registers */
(void)cc_cycle_format_ic_registers(buf, (unsigned int)buf_size);
}
}
}
-#endif /* ENABLE_HP4570 */
+#endif /* ENABLE_CC_CYCLE */
#ifdef CUSTOM_ZHIHUI
#include "factorytest_protocol.h"
#endif
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
#include "cc_cycle_service.h"
#include "producttest/include/testCcCycle.h"
#endif
"\"message\":\"pending_subview_apply\",\"data\":{\"v1\":%d}}\n", (int)target);
// #endregion
testView::GetInstance()->ChangeView(TESTVIEW, target);
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
if (target == CCCYCLE) {
testCcCycleView *ccView = testCcCycleView::GetInstance();
if (ccView != nullptr && ccView->IsUiReady()) {
void testPresenter::OnPause(void)
{
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
testCcCycleView *ccView = testCcCycleView::GetInstance();
if (ccView != nullptr) {
ccView->PauseStatusTimer();
return true;
}
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
if (strcmp(view.GetViewId(), "cc_cycle_sw") == 0) {
cc_cycle_set_enabled(cc_cycle_get_enabled() ? 0 : 1);
if (testCcCycleView::GetInstance() != nullptr) {
if(strcmp(view.GetViewId(),Test_ViewMapper_t[i].viewid_str_next) == 0)
{
int nextIdx = i + 1;
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
if (nextIdx < len && Test_ViewMapper_t[nextIdx].viewId == CCCYCLE) {
nextIdx++;
}
#endif
{LUMINANCE, "luminanceButton", "亮度", "luminanceButton_next", &testView::ChangLUMTESTView, true},
{CHARG, "chargingButton", "电池充电", "chargingButton_next", &testView::ChangchargingTESTView, true},
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
{CCCYCLE, "ccCycleButton", "充放电拷机", "ccCycleButton_next", &testView::ChangeCcCycleTESTView, true},
#endif
{SPEAK, "speakButton", "喇叭", "speakButton_next", &testView::ChangspeakTESTView, true},
bool testView::ShouldShowChainNextButton(int16_t viewId)
{
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
if (viewId == CCCYCLE) {
return false;
}
for (int i = 1; i < len; i++)
{
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
if (Test_ViewMapper_t[i].viewId == CCCYCLE) {
continue;
}
button[btnIdx++] = SetTheButton_ext(buttonconfig, clickListener);
buttonconfig.y += interval;
}
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
for (int i = 1; i < len; i++) {
if (Test_ViewMapper_t[i].viewId != CCCYCLE) {
continue;
return true;
}
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
bool testView::ChangeCcCycleTESTView(int16_t thisView)
{
if (SystemScrollView[thisView] == nullptr) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView:: SystemScrollView[%d] is nullptr", showView);
}
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
testCcCycleView *ccView = testCcCycleView::GetInstance();
if (ccView != nullptr) {
if (showView == CCCYCLE) {
test_G_view = nullptr;
SystemScrollView[hideView] = nullptr;
break;
-#ifdef ENABLE_HP4570
+#ifdef ENABLE_CC_CYCLE
case CCCYCLE:
if (SystemScrollView[hideView] != nullptr)
group->Remove(SystemScrollView[hideView]);
#include "producttest/include/testchanging.h"
#include "producttest/include/testchangingC.h"
+#include "charge_ic_config.h"
+
#ifdef SUPPORT_BATTERY_SERVICE
#include "battery_hal.h"
#include "charge_ic.h"
#include "pm_veto.h"
#include "pm.h"
- #ifdef ENABLE_HP4570
- #include "hp4570.h"
- #endif
-
#ifdef __cplusplus
#if __cplusplus
float pcb_temp = 0.0F;
uint8_t power = 0;
uint8_t charge_id = 0;
+ bool vbus_pg = false;
+ bool chrg_fast = false;
+ bool chrg_done = false;
if (buf == nullptr || buf_size == 0) {
return;
power = battery_get_voltage(&voltage);
battery_get_pcb_temp(&pcb_temp);
battery_get_battery_temp(&bat_temp);
+#if defined(ENABLE_CC_CYCLE)
+ {
+ charge_ic_cc_status_t cc_status = {0};
+ charge_id = charge_ic_get_display_id();
+ if (charge_ic_read_cc_status(&cc_status)) {
+ vbus_pg = cc_status.vbus_pg != 0;
+ chrg_fast = cc_status.chrg_active != 0;
+ chrg_done = cc_status.chrg_done != 0;
+ }
+ }
+#else
+ charge_id = (charge_ic_get_id() == 0x2 || charge_ic_get_id() == 0x4) ? 1 : 0;
#endif
-#ifdef ENABLE_HP4570
- charge_id = (0x2 == hp4570n_get_id()) ? 1 : 0;
- bool vbus_pg = hp4570n_read_status_vbus_pg();
- bool chrg_fast = hp4570n_read_chrg_stat_fast_chrg();
- bool chrg_done = hp4570n_read_chrg_stat_chrg_done();
(void)sprintf_s(buf, buf_size,
"power:%d\nvoltage:%.2f\nbat_temp:%.2f\npcb_temp:%.2f\ncharge Ic:%d\nvbus_pg:%d chrg:%d/%d",
power, voltage, bat_temp, pcb_temp, charge_id, (int)vbus_pg, (int)chrg_fast, (int)chrg_done);
)
set(PUBLIC_HEADER
+ ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/hp4570
${CMAKE_CURRENT_SOURCE_DIR}/sgm41562
${CMAKE_CURRENT_SOURCE_DIR}/service
--- /dev/null
+/**
+ * @brief 充放电拷机(cc_cycle)充电 IC 统一状态与宏接口头
+ *
+ * 各驱动在 hp4570.h / sgm41562.h 等中定义 XXX_CC_* 宏;
+ * charge_ic.cpp 按运行时识别类型分发,框架层仅调用 charge_ic_* API。
+ */
+
+#ifndef CHARGE_IC_CC_OPS_H
+#define CHARGE_IC_CC_OPS_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @brief 拷机/产测 IC 状态快照(展示与不良快照共用) */
+typedef struct {
+ uint8_t vbus_pg; /**< 1=输入 Power Good */
+ uint8_t chrg_active; /**< 1=预充/快充进行中(展示用,各 IC 语义见驱动宏) */
+ uint8_t chrg_done; /**< 1=Charge Done */
+} charge_ic_cc_status_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CHARGE_IC_CC_OPS_H */
--- /dev/null
+/**
+ * @brief 各充电 IC 1C 电流配置(service 与 driver 共用,单一修改点)
+ */
+
+#ifndef CHARGE_IC_CONFIG_H
+#define CHARGE_IC_CONFIG_H
+
+#define CHARGE_1C_MA_HP4570 200u
+#define CHARGE_1C_MA_SGM41562 200u /* TEMP: 41562 1C 测试 */
+
+#if defined(ENABLE_HP4570) || defined(ENABLE_SGM41562)
+#define ENABLE_CC_CYCLE 1
+#endif
+
+#endif /* CHARGE_IC_CONFIG_H */
*/\r
\r
#include "hp4570.h"\r
+#include "charge_ic_config.h"\r
#include "custom_utils.h"\r
#include <stdio.h>\r
\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(256);\r
- printf("hp4570n_set_chrg_ichg_mA(256) ret:%d\n",ret);\r
+ ret = hp4570n_set_chrg_ichg_mA(CHARGE_1C_MA_HP4570);\r
+ printf("hp4570n_set_chrg_ichg_mA(%u) ret:%d\n", (unsigned)CHARGE_1C_MA_HP4570, ret);\r
\r
ret = hp4570n_set_chrg_iterm_mA(30);\r
printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret);\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(256);\r
- printf("hp4570n_set_chrg_ichg_mA(256) ret:%d\n",ret);\r
+ ret = hp4570n_set_chrg_ichg_mA(CHARGE_1C_MA_HP4570);\r
+ printf("hp4570n_set_chrg_ichg_mA(%u) ret:%d\n", (unsigned)CHARGE_1C_MA_HP4570, ret);\r
\r
ret = hp4570n_set_chrg_iterm_mA(30);\r
printf("hp4570n_set_chrg_iterm_mA(30) ret:%d\n",ret);\r
\r
void hp4570n_reset(void);\r
\r
+/** @name cc_cycle 拷机操作宏(由 charge_ic.cpp 分发) */\r
+/** @{ */\r
+#define HP4570_CC_SET_CYCLE_PATH(enable) \\r
+ do { \\r
+ if (enable) { \\r
+ hp4570n_set_hiz_en(false); \\r
+ hp4570n_set_ceb_en(true); \\r
+ } else { \\r
+ hp4570n_set_ceb_en(false); \\r
+ hp4570n_set_hiz_en(true); \\r
+ } \\r
+ } while (0)\r
+\r
+#define HP4570_CC_READ_ICHG_MA(p_ma) \\r
+ hp4570n_read_chrg_ichg_mA(p_ma)\r
+\r
+#define HP4570_CC_HW_IS_ACTIVELY_CHARGING() \\r
+ (hp4570n_read_chrg_stat_fast_chrg() || hp4570n_read_chrg_stat_pre_chrg() || \\r
+ hp4570n_read_chrg_stat_dead_chrg())\r
+\r
+#define HP4570_CC_READ_STATUS(st) \\r
+ do { \\r
+ if ((st) != NULL) { \\r
+ (st)->vbus_pg = hp4570n_read_status_vbus_pg() ? 1 : 0; \\r
+ (st)->chrg_active = hp4570n_read_chrg_stat_fast_chrg() ? 1 : 0; \\r
+ (st)->chrg_done = hp4570n_read_chrg_stat_chrg_done() ? 1 : 0; \\r
+ } \\r
+ } while (0)\r
+/** @} */\r
+\r
#ifdef __cplusplus\r
}\r
#endif\r
#include <stdio.h>
#include "sgm41562.h"
+#include "charge_ic_config.h"
#include "custom_utils.h"
#include "tcxo.h"
return curr;
}
+/** @brief 设置 REG0D PRE_ICHG [7:4] 预充电流(uA) */
+static int sgm41562_set_prechg_curr(int prechg_uA)
+{
+ int ret;
+ int reg_val;
+
+ if (prechg_uA < SGM41562_PRE_ICHG_MIN_uA) {
+ prechg_uA = SGM41562_PRE_ICHG_MIN_uA;
+ } else if (prechg_uA > SGM41562_PRE_ICHG_MAX_uA) {
+ prechg_uA = SGM41562_PRE_ICHG_MAX_uA;
+ }
+
+ reg_val = (prechg_uA - SGM41562_PRE_ICHG_MIN_uA) / SGM41562_PRE_ICHG_STEP_uA;
+ reg_val <<= 4;
+
+ ret = sgm41562_update_bits(SGM41562_CHRG_REG_D,
+ SGM41562_PRE_ICHG_MASK, (uint8_t)reg_val);
+ return ret;
+}
+
/** @brief 设置 REG03 TERM_I [3:0] 截止电流(uA) */
static int sgm41562_set_term_curr( int term_curr)
{
(void)sgm41562_ctrl_setting(REG_BIT_FET_DIS, en);
}
+/** @brief 退出船运/HIZ:清 EN_HIZ、开 BATFET、允充(CEB=0) */
+void sgm41562_exit_shipmode(void)
+{
+ (void)sgm41562_ctrl_setting(REG_BIT_EN_HIZ, false);
+ (void)sgm41562_set_batfet_dis(false);
+ (void)sgm41562_ctrl_setting(REG_BIT_EN_CEB, 0);
+}
+
+void sgm41562_set_hiz_en(bool en)
+{
+ (void)sgm41562_ctrl_setting(REG_BIT_EN_HIZ, en);
+}
+
/** @brief 关机低功耗:关 WDT/NTC/定时器,SWITCH_MODE 保持 BAT→SYS(规格书 REV.A §Battery Discharge) */
void sgm41562_entry_shutdown_lpm(void)
{
return (ret == 0);
}
+bool sgm41562_read_chrg_ichg_mA(uint16_t *current_mA)
+{
+ uint8_t reg_val = 0;
+ uint32_t ichg_uA;
+
+ if (current_mA == NULL) {
+ return false;
+ }
+ if (sgm41562_read_reg(SGM41562_CHRG_REG_2, ®_val) != 0) {
+ return false;
+ }
+ reg_val &= SGM41562_FAST_ICC_MASK;
+ ichg_uA = (uint32_t)reg_val * SGM41562_FAST_ICC_STEP_uA + SGM41562_FAST_ICC_MIN_uA;
+ *current_mA = (uint16_t)(ichg_uA / 1000u);
+ return true;
+}
+
bool sgm41562_read_chrg_stat_chrg_done(void)
{
uint8_t chrg_stat = 0;
return (chrg_stat & SGM41562_CHG_STAT_MASK) == SGM41562_TERM_CHRG;
}
+bool sgm41562_read_chrg_stat_fast_chrg(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_FAST_CHRG;
+}
+
+bool sgm41562_read_chrg_stat_pre_chrg(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_PRECHRG;
+}
+
+bool sgm41562_read_status_vbus_pg(void)
+{
+ uint8_t chrg_stat = 0;
+
+ if (sgm41562_read_reg(SGM41562_CHRG_REG_8, &chrg_stat) != 0) {
+ return false;
+ }
+ return (chrg_stat & SGM41562_PG_STAT) != 0;
+}
+
uint8_t sgm41562_get_id(void)
{
uint8_t val = 0;
printf("sgm41562_hw_chipid_detect successful\n");
+ sgm41562_exit_shipmode();
+
struct sgm41562_init_data data = {0};
- data.ichg = 256 * 1000;
+ data.ichg = (int)CHARGE_1C_MA_SGM41562 * 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;
+ ret = sgm41562_set_prechg_curr(30000);
+ if (ret)
+ goto err_out;
+
ret = sgm41562_set_watchdog_timer(SGM41562_WDT_TIMER_DISABLE);
if (ret)
goto err_out;
+ ret = sgm41562_ctrl_setting(REG_BIT_EN_TERM, 1);
+ if (ret)
+ goto err_out;
+
//关闭 NTC
// ret = sgm41562_ctrl_setting(REG_BIT_EN_NTC, false);
// if (ret)
if (ret)
goto err_out;
- // printf("ichrg:%d uA, chrg_vol:%d uV, input_limit:%d uA\n",
- // data.ichg, data.vreg, data.ilim);
-
-
-#if 0
- 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);
-
- sgm41562_read_reg(SGM41562_CHRG_REG_C,®_data);
- printf("SGM41562_CHRG_REG_C :0x%x\n",reg_data);
-
- sgm41562_read_reg(SGM41562_CHRG_REG_D,®_data);
- printf("SGM41562_CHRG_REG_D :0x%x\n",reg_data);
-#endif
+ sgm41562_read_all_reg();
return 0;
err_out:
#define SGM41562_VINDPM_V_MIN_uV 3880000\r
#define SGM41562_VINDPM_V_MAX_uV 5080000\r
#define SGM41562_VINDPM_STEP_uV 80000\r
-#define SGM41562_VINDPM_DEF_uV 4600000\r
+/* 规格书 VIN_MIN >= VBAT_REG+250mV */\r
+#define SGM41562_VINDPM_DEF_uV 4850000\r
#define SGM41562_PRE_TO BIT(3)\r
#define SGM41562_INT_EXIT_SHIP BIT(2)\r
#define SGM41562_VIN_EXIT_SHIP BIT(1)\r
#define SGM41562_VBAT_REG_MIN_uV 3500000\r
#define SGM41562_VBAT_REG_MAX_uV 4770000\r
#define SGM41562_VBAT_REG_STEP_uV 10000\r
-#define SGM41562_VBAT_REG_DEF_uV 4550000\r
+/* FD272 恒压 4.60V*/\r
+#define SGM41562_VBAT_REG_DEF_uV 4600000\r
#define SGM41562_VRECH_THRE_uV BIT(0)\r
/** @} */\r
\r
*/\r
void sgm41562_set_batfet_dis(bool en);\r
\r
+/**\r
+ * @brief 退出船运/HIZ:清 EN_HIZ、开 BATFET、允充\r
+ */\r
+void sgm41562_exit_shipmode(void);\r
+\r
+/** @brief REG01 EN_HIZ:true=输入高阻(拷机放电禁充) */\r
+void sgm41562_set_hiz_en(bool en);\r
+\r
/**\r
* @brief 关机低功耗:关 WDT/NTC/充电定时器,REG0A SWITCH_MODE=1 保持 BAT→SYS\r
* @note MCU 仍由电池供电时使用;规格书 I_BAT_Q 可降至 <1.2µA(IC 部分)\r
*/\r
bool sgm41562_set_chrg_ichg_mA(uint16_t current_mA);\r
\r
+/** @brief 读 REG02 FAST_ICC 配置电流(mA) */\r
+bool sgm41562_read_chrg_ichg_mA(uint16_t *current_mA);\r
+\r
/**\r
* @brief 判断是否充电截止(EOC)\r
* @return true REG08 CHG_STAT 为 TERM_CHRG,false 未完成或读失败\r
*/\r
bool sgm41562_read_chrg_stat_chrg_done(void);\r
\r
+/** @brief REG08 CHG_STAT 为 FAST_CHRG */\r
+bool sgm41562_read_chrg_stat_fast_chrg(void);\r
+\r
+/** @brief REG08 CHG_STAT 为 PRECHRG */\r
+bool sgm41562_read_chrg_stat_pre_chrg(void);\r
+\r
+/** @brief REG08 PG_STAT:1=输入 Power Good */\r
+bool sgm41562_read_status_vbus_pg(void);\r
+\r
/**\r
* @brief 读取 REG0B Device ID 原始值\r
* @return 寄存器值;读失败返回 0\r
/** @brief 软复位:重新执行 sgm41562_hw_init() */\r
void sgm41562_reset(void);\r
\r
+/** @name cc_cycle 拷机操作宏(由 charge_ic.cpp 分发) */\r
+/** @{ */\r
+#define SGM41562_CC_SET_CYCLE_PATH(enable) \\r
+ do { \\r
+ if (enable) { \\r
+ sgm41562_exit_shipmode(); \\r
+ sgm41562_set_batfet_dis(false); \\r
+ sgm41562_set_charge_en(false); \\r
+ sgm41562_set_hiz_en(false); \\r
+ } else { \\r
+ sgm41562_set_charge_en(true); \\r
+ sgm41562_set_hiz_en(true); \\r
+ sgm41562_set_batfet_dis(false); \\r
+ } \\r
+ } while (0)\r
+\r
+#define SGM41562_CC_READ_ICHG_MA(p_ma) \\r
+ sgm41562_read_chrg_ichg_mA(p_ma)\r
+\r
+#define SGM41562_CC_HW_IS_ACTIVELY_CHARGING() \\r
+ (sgm41562_read_chrg_stat_fast_chrg() || sgm41562_read_chrg_stat_pre_chrg())\r
+\r
+#define SGM41562_CC_READ_STATUS(st) \\r
+ do { \\r
+ if ((st) != NULL) { \\r
+ (st)->vbus_pg = sgm41562_read_status_vbus_pg() ? 1 : 0; \\r
+ (st)->chrg_active = (sgm41562_read_chrg_stat_fast_chrg() || \\r
+ sgm41562_read_chrg_stat_pre_chrg()) ? 1 : 0; \\r
+ (st)->chrg_done = sgm41562_read_chrg_stat_chrg_done() ? 1 : 0; \\r
+ } \\r
+ } while (0)\r
+/** @} */\r
+\r
#ifdef __cplusplus\r
}\r
#endif\r
switch (g_charge_ic_type) {
case CHARGE_IC_TYPE_HP4570:
#if defined(ENABLE_HP4570)
- if (enable_charge) {
- hp4570n_set_hiz_en(false);
- hp4570n_set_ceb_en(true);
- } else {
- hp4570n_set_ceb_en(false);
- hp4570n_set_hiz_en(true);
- }
+ HP4570_CC_SET_CYCLE_PATH(enable_charge);
#endif
break;
case CHARGE_IC_TYPE_SGM41562:
#if defined(ENABLE_SGM41562)
- if (enable_charge) {
- sgm41562_exit_shipmode();
- sgm41562_set_batfet_dis(false);
- sgm41562_set_charge_en(false);
- sgm41562_set_hiz_en(false);
- } else {
- sgm41562_set_charge_en(true);
- sgm41562_set_hiz_en(true);
- sgm41562_set_batfet_dis(false);
- }
+ SGM41562_CC_SET_CYCLE_PATH(enable_charge);
#endif
break;
default:
switch (g_charge_ic_type) {
case CHARGE_IC_TYPE_HP4570:
#if defined(ENABLE_HP4570)
- return hp4570n_read_chrg_ichg_mA(current_mA);
+ return HP4570_CC_READ_ICHG_MA(current_mA);
#else
return false;
#endif
case CHARGE_IC_TYPE_SGM41562:
#if defined(ENABLE_SGM41562)
- return sgm41562_read_chrg_ichg_mA(current_mA);
+ return SGM41562_CC_READ_ICHG_MA(current_mA);
#else
return false;
#endif
switch (g_charge_ic_type) {
case CHARGE_IC_TYPE_HP4570:
#if defined(ENABLE_HP4570)
- if (hp4570n_read_chrg_stat_fast_chrg() || hp4570n_read_chrg_stat_pre_chrg() ||
- hp4570n_read_chrg_stat_dead_chrg()) {
- return true;
- }
- return false;
+ return HP4570_CC_HW_IS_ACTIVELY_CHARGING();
#else
return false;
#endif
case CHARGE_IC_TYPE_SGM41562:
#if defined(ENABLE_SGM41562)
- return sgm41562_read_chrg_stat_fast_chrg() || sgm41562_read_chrg_stat_pre_chrg();
+ return SGM41562_CC_HW_IS_ACTIVELY_CHARGING();
#else
return false;
#endif
return false;
}
+bool charge_ic_read_cc_status(charge_ic_cc_status_t *out)
+{
+ if (out == NULL || g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+ return false;
+ }
+
+ out->vbus_pg = 0;
+ out->chrg_active = 0;
+ out->chrg_done = 0;
+
+ switch (g_charge_ic_type) {
+ case CHARGE_IC_TYPE_HP4570:
+#if defined(ENABLE_HP4570)
+ HP4570_CC_READ_STATUS(out);
+ return true;
+#else
+ return false;
+#endif
+ case CHARGE_IC_TYPE_SGM41562:
+#if defined(ENABLE_SGM41562)
+ SGM41562_CC_READ_STATUS(out);
+ return true;
+#else
+ return false;
+#endif
+ default:
+ return false;
+ }
+}
+
+uint8_t charge_ic_get_display_id(void)
+{
+ if (g_charge_ic_type == CHARGE_IC_TYPE_NONE) {
+ return 0;
+ }
+
+ uint8_t id = charge_ic_get_id();
+ return (id == 0x2 || id == 0x4) ? 1 : 0;
+}
+
#endif /* ENABLE_CC_CYCLE */
#include <stdbool.h>
#include "errcode.h"
#include "charge_ic_config.h"
+#include "charge_ic_cc_ops.h"
#ifdef __cplusplus
extern "C" {
/** @brief 拷机充电阶段是否应结束(SOC 满或 CHG_DONE) */
bool charge_ic_should_finish_cc_charging(uint8_t soc, uint8_t soc_full, uint8_t chg_done_min_soc);
+
+/** @brief 读拷机/产测 IC 状态快照 */
+bool charge_ic_read_cc_status(charge_ic_cc_status_t *out);
+
+/** @brief 产测/快照展示用 charge IC 标识(已识别为 HP4570/SGM41562 时为 1) */
+uint8_t charge_ic_get_display_id(void);
#endif
#ifdef __cplusplus
${ROOT_DIR}/zhihui/services/battery/hal
${ROOT_DIR}/zhihui/services/battery/service
${ROOT_DIR}/zhihui/drivers/charge
- ${ROOT_DIR}/zhihui/drivers/charge/hp4570
- ${ROOT_DIR}/zhihui/drivers/charge/sgm41562
${ROOT_DIR}/zhihui/services/gnss/inc
${ROOT_DIR}/application/brandy/brandy_standard
${ROOT_DIR}/application/wearable/fd272/service/power_manager/include
#include "pm.h"
#endif
-#ifdef ENABLE_HP4570
-#include "hp4570.h"
-#endif
-
-#ifdef ENABLE_SGM41562
-#include "sgm41562.h"
-#endif
-
#if defined(SUPPORT_GNSS)
#include "gnss_ctl.h"
#endif
static uint8_t cc_read_charge_ic_id(void)
{
-#ifdef SUPPORT_BATTERY_SERVICE
- uint8_t id = charge_ic_get_id();
- return (id == 0x2 || id == 0x4) ? 1 : 0;
+#if defined(SUPPORT_BATTERY_SERVICE) && defined(ENABLE_CC_CYCLE)
+ return charge_ic_get_display_id();
#else
return 0;
#endif
{
float v = 0.0f;
float t = 0.0f;
+ charge_ic_cc_status_t cc_status = {0};
if (voltage != NULL) {
*voltage = 0.0f;
if (charge_id != NULL) {
*charge_id = cc_read_charge_ic_id();
}
-#ifdef SUPPORT_BATTERY_SERVICE
- if (charge_ic_get_type() == CHARGE_IC_TYPE_HP4570) {
-#ifdef ENABLE_HP4570
- if (vbus_pg != NULL) {
- *vbus_pg = hp4570n_read_status_vbus_pg() ? 1 : 0;
- }
- if (chrg_fast != NULL) {
- *chrg_fast = hp4570n_read_chrg_stat_fast_chrg() ? 1 : 0;
- }
- if (chrg_done != NULL) {
- *chrg_done = hp4570n_read_chrg_stat_chrg_done() ? 1 : 0;
- }
-#endif
- } else if (charge_ic_get_type() == CHARGE_IC_TYPE_SGM41562) {
-#ifdef ENABLE_SGM41562
- if (vbus_pg != NULL) {
- *vbus_pg = sgm41562_read_status_vbus_pg() ? 1 : 0;
- }
- if (chrg_fast != NULL) {
- *chrg_fast = (sgm41562_read_chrg_stat_fast_chrg() ||
- sgm41562_read_chrg_stat_pre_chrg()) ? 1 : 0;
- }
- if (chrg_done != NULL) {
- *chrg_done = sgm41562_read_chrg_stat_chrg_done() ? 1 : 0;
- }
+#ifdef ENABLE_CC_CYCLE
+ (void)charge_ic_read_cc_status(&cc_status);
#endif
- } else {
- if (vbus_pg != NULL) {
- *vbus_pg = 0;
- }
- if (chrg_fast != NULL) {
- *chrg_fast = 0;
- }
- if (chrg_done != NULL) {
- *chrg_done = 0;
- }
- }
-#else
if (vbus_pg != NULL) {
- *vbus_pg = 0;
+ *vbus_pg = cc_status.vbus_pg;
}
if (chrg_fast != NULL) {
- *chrg_fast = 0;
+ *chrg_fast = cc_status.chrg_active;
}
if (chrg_done != NULL) {
- *chrg_done = 0;
+ *chrg_done = cc_status.chrg_done;
}
-#endif
}
static void cc_capture_defect_snapshot(uint8_t defect_type, uint8_t soc, uint32_t now)