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