use gdbstub::{
arch::Arch,
target::{TargetError, ext::flash::Flash},
};
use probe_rs::flashing::DownloadOptions;
use super::RuntimeTarget;
impl Flash for RuntimeTarget<'_> {
fn flash_erase(
&mut self,
_start_addr: <Self::Arch as Arch>::Usize,
_length: <Self::Arch as Arch>::Usize,
) -> gdbstub::target::TargetResult<(), Self> {
let _drop = self.flash_loader.take();
Ok(())
}
fn flash_write(
&mut self,
start_addr: <Self::Arch as Arch>::Usize,
data: &[u8],
) -> gdbstub::target::TargetResult<(), Self> {
let flash_loader = self
.flash_loader
.get_or_insert_with(|| self.session.lock().target().flash_loader());
flash_loader.add_data(start_addr, data).map_err(|e| {
tracing::error!(
"GDB flash_write failed to stage {} bytes at {:#010x}: {:#}",
data.len(),
start_addr,
e
);
TargetError::NonFatal
})?;
Ok(())
}
fn flash_done(&mut self) -> gdbstub::target::TargetResult<(), Self> {
let flash_loader = self.flash_loader.as_mut().ok_or(TargetError::NonFatal)?;
let mut session = self.session.lock();
flash_loader
.commit(&mut session, DownloadOptions::default())
.map_err(|e| {
tracing::error!("GDB flash_done failed to commit flash programming: {:#}", e);
TargetError::NonFatal
})?;
let _drop = self.flash_loader.take();
Ok(())
}
}