@@ -40,6 +40,7 @@ use crate::chromium_ec::commands::DeckStateMode;
4040use crate :: chromium_ec:: commands:: FpLedBrightnessLevel ;
4141use crate :: chromium_ec:: commands:: RebootEcCmd ;
4242use crate :: chromium_ec:: commands:: RgbS ;
43+ use crate :: chromium_ec:: commands:: { PS2_EMULATION_AUTO , PS2_EMULATION_DISABLE , PS2_EMULATION_FORCE_ENABLE } ;
4344use crate :: chromium_ec:: commands:: TabletModeOverride ;
4445use crate :: chromium_ec:: EcResponseStatus ;
4546use crate :: chromium_ec:: { print_err, EcFlashType } ;
@@ -80,6 +81,14 @@ use crate::chromium_ec::{CrosEc, CrosEcDriverType, HardwareDeviceType};
8081#[ cfg( feature = "uefi" ) ]
8182use 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 ) ]
8594pub 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 ,
0 commit comments