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 ==================== */ /* ==================== 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) static void app_adc_charge_process(void)
{ {
uint16_t val = ADC_ReadChannel(ADC_CHANNEL_1) >> 5; 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) if (usb_charging_state != 1)
{ {
usb_charging_state = 1; usb_charging_state = 1;
usb_charging_laststate = 1;
if (powon) if (powon)
{ {
MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, usb_charging_laststate, 0); 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迟滞防抖仅状态跳变时执行一次 */ /* 拔掉充电阈值40迟滞防抖仅状态跳变时执行一次 */
@ -237,19 +253,18 @@ static void app_adc_charge_process(void)
if (usb_charging_state != 0) if (usb_charging_state != 0)
{ {
usb_charging_state = 0; usb_charging_state = 0;
usb_charging_laststate = 0;
// 开机场景:发送状态消息
if (powon) 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 else
{ {
/* 通知 UI 熄灭充电页并关主电 */
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 0, 0);
BSP_MainPowerEnable(0); BSP_MainPowerEnable(0);
} }
usb_charging_laststate = 0;
} }
} }
} }

View File

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

View File

@ -228,6 +228,25 @@ static void PowerOff(void)
CurrUIProcress = IdleProcess; CurrUIProcress = IdleProcess;
MainTask_Sendmsg(MSG_ID_POWER_OFF, 0, 0, 0); MainTask_Sendmsg(MSG_ID_POWER_OFF, 0, 0, 0);
LOG_I("PWR", "power_off done (soft-off, no reset)"); 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() void Power_Key_Scan()
@ -236,13 +255,32 @@ void Power_Key_Scan()
uint32_t now = rt_tick_get(); uint32_t now = rt_tick_get();
uint32_t holdtick = 0; uint32_t holdtick = 0;
/* 复位/烧录后自动开机一次,避免黑屏干等长按;正常关机后下电再上电仍走此路径 */ /* 复位/烧录后:无 USB 则自动开机一次;有 Type-C 则进关机充电画面(勿进 Logo */
if (powon == false && pwr_key_state == KEY_STATE_IDLE && pwr_press_tick == 0) if (powon == false && pwr_key_state == KEY_STATE_IDLE && pwr_press_tick == 0)
{ {
static uint8_t s_auto_poweron_pending = 1; static uint8_t s_auto_poweron_pending = 1;
if (s_auto_poweron_pending) if (s_auto_poweron_pending)
{ {
uint8_t i;
s_auto_poweron_pending = 0; 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"); LOG_I("PWR", "auto power_on");
PowerOn(); PowerOn();
pwr_key_state = KEY_STATE_NONE; /* 忽略开机瞬间可能残留的按键电平 */ pwr_key_state = KEY_STATE_NONE; /* 忽略开机瞬间可能残留的按键电平 */

View File

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