Show full-screen charge UI when USB plugs in while soft-off.

Avoid auto Logo boot on USB reset; enter charge page instead of mode select.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yuquanjun 2026-09-05 19:58:42 +08:00
parent c16a13edc3
commit d960d88147
4 changed files with 73 additions and 13 deletions

View File

@ -214,6 +214,16 @@ static void app_adc_key_process(uint8_t idx)
}
/* ==================== ADC1 in4 ==================== */
/* 快速探测 Type-C / USB 是否接入(关机开机路径共用) */
bool app_adc_usb_is_plugged(void)
{
uint16_t val;
BSP_SelectAdcChannel(4); /* E_ADC1_FUNCTION_USB_CHECK */
Delay_us(20);
val = ADC_ReadChannel(ADC_CHANNEL_1) >> 5;
return (val > 80) ? true : false;
}
static void app_adc_charge_process(void)
{
uint16_t val = ADC_ReadChannel(ADC_CHANNEL_1) >> 5;
@ -224,11 +234,17 @@ static void app_adc_charge_process(void)
if (usb_charging_state != 1)
{
usb_charging_state = 1;
usb_charging_laststate = 1;
if (powon)
{
MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, usb_charging_laststate, 0);
}
usb_charging_laststate = 1;
else
{
/* 关机态插电:立即进全屏充电页,勿走开机 Logo */
LOG_I("CHG", "usb plug while soft-off → charge UI");
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, usb_charging_state, 0);
}
}
}
/* 拔掉充电阈值40迟滞防抖仅状态跳变时执行一次 */
@ -237,19 +253,18 @@ static void app_adc_charge_process(void)
if (usb_charging_state != 0)
{
usb_charging_state = 0;
usb_charging_laststate = 0;
// 开机场景:发送状态消息
if (powon)
{
MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, usb_charging_laststate, 0);
MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, 1, 0);
}
// 关机场景:直接切断主电源
else
{
/* 通知 UI 熄灭充电页并关主电 */
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 0, 0);
BSP_MainPowerEnable(0);
}
usb_charging_laststate = 0;
}
}
}

View File

@ -24,4 +24,5 @@ extern bool usb_charging_laststate;
extern uint8_t percentage;
void app_adc_scan_all(void);
void app_adc_in1_scan_part(uint8_t channel);
bool app_adc_usb_is_plugged(void);
#endif

View File

@ -228,6 +228,25 @@ static void PowerOff(void)
CurrUIProcress = IdleProcess;
MainTask_Sendmsg(MSG_ID_POWER_OFF, 0, 0, 0);
LOG_I("PWR", "power_off done (soft-off, no reset)");
/* 关机时若已插着 Type-C立刻进充电画面 */
{
uint8_t i;
for (i = 0; i < 4; i++)
{
app_adc_in1_scan_part(4);
if (usb_charging_state || app_adc_usb_is_plugged())
break;
rt_thread_mdelay(5);
}
if (usb_charging_state || app_adc_usb_is_plugged())
{
usb_charging_state = 1;
usb_charging_laststate = 1;
LOG_I("PWR", "soft-off with USB → charge UI");
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 1, 0);
}
}
}
void Power_Key_Scan()
@ -236,13 +255,32 @@ void Power_Key_Scan()
uint32_t now = rt_tick_get();
uint32_t holdtick = 0;
/* 复位/烧录后自动开机一次,避免黑屏干等长按;正常关机后下电再上电仍走此路径 */
/* 复位/烧录后:无 USB 则自动开机一次;有 Type-C 则进关机充电画面(勿进 Logo */
if (powon == false && pwr_key_state == KEY_STATE_IDLE && pwr_press_tick == 0)
{
static uint8_t s_auto_poweron_pending = 1;
if (s_auto_poweron_pending)
{
uint8_t i;
s_auto_poweron_pending = 0;
/* 多采几次 USB 检测,避免上电瞬间误判 */
for (i = 0; i < 8; i++)
{
app_adc_in1_scan_part(4);
if (usb_charging_state || app_adc_usb_is_plugged())
break;
rt_thread_mdelay(5);
}
if (usb_charging_state || app_adc_usb_is_plugged())
{
usb_charging_state = 1;
usb_charging_laststate = 1;
LOG_I("PWR", "boot with USB → charge UI (no logo)");
CurrUIProcress = IdleProcess;
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 1, 0);
pwr_key_state = KEY_STATE_NONE;
return;
}
LOG_I("PWR", "auto power_on");
PowerOn();
pwr_key_state = KEY_STATE_NONE; /* 忽略开机瞬间可能残留的按键电平 */

View File

@ -253,8 +253,8 @@ void IdleProcess(DisplayTaskMessage_Type msg)
case MSG_ID_POWOFF_CHARG:
{
static bool flag = 0;
if(flag == 0)
static bool s_charge_ui_drawn = false;
if(!s_charge_ui_drawn)
{
BSP_MainPowerEnable(1);
LCD_WR_REG(0x29); //Display on
@ -263,7 +263,7 @@ void IdleProcess(DisplayTaskMessage_Type msg)
LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_CHARGE_SCREEN_W, UI0902_CHARGE_SCREEN_H,
UI0902_CHARGE_SCREEN_ADDR);
LCD_BLK_Set();
flag = 1;
s_charge_ui_drawn = true;
}
if(usb_charging_state)
{
@ -274,8 +274,14 @@ void IdleProcess(DisplayTaskMessage_Type msg)
LCD_ShowString_AutoAlign(0, 240, 270, Info, LCD_ALIGN_CENTER,
WHITE, UI0902_BG_COLOR, 0, 28);
}
//else
//BSP_MainPowerEnable(0);
else
{
/* 关机充电中拔掉:熄屏,允许下次再进充电页 */
LCD_BLK_Clr();
LCD_FillByColor(0, 0, 240, 320, BLACK);
BSP_MainPowerEnable(0);
s_charge_ui_drawn = false;
}
}
break;