From 5d5d3356ef530467e53a8b5733062057195ccff5 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 8 Dec 2023 15:57:53 -0700 Subject: [PATCH] Implement usbc_mux_info tool command --- tool/src/ec.rs | 11 +++++++++++ tool/src/main.rs | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/tool/src/ec.rs b/tool/src/ec.rs index 4281c5977..93b9f2ed9 100644 --- a/tool/src/ec.rs +++ b/tool/src/ec.rs @@ -40,6 +40,7 @@ enum Cmd { SecurityGet = 20, SecuritySet = 21, FanTach = 22, + UsbcMuxInfo = 23, } const CMD_SPI_FLAG_READ: u8 = 1 << 0; @@ -328,6 +329,16 @@ impl Ec { self.command(Cmd::SecuritySet, &mut data) } + /// Get USB-C mux info + pub unsafe fn usbc_mux_info(&mut self, port: u8) -> Result { + let mut data = [port, 0, 0]; + self.command(Cmd::UsbcMuxInfo, &mut data)?; + Ok( + (data[1] as u16) | + ((data[2] as u16) << 8) + ) + } + /// Read fan tachometer by fan index pub unsafe fn fan_tach(&mut self, index: u8) -> Result { let mut data = [ diff --git a/tool/src/main.rs b/tool/src/main.rs index c8324c3b4..9cb688d42 100644 --- a/tool/src/main.rs +++ b/tool/src/main.rs @@ -300,6 +300,13 @@ unsafe fn security_set(ec: &mut Ec>, state: SecurityState) -> Re Ok(()) } +unsafe fn usbc_mux_info(ec: &mut Ec>, port: u8) -> Result<(), Error> { + let info = ec.usbc_mux_info(port)?; + println!("{:04X}", info); + + Ok(()) +} + fn parse_color(s: &str) -> Result<(u8, u8, u8), String> { let r = u8::from_str_radix(&s[0..2], 16); let g = u8::from_str_radix(&s[2..4], 16); @@ -411,6 +418,12 @@ fn main() { .possible_values(["lock", "unlock"]) ) ) + .subcommand(SubCommand::with_name("usbc_mux_info") + .arg(Arg::with_name("port") + .value_parser(clap::value_parser!(u8)) + .required(true) + ) + ) .get_matches(); let get_ec = || -> Result<_, Error> { @@ -693,6 +706,16 @@ fn main() { }, } }, + Some(("usbc_mux_info", sub_m)) => { + let port = sub_m.get_one::("port").unwrap(); + match unsafe { usbc_mux_info(&mut ec, *port) } { + Ok(()) => (), + Err(err) => { + eprintln!("failed to get usbc_mux_info {}: {:X?}", port, err); + process::exit(1); + }, + } + }, _ => unreachable!() } }