Skip to content

Commit 6eae189

Browse files
committed
Add support for EcRequestPs2EmulationControlV1
Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent d1a0710 commit 6eae189

File tree

5 files changed

+82
-21
lines changed

5 files changed

+82
-21
lines changed

framework_lib/src/chromium_ec/commands.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,6 +1502,10 @@ impl EcRequest<EcResponseChargeLimitControl> for EcRequestChargeLimitControl {
15021502
/// TODO: Use this
15031503
pub const EC_CHARGE_LIMIT_RESTORE: u8 = 0x7F;
15041504

1505+
pub const PS2_EMULATION_AUTO: u8 = 0;
1506+
pub const PS2_EMULATION_DISABLE: u8 = 1;
1507+
pub const PS2_EMULATION_FORCE_ENABLE: u8 = 2;
1508+
15051509
#[repr(C, packed)]
15061510
pub struct EcRequestDisablePs2Emulation {
15071511
pub disable: u8,
@@ -1513,6 +1517,28 @@ impl EcRequest<()> for EcRequestDisablePs2Emulation {
15131517
}
15141518
}
15151519

1520+
#[repr(C, packed)]
1521+
pub struct EcRequestPs2EmulationControlV1 {
1522+
pub mode: u8,
1523+
}
1524+
1525+
#[repr(C, packed)]
1526+
#[derive(Clone, Copy)]
1527+
pub struct EcResponsePs2EmulationStatus {
1528+
pub emulation_disabled: u8,
1529+
pub host_driver_confirmed: u8,
1530+
pub detected_host_packet: u8,
1531+
}
1532+
1533+
impl EcRequest<EcResponsePs2EmulationStatus> for EcRequestPs2EmulationControlV1 {
1534+
fn command_id() -> EcCommands {
1535+
EcCommands::DisablePs2Emulation
1536+
}
1537+
fn command_version() -> u8 {
1538+
1
1539+
}
1540+
}
1541+
15161542
#[repr(u8)]
15171543
#[derive(Debug, FromPrimitive)]
15181544
pub enum FpLedBrightnessLevel {

framework_lib/src/chromium_ec/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,13 @@ impl CrosEc {
745745
.send_command(self)
746746
}
747747

748+
pub fn ps2_emulation_control(
749+
&self,
750+
mode: u8,
751+
) -> EcResult<EcResponsePs2EmulationStatus> {
752+
EcRequestPs2EmulationControlV1 { mode }.send_command(self)
753+
}
754+
748755
pub fn fan_set_rpm(&self, fan: Option<u32>, rpm: u32) -> EcResult<()> {
749756
if let Some(fan_idx) = fan {
750757
EcRequestPwmSetFanTargetRpmV1 { rpm, fan_idx }.send_command(self)

framework_lib/src/commandline/clap_std.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use clap_num::maybe_hex;
1212
use crate::chromium_ec::commands::SetGpuSerialMagic;
1313
use crate::chromium_ec::CrosEcDriverType;
1414
use crate::commandline::{
15-
Cli, ConsoleArg, FpBrightnessArg, HardwareDeviceType, InputDeckModeArg, LogLevel, RebootEcArg,
16-
TabletModeArg,
15+
Cli, ConsoleArg, FpBrightnessArg, HardwareDeviceType, InputDeckModeArg, LogLevel, Ps2ModeArg,
16+
RebootEcArg, TabletModeArg,
1717
};
1818

1919
/// Swiss army knife for Framework laptops
@@ -213,10 +213,10 @@ struct ClapCli {
213213
#[arg(long, value_parser=maybe_hex::<u64>, value_names(["START", "HEXCOLOR"]))]
214214
rgbkbd: Vec<u64>,
215215

216-
/// Control PS2 touchpad emulation (DEBUG COMMAND, if touchpad not working, reboot system)
216+
/// Control PS2 touchpad emulation (auto/disable/enable)
217217
#[clap(value_enum, hide(true))]
218218
#[arg(long)]
219-
ps2_enable: Option<bool>,
219+
ps2_mode: Option<Ps2ModeArg>,
220220

221221
/// Set tablet mode override
222222
#[clap(value_enum)]
@@ -519,7 +519,7 @@ pub fn parse(args: &[String]) -> Cli {
519519
kblight: args.kblight,
520520
remap_key,
521521
rgbkbd: args.rgbkbd,
522-
ps2_enable: args.ps2_enable,
522+
ps2_mode: args.ps2_mode,
523523
tablet_mode: args.tablet_mode,
524524
touchscreen_enable: args.touchscreen_enable,
525525
stylus_battery: args.stylus_battery,

framework_lib/src/commandline/mod.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use crate::chromium_ec::commands::DeckStateMode;
4040
use crate::chromium_ec::commands::FpLedBrightnessLevel;
4141
use crate::chromium_ec::commands::RebootEcCmd;
4242
use crate::chromium_ec::commands::RgbS;
43+
use crate::chromium_ec::commands::{PS2_EMULATION_AUTO, PS2_EMULATION_DISABLE, PS2_EMULATION_FORCE_ENABLE};
4344
use crate::chromium_ec::commands::TabletModeOverride;
4445
use crate::chromium_ec::EcResponseStatus;
4546
use crate::chromium_ec::{print_err, EcFlashType};
@@ -80,6 +81,14 @@ use crate::chromium_ec::{CrosEc, CrosEcDriverType, HardwareDeviceType};
8081
#[cfg(feature = "uefi")]
8182
use core::prelude::rust_2021::derive;
8283

84+
#[cfg_attr(not(feature = "uefi"), derive(clap::ValueEnum))]
85+
#[derive(Clone, Debug, PartialEq)]
86+
pub enum Ps2ModeArg {
87+
Auto,
88+
Disable,
89+
Enable,
90+
}
91+
8392
#[cfg_attr(not(feature = "uefi"), derive(clap::ValueEnum))]
8493
#[derive(Clone, Debug, PartialEq)]
8594
pub enum TabletModeArg {
@@ -208,7 +217,7 @@ pub struct Cli {
208217
pub kblight: Option<Option<u8>>,
209218
pub remap_key: Option<(u8, u8, u16)>,
210219
pub rgbkbd: Vec<u64>,
211-
pub ps2_enable: Option<bool>,
220+
pub ps2_mode: Option<Ps2ModeArg>,
212221
pub tablet_mode: Option<TabletModeArg>,
213222
pub touchscreen_enable: Option<bool>,
214223
pub stylus_battery: bool,
@@ -296,7 +305,7 @@ pub fn parse(args: &[String]) -> Cli {
296305
kblight: cli.kblight,
297306
remap_key: cli.remap_key,
298307
rgbkbd: cli.rgbkbd,
299-
ps2_enable: cli.ps2_enable,
308+
ps2_mode: cli.ps2_mode,
300309
// tablet_mode
301310
// touchscreen_enable
302311
stylus_battery: cli.stylus_battery,
@@ -1441,8 +1450,25 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 {
14411450
});
14421451
ec.rgbkbd_set_color(start_key, colors.collect()).unwrap();
14431452
}
1444-
} else if let Some(enable) = args.ps2_enable {
1445-
print_err(ec.ps2_emulation_enable(enable));
1453+
} else if let Some(ps2_arg) = &args.ps2_mode {
1454+
let mode = match ps2_arg {
1455+
Ps2ModeArg::Auto => PS2_EMULATION_AUTO,
1456+
Ps2ModeArg::Disable => PS2_EMULATION_DISABLE,
1457+
Ps2ModeArg::Enable => PS2_EMULATION_FORCE_ENABLE,
1458+
};
1459+
match ec.ps2_emulation_control(mode) {
1460+
Ok(status) => {
1461+
println!("PS2 Emulation: {}", if status.emulation_disabled != 0 { "Disabled" } else { "Auto" });
1462+
println!("Host Driver: {}", if status.host_driver_confirmed != 0 { "Confirmed" } else { "Not Confirmed" });
1463+
println!("Host I2C Activity: {}", if status.detected_host_packet != 0 { "Detected" } else { "Not Detected" });
1464+
}
1465+
Err(e) => {
1466+
// Fall back to v0 if EC firmware doesn't support v1
1467+
println!("Note: EC firmware does not support status query ({:?})", e);
1468+
let enable = !matches!(ps2_arg, Ps2ModeArg::Disable);
1469+
print_err(ec.ps2_emulation_enable(enable));
1470+
}
1471+
}
14461472
} else if let Some(tablet_arg) = &args.tablet_mode {
14471473
let mode = match tablet_arg {
14481474
TabletModeArg::Auto => TabletModeOverride::Default,

framework_lib/src/commandline/uefi.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::chromium_ec::commands::SetGpuSerialMagic;
1212
use crate::chromium_ec::{CrosEcDriverType, HardwareDeviceType};
1313
use crate::commandline::{Cli, LogLevel};
1414

15-
use super::{ConsoleArg, FpBrightnessArg, InputDeckModeArg, RebootEcArg, TabletModeArg};
15+
use super::{ConsoleArg, FpBrightnessArg, InputDeckModeArg, Ps2ModeArg, RebootEcArg, TabletModeArg};
1616

1717
/// Get commandline arguments from UEFI environment
1818
pub fn get_args(bs: &BootServices, image_handle: Handle) -> Vec<String> {
@@ -71,7 +71,7 @@ pub fn parse(args: &[String]) -> Cli {
7171
kblight: None,
7272
remap_key: None,
7373
rgbkbd: vec![],
74-
ps2_enable: None,
74+
ps2_mode: None,
7575
tablet_mode: None,
7676
touchscreen_enable: None,
7777
stylus_battery: false,
@@ -370,23 +370,25 @@ pub fn parse(args: &[String]) -> Cli {
370370
println!("--rgbkbd requires at least 2 arguments, the start key and an RGB value");
371371
vec![]
372372
}
373-
} else if arg == "--ps2-enable" {
374-
cli.ps2_enable = if args.len() > i + 1 {
375-
let enable_arg = &args[i + 1];
376-
if enable_arg == "true" {
377-
Some(true)
378-
} else if enable_arg == "false" {
379-
Some(false)
373+
} else if arg == "--ps2-mode" {
374+
cli.ps2_mode = if args.len() > i + 1 {
375+
let mode_arg = &args[i + 1];
376+
if mode_arg == "auto" {
377+
Some(Ps2ModeArg::Auto)
378+
} else if mode_arg == "disable" {
379+
Some(Ps2ModeArg::Disable)
380+
} else if mode_arg == "enable" {
381+
Some(Ps2ModeArg::Enable)
380382
} else {
381383
println!(
382-
"Need to provide a value for --ps2-enable: '{}'. {}",
384+
"Need to provide a value for --ps2-mode: '{}'. {}",
383385
args[i + 1],
384-
"Must be `true` or `false`",
386+
"Must be `auto`, `disable` or `enable`",
385387
);
386388
None
387389
}
388390
} else {
389-
println!("Need to provide a value for --tablet-mode. One of: `auto`, `tablet` or `laptop`");
391+
println!("Need to provide a value for --ps2-mode. One of: `auto`, `disable` or `enable`");
390392
None
391393
};
392394
found_an_option = true;

0 commit comments

Comments
 (0)