From a2e005211ae6c3250b07ca49bb559ce78dd4a8dd Mon Sep 17 00:00:00 2001 From: richardclli Date: Wed, 17 Jun 2026 11:19:48 +0800 Subject: [PATCH 1/2] fix(pl18): add timeout to isChargerActive() to prevent hang when battery missing Add 2-second timeout to the blocking charger detection loops in isChargerActive(). When no battery is installed and the radio is USB-powered, the TP5100 charger IC status pins can oscillate due to capacitive-load charge/discharge cycling. This causes the consecutive-sample debounce counter in chargerDetection() to perpetually reset, hanging the boot before LCD initialization results in a blank screen. Fixes EL18 blank screen when powered via USB without batteries. --- radio/src/targets/pl18/battery_driver.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/pl18/battery_driver.cpp b/radio/src/targets/pl18/battery_driver.cpp index bdd4688b9a9..59a74bd7611 100644 --- a/radio/src/targets/pl18/battery_driver.cpp +++ b/radio/src/targets/pl18/battery_driver.cpp @@ -298,14 +298,16 @@ uint16_t get_battery_charge_state() bool isChargerActive() { #if defined(WIRELESS_CHARGER) - while (!(uCharger.isChargerDetectionReady && wCharger.isChargerDetectionReady)) + uint16_t timeout = 200; + while (!(uCharger.isChargerDetectionReady && wCharger.isChargerDetectionReady) && timeout--) { get_battery_charge_state(); delay_ms(10); } return uCharger.hasCharger || wCharger.hasCharger; #else - while (!uCharger.isChargerDetectionReady) + uint16_t timeout = 200; + while (!uCharger.isChargerDetectionReady && timeout--) { get_battery_charge_state(); delay_ms(10); From 7eeec5672d3490de846055291f4e6781f30a8aef Mon Sep 17 00:00:00 2001 From: richardclli Date: Wed, 17 Jun 2026 13:05:32 +0800 Subject: [PATCH 2/2] Update timeout to 400ms --- radio/src/targets/pl18/battery_driver.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/pl18/battery_driver.cpp b/radio/src/targets/pl18/battery_driver.cpp index 59a74bd7611..9b5928d0369 100644 --- a/radio/src/targets/pl18/battery_driver.cpp +++ b/radio/src/targets/pl18/battery_driver.cpp @@ -61,6 +61,7 @@ #endif #define WCHARGER_LOW_CURRENT_DELAY_CNT 6000 #define WCHARGER_HIGH_CURRENT_DELAY_CNT 24000 +#define CHARGER_DETECTION_TIMEOUT 40 // 400ms typedef struct { @@ -298,7 +299,7 @@ uint16_t get_battery_charge_state() bool isChargerActive() { #if defined(WIRELESS_CHARGER) - uint16_t timeout = 200; + uint16_t timeout = CHARGER_DETECTION_TIMEOUT; while (!(uCharger.isChargerDetectionReady && wCharger.isChargerDetectionReady) && timeout--) { get_battery_charge_state(); @@ -306,7 +307,7 @@ bool isChargerActive() } return uCharger.hasCharger || wCharger.hasCharger; #else - uint16_t timeout = 200; + uint16_t timeout = CHARGER_DETECTION_TIMEOUT; while (!uCharger.isChargerDetectionReady && timeout--) { get_battery_charge_state();