From 46a072a7ae48464c18a6f5c7d215141157664582 Mon Sep 17 00:00:00 2001 From: huangcm <1263938474@qq.com> Date: Fri, 28 Mar 2025 03:34:08 +0000 Subject: [PATCH] feat(battery): fix battery boot on & cap --- longan/brandy/brandy-2.0/u-boot-2018/board/sunxi/power_manage.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 56 insertions(+), 2 deletions(-) diff --git a/longan/brandy/brandy-2.0/u-boot-2018/board/sunxi/power_manage.c b/longan/brandy/brandy-2.0/u-boot-2018/board/sunxi/power_manage.c index e24c9b8..23ba577 100644 --- a/longan/brandy/brandy-2.0/u-boot-2018/board/sunxi/power_manage.c +++ b/longan/brandy/brandy-2.0/u-boot-2018/board/sunxi/power_manage.c @@ -11,6 +11,8 @@ #include <spare_head.h> #include <sunxi_display2.h> #include <console.h> +#include <sunxi_power/pmu_axp81X.h> + /* * Global data (for the gd->bd) */ @@ -411,16 +413,55 @@ return pmu_set_voltage(name, 0, onoff); } +int pmu_axp707_get_poweron_source(void) +{ + int reg_value = 0; + reg_value = pmu_get_reg_value(AXP81X_OTG_STATUS); + printf("kickpi axp707 reason %x \n", reg_value); + pmu_set_reg_value(AXP81X_OTG_STATUS, 0xff); + printf("kickpi after clean reason %x \n", pmu_get_reg_value(AXP81X_OTG_STATUS)); + + if (reg_value & (1 << 0)) { + return AXP_BOOT_SOURCE_BUTTON; + } else if (reg_value & (1 << 1)) { + return AXP_BOOT_SOURCE_CHARGER; + } else if (reg_value & (1 << 2)) { + return AXP_BOOT_SOURCE_BATTERY; + } + return -1; +} + +int runtime_tick(void); +int pmu_axp707_get_battery_probe(void) +{ + int reg_value = 0; + int old_time = runtime_tick(); + while ((runtime_tick() - old_time) < 2000) { + reg_value = pmu_get_reg_value(AXP81X_MODE_CHGSTATUS); + } + + /*bit4 determines whether bit5 is valid*/ + /*bit5 determines whether bat is exist*/ + if ((reg_value & (1<<4)) && (reg_value & (1<<5))) + return 1; + + return 0; +} int sunxi_update_axp_info(void) { int val = -1; char bootreason[16] = {0}; int ret = 0, bat_exist = 0; + int dcin_exist = pmu_get_reg_value(AXP81X_STATUS); ret = script_parser_fetch(FDT_PATH_POWER_SPLY, "battery_exist", &bat_exist, 1); - if (ret < 0) - bat_exist = 1; + if (ret < 0) { + bat_exist = pmu_axp707_get_battery_probe(); + printf("kickpi detect battery_exist = %d, AXP81X_STATUS = %x\n", bat_exist, dcin_exist); + } else { + printf("force set battery_exist = %d\n", bat_exist); + } #ifdef CONFIG_SUNXI_BMU #ifdef CONFIG_AXP_LATE_INFO @@ -429,10 +470,21 @@ val = gd->pmu_saved_status; #endif #endif + printf("kickpi pmu_get_sys_mode = %d\n", pmu_get_sys_mode()); if ((val == -1) && (pmu_get_sys_mode() == SUNXI_CHARGING_FLAG)) { val = AXP_BOOT_SOURCE_CHARGER; pmu_set_sys_mode(0); } + + if (bat_exist == 1) { + /* When the battery exists, it can only be turned on by power key */ + if (pmu_axp707_get_poweron_source() != AXP_BOOT_SOURCE_BUTTON) { + val = AXP_BOOT_SOURCE_CHARGER; + pmu_set_sys_mode(0); + printf("kickpi[bat_exist] not power key up when boot on \n"); + } + } + switch (val) { case AXP_BOOT_SOURCE_BUTTON: strncpy(bootreason, "button", sizeof("button")); @@ -456,6 +508,8 @@ break; } env_set("bootreason", bootreason); + + printf("kickpi bootreason = %s / val = %d \n", bootreason, val); return 0; } -- Gitblit v1.6.2