From e8aaf3de7c244a35b01cb775c76a1073e7bfe5ac Mon Sep 17 00:00:00 2001 From: Daniel Schaefer Date: Wed, 1 Jul 2026 08:58:40 +0800 Subject: [PATCH] --power: Add battery cutoff status Signed-off-by: Daniel Schaefer --- EXAMPLES.md | 1 + framework_lib/src/chromium_ec/command.rs | 2 ++ framework_lib/src/chromium_ec/commands.rs | 18 ++++++++++++++++++ framework_lib/src/power.rs | 15 +++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/EXAMPLES.md b/EXAMPLES.md index 78ab79e..b096f2c 100644 --- a/EXAMPLES.md +++ b/EXAMPLES.md @@ -566,6 +566,7 @@ Add `-vv` for more verbose details. ``` > sudo framework_tool --power +Battery Cutoff: Not cut off Charger Status AC is: not connected Charger Voltage: 17048mV diff --git a/framework_lib/src/chromium_ec/command.rs b/framework_lib/src/chromium_ec/command.rs index 5436d45..14b865b 100644 --- a/framework_lib/src/chromium_ec/command.rs +++ b/framework_lib/src/chromium_ec/command.rs @@ -110,6 +110,8 @@ pub enum EcCommands { GetGpuPcie = 0x3E1E, /// Set gpu bay serial and program structure ProgramGpuEeprom = 0x3E1F, + /// Get battery cutoff (ship mode) status + GetCutoffStatus = 0x3E21, /// Get PD port state from Cypress PD controller GetPdPortState = 0x3E23, /// Read board ID of specific ADC channel diff --git a/framework_lib/src/chromium_ec/commands.rs b/framework_lib/src/chromium_ec/commands.rs index 22263d0..5dc0c91 100644 --- a/framework_lib/src/chromium_ec/commands.rs +++ b/framework_lib/src/chromium_ec/commands.rs @@ -1713,6 +1713,24 @@ pub enum BoardIdType { DGpu1 = 5, } +#[repr(C, packed)] +pub struct EcRequestGetCutoffStatus {} + +#[repr(C, packed)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub struct EcResponseGetCutoffStatus { + /// Non-zero if the battery has been cut off (ship mode), zero otherwise. + /// The EC's battery_is_cut_off() returns a plain boolean here, not the + /// full battery_cutoff_states enum. + pub status: u8, +} + +impl EcRequest for EcRequestGetCutoffStatus { + fn command_id() -> EcCommands { + EcCommands::GetCutoffStatus + } +} + #[repr(C, packed)] pub struct EcRequestReadBoardId { /// See BoardIdType diff --git a/framework_lib/src/power.rs b/framework_lib/src/power.rs index ede511d..17a7f51 100644 --- a/framework_lib/src/power.rs +++ b/framework_lib/src/power.rs @@ -548,7 +548,22 @@ pub fn is_standalone(ec: &CrosEc) -> bool { } } +/// Query battery cutoff (ship mode) status. +pub fn get_cutoff_status(ec: &CrosEc) -> Option { + (EcRequestGetCutoffStatus {}) + .send_command(ec) + .ok() + .map(|res| res.status != 0) +} + pub fn get_and_print_power_info(ec: &CrosEc) -> i32 { + print!("Battery Cutoff: "); + match get_cutoff_status(ec) { + Some(true) => println!("Cut off"), + Some(false) => println!("Not cut off"), + None => println!("Unknown"), + } + if let Some(power_info) = power_info(ec) { print_err_ref(&ec.get_charge_state(&power_info)); print_battery_information(&power_info);