diff --git a/tool/src/ec.rs b/tool/src/ec.rs index 7b2fe5b..9bc43ef 100644 --- a/tool/src/ec.rs +++ b/tool/src/ec.rs @@ -16,7 +16,7 @@ pub enum Cmd { Probe = 1, Board = 2, Version = 3, - Debug = 4, + Print = 4, Spi = 5, Reset = 6, } @@ -151,6 +151,23 @@ impl Ec { Ok(i) } + pub unsafe fn print(&mut self, data: &[u8]) -> Result { + let flags = 0; + for chunk in data.chunks(256 - 4) { + for i in 0..chunk.len() { + self.write(i as u8 + 4, chunk[i]); + } + + self.write(2, flags); + self.write(3, chunk.len() as u8); + self.command(Cmd::Print)?; + if self.read(3) != chunk.len() as u8 { + return Err(Error::Verify); + } + } + Ok(data.len()) + } + pub unsafe fn spi(&mut self, target: SpiTarget, scratch: bool) -> Result, Error> { let mut spi = EcSpi { ec: self, diff --git a/tool/src/main.rs b/tool/src/main.rs index 4906133..1ef633e 100644 --- a/tool/src/main.rs +++ b/tool/src/main.rs @@ -262,10 +262,23 @@ unsafe fn info() -> Result<(), Error> { Ok(()) } +unsafe fn print(message: &[u8]) -> Result<(), Error> { + iopl(); + + let mut ec = Ec::new( + StdTimeout::new(Duration::new(1, 0)), + )?; + + ec.print(message)?; + + Ok(()) +} + fn usage() { eprintln!(" console"); eprintln!(" flash [file]"); eprintln!(" info"); + eprintln!(" print [message]"); } fn main() { @@ -300,6 +313,16 @@ fn main() { process::exit(1); }, }, + "print" => for mut arg in args { + arg.push('\n'); + match unsafe { print(&arg.as_bytes()) } { + Ok(()) => (), + Err(err) => { + eprintln!("failed to print '{}': {:X?}", arg, err); + process::exit(1); + }, + } + }, _ => { eprintln!("unknown subcommand '{}'", arg); usage();