修复充电导致的系统UI堵塞
authorcaisking <caiyqm@qq.com>
Wed, 10 Jun 2026 02:42:39 +0000 (10:42 +0800)
committercaisking <caiyqm@qq.com>
Thu, 11 Jun 2026 04:02:03 +0000 (12:02 +0800)
code/sdk/drivers/chips/brandy/porting/button/button_porting.c
code/sdk/drivers/chips/brandy/porting/include/button_porting.h
code/sdk/zhihui/services/battery/service/battery_service.cpp
code/sdk/zhihui/services/battery/service/battery_service.h

index bdfb32f..534eaaa 100644 (file)
@@ -225,11 +225,17 @@ static bool porting_button_vbus_event_check(void)
     return false;\r
 }\r
 \r
-static charger_plug_event_callback_func_t g_charger_callbackevent = NULL;\r
+static charger_vbus_isr_notify_func_t g_charger_isr_notify = NULL;\r
 static bool charger_plugged = false;\r
 errcode_t uapi_register_charger_event_callback(charger_plug_event_callback_func_t callback)\r
 {\r
-    g_charger_callbackevent = callback;\r
+    unused(callback);\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t uapi_register_charger_vbus_isr_notify(charger_vbus_isr_notify_func_t notify)\r
+{\r
+    g_charger_isr_notify = notify;\r
     return ERRCODE_SUCC;\r
 }\r
 \r
@@ -252,18 +258,16 @@ static void deal_with_vbus_event(void)
 {\r
     if (reg32_getbit(ULP_WKUP_INT_STS, VBUS_INSERT_INTERRUPT_POS) == 1) {\r
         charger_plugged = true;\r
-        if (g_charger_callbackevent != NULL)\r
-        {\r
-            g_charger_callbackevent(1);\r
+        if (g_charger_isr_notify != NULL) {\r
+            g_charger_isr_notify(1);\r
         }\r
         return;\r
     }\r
 \r
     if (reg32_getbit(ULP_WKUP_INT_STS, VBUS_UNPLUG_INNTERRUPT_POS) == 1) {\r
         charger_plugged = false;\r
-        if (g_charger_callbackevent != NULL)\r
-        {\r
-            g_charger_callbackevent(0);\r
+        if (g_charger_isr_notify != NULL) {\r
+            g_charger_isr_notify(0);\r
         }\r
         return;\r
     }\r
index 7b7053f..37174bb 100644 (file)
@@ -81,6 +81,7 @@ typedef enum {
 } startup_reason_t;\r
 \r
 typedef errcode_t (*charger_plug_event_callback_func_t)(uint8_t plug_event);\r
+typedef void (*charger_vbus_isr_notify_func_t)(uint8_t plugged);\r
 button_peripheral_api *button_port_get_api(void);\r
 errcode_t uapi_power_set_mode(power_mode_t pdmode);\r
 errcode_t uapi_power_time_mode(power_time_t time_mode);\r
@@ -91,6 +92,7 @@ errcode_t uapi_disable_alarm(void);
 uint64_t uapi_ulp_systick_get_count(void);\r
 uint64_t uapi_ulp_systick_get_ms(void);\r
 errcode_t uapi_register_charger_event_callback(charger_plug_event_callback_func_t callback);\r
+errcode_t uapi_register_charger_vbus_isr_notify(charger_vbus_isr_notify_func_t notify);\r
 bool uapi_get_charger_plug_status(void);\r
 \r
 /**\r
index ec671bb..f275a91 100644 (file)
@@ -105,6 +105,7 @@ static unsigned long g_app_queue = 0xFFFFFFFF;
 #define BATTERY_CMD_CHARGE_PLUG 0x13
 #define BATTERY_CMD_CHARGE_UNPLUG 0x14
 #define BATTERY_CMD_FIRST_CHECK 0x15
+#define BATTERY_CMD_VBUS_ISR 0x1A
 #define BATTERY_CMD_CHARGE_RECONFIG 0x19
 
 #define BATTERY_LOWPOWER_ALARM_POWERLEVEL 10
@@ -136,6 +137,7 @@ static void dbg_c3c5cc_battery(const char *hypothesisId, const char *location, c
 static void battery_check_timer_callback(void* data);
 errcode_t charger_plug_event_notify(uint8_t plugged);
 errcode_t charger_plug_event_ui_sendmsg_toUI(uint8_t plugged);
+errcode_t battery_charger_plug_event_callback(uint8_t plugged);
 
 
 static BATTERY_DATA_T *bat_t;
@@ -334,6 +336,22 @@ void send_battery_svr_cmd_msg(uint8_t cmd)
     }
     
 }
+
+void battery_notify_vbus_from_isr(uint8_t plugged)
+{
+    if (g_app_queue == 0xFFFFFFFF) {
+        return;
+    }
+
+    common_notify_mail_t mail = {0};
+    mail.comm.app = APP_BUTTON;
+    mail.comm.event = BATTERY_CMD_VBUS_ISR;
+    mail.data[0] = plugged;
+    if (osal_msg_queue_write_copy(g_app_queue, (void *)&mail,
+                                    sizeof(common_notify_mail_t), 0) != OSAL_SUCCESS) {
+        PRINT("[battery][service] VBUS ISR notify failed plugged=%u\r\n", plugged);
+    }
+}
 /**
  * return 0 not charged, 1 charging
 */
@@ -711,6 +729,8 @@ static void battery_check_task(void *arg)
             charger_plug_event_ui_sendmsg_toUI(0);
             // 记录一次充电线拔出时刻的电池数据,用于后续统计充电时间
             battery_save_data();
+        }else if (mail.comm.event == BATTERY_CMD_VBUS_ISR) {
+            battery_charger_plug_event_callback((uint8_t)mail.data[0]);
         }else if(mail.comm.event == BATTERY_CMD_FIRST_CHECK)
         {
             battery_check_chargement();
@@ -917,7 +937,7 @@ errcode_t uapi_battery_init(void)
     g_battery_timer = osTimerNew((osTimerFunc_t)battery_check_timer_callback, osTimerPeriodic, NULL, NULL);
 
     /**下面初始化电池基本数据,充电线基本状态*/
-    uapi_register_charger_event_callback(battery_charger_plug_event_callback);
+    uapi_register_charger_vbus_isr_notify(battery_notify_vbus_from_isr);
 
 
     //开始timer
index 0fa36c0..6176f28 100644 (file)
@@ -73,6 +73,7 @@ int batteryservice_get_cc_discharge_soc_peak(void);
 /* 拷机放电→充电:清 ICHG 缓存并异步重配温控档位 */
 void battery_invalidate_charge_current_cache(void);
 void battery_request_charge_reconfig(void);
+void battery_notify_vbus_from_isr(uint8_t plugged);
 
 #ifdef __cplusplus
 #if __cplusplus