write
can now open a monitor right after flashing
This commit is contained in:
@@ -73,7 +73,11 @@ pub struct ArgWrite {
|
||||
|
||||
#[argp(switch)]
|
||||
#[argp(description = "Write individual sections to Flash rather than performing a single write. Only applies to Intel HEX.")]
|
||||
pub write_individual: bool
|
||||
pub write_individual: bool,
|
||||
|
||||
#[argp(switch)]
|
||||
#[argp(description = "Open a serial monitor right after flashing.")]
|
||||
pub monitor: bool
|
||||
}
|
||||
|
||||
#[derive(FromArgs)]
|
||||
|
27
src/main.rs
27
src/main.rs
@@ -14,6 +14,7 @@ use monitor::Monitor;
|
||||
|
||||
mod target;
|
||||
use target::{PhysicalTarget, Target};
|
||||
use termion::event::Key;
|
||||
|
||||
mod utils;
|
||||
|
||||
@@ -132,9 +133,9 @@ pub fn write_chip_chunk(data: &[u8], target: &mut impl Target, mut start: usize,
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error> {
|
||||
fn write_chip_data(args: &ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error> {
|
||||
if args.bin {
|
||||
let mut file = std::fs::read(args.path)?;
|
||||
let mut file = std::fs::read(&args.path)?;
|
||||
|
||||
let size = args.end - args.start + 1;
|
||||
|
||||
@@ -145,7 +146,7 @@ fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error>
|
||||
return write_chip_chunk(&file, target, args.start, !args.skip_verify)
|
||||
}
|
||||
|
||||
let hexreader = IntelHexReader::init(std::fs::File::open(args.path)?);
|
||||
let hexreader = IntelHexReader::init(std::fs::File::open(&args.path)?);
|
||||
|
||||
if args.write_individual {
|
||||
let mut last_addr = 0;
|
||||
@@ -198,6 +199,24 @@ fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error>
|
||||
write_chip_chunk(&buf[first_addr..=last_addr], target, first_addr, !args.skip_verify)
|
||||
}
|
||||
|
||||
fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error> {
|
||||
loop {
|
||||
write_chip_data(&args, target)?;
|
||||
|
||||
if !args.monitor { break }
|
||||
|
||||
let cause = Monitor::new()
|
||||
.add_hook(Key::Ctrl('f'), "Re-flash target")
|
||||
.run(target.port())?;
|
||||
|
||||
if cause != Key::Ctrl('f') { break }
|
||||
|
||||
target.resync_target()?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn erase_chip(_args: ArgErase, target: &mut PhysicalTarget) -> Result<(), Error> {
|
||||
target.erase()?;
|
||||
|
||||
@@ -206,8 +225,6 @@ fn erase_chip(_args: ArgErase, target: &mut PhysicalTarget) -> Result<(), Error>
|
||||
|
||||
fn monitor_chip(_args: ArgMonitor, target: &mut PhysicalTarget) -> Result<(), Error> {
|
||||
let _ = Monitor::new().run(target.port())?;
|
||||
target.resync_target().unwrap();
|
||||
target.read_info(0x00, 0x00).unwrap();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@@ -21,8 +21,9 @@ impl Monitor {
|
||||
Self { hooks }
|
||||
}
|
||||
|
||||
pub fn add_hook(&mut self, key: Key, desc: &'static str) {
|
||||
pub fn add_hook(&mut self, key: Key, desc: &'static str) -> &mut Self {
|
||||
self.hooks.push((key, desc));
|
||||
self
|
||||
}
|
||||
|
||||
pub fn run(&mut self, port: &mut SerialPort) -> Result<Key, Error> {
|
||||
@@ -32,6 +33,7 @@ impl Monitor {
|
||||
port.set_dtr(false)?;
|
||||
port.set_rts(false)?;
|
||||
|
||||
println!();
|
||||
println!("Monitor controls:");
|
||||
|
||||
for (key, desc) in &self.hooks {
|
||||
|
Reference in New Issue
Block a user