pub struct FieldSafeArm {
probe: Box<FieldSafeProbe>,
table: Option<DapTable>,
}Expand description
The ARM debug interface over a FieldSafeProbe.
Serves DP/AP register traffic from a DapTable and memory through the
base’s 32-bit memory commands (via FieldSafeMemory). Only the default
debug port and AP0 exist.
Fields§
§probe: Box<FieldSafeProbe>The probe, owned while the interface is in use and handed back by
[ArmDebugInterface::close].
table: Option<DapTable>The DAP answers for the part, chosen on first use from its chip ID.
Implementations§
Source§impl FieldSafeArm
impl FieldSafeArm
Sourcefn table(&mut self) -> Result<DapTable, ArmError>
fn table(&mut self) -> Result<DapTable, ArmError>
The DAP table for the connected part: L4 or U3 by DBGMCU IDCODE, read with the debug-register command every base supports.
Cached after the first success, so the part is identified once per session.
§Errors
[ArmError::Probe] with “chip identification” if neither IDCODE
address reads plausibly (no tag, an unpowered tag, or another part).
Sourcefn read_words(&mut self, address: u32, data: &mut [u32]) -> Result<(), ArmError>
fn read_words(&mut self, address: u32, data: &mut [u32]) -> Result<(), ArmError>
Reads data.len() words at address with READMEM_32BIT, in chunks
of at most CHUNK bytes.
address must be word-aligned, as probe-rs guarantees for 32-bit
accesses. The core is not halted for the read.
§Errors
[ArmError::Probe] (“memory read”) if any chunk fails, e.g. on a bus
fault; data is then left unchanged.
Sourcefn read_bytes(&mut self, address: u32, data: &mut [u8]) -> Result<(), ArmError>
fn read_bytes(&mut self, address: u32, data: &mut [u8]) -> Result<(), ArmError>
Reads data.len() bytes at any alignment with whole-word reads.
Reads the enclosing aligned words and copies out the bytes asked for, so up to 3 bytes either side are also read from the target.
§Errors
As read_words.
Sourcefn write_bytes(&mut self, address: u32, data: &[u8]) -> Result<(), ArmError>
fn write_bytes(&mut self, address: u32, data: &[u8]) -> Result<(), ArmError>
Writes bytes at any alignment by read-modify-write of whole words.
The bytes either side of data within the edge words are written back
with the values just read. That is not atomic: anything the target
changes in those bytes between the read and the write is lost, so this
is only safe for memory the core is not using (probe-rs uses it for
halted-core SRAM and flash-algorithm buffers), never for peripheral
registers.
§Errors
As read_words and
write_words.
Trait Implementations§
Source§impl ArmDebugInterface for FieldSafeArm
impl ArmDebugInterface for FieldSafeArm
Source§fn reinitialize(&mut self) -> Result<(), ArmError>
fn reinitialize(&mut self) -> Result<(), ArmError>
Does nothing: the DAP state is the table’s, and the base keeps the link up itself.
Source§fn access_ports(
&mut self,
_dp: DpAddress,
) -> Result<BTreeSet<FullyQualifiedApAddress>, ArmError>
fn access_ports( &mut self, _dp: DpAddress, ) -> Result<BTreeSet<FullyQualifiedApAddress>, ArmError>
Returns AP0 on the default DP, the only access port these parts use.
Source§fn close(self: Box<Self>) -> Probe
fn close(self: Box<Self>) -> Probe
Hands the FieldSafeProbe back as an unattached probe-rs [Probe].
The base stays in SWD mode; the probe is only ever dropped afterwards, which detaches it.
Source§fn select_debug_port(&mut self, dp: DpAddress) -> Result<(), ArmError>
fn select_debug_port(&mut self, dp: DpAddress) -> Result<(), ArmError>
Accepts only the default DP; multidrop SWD is not supported.
Source§fn current_debug_port(&self) -> Option<DpAddress>
fn current_debug_port(&self) -> Option<DpAddress>
Always the default DP.
Source§fn memory_interface(
&mut self,
access_port: &FullyQualifiedApAddress,
) -> Result<Box<dyn ArmMemoryInterface + '_>, ArmError>
fn memory_interface( &mut self, access_port: &FullyQualifiedApAddress, ) -> Result<Box<dyn ArmMemoryInterface + '_>, ArmError>
Returns a FieldSafeMemory for AP0; any other AP is refused.
Source§impl DapAccess for FieldSafeArm
impl DapAccess for FieldSafeArm
Source§fn read_raw_dp_register(
&mut self,
_dp: DpAddress,
address: DpRegisterAddress,
) -> Result<u32, ArmError>
fn read_raw_dp_register( &mut self, _dp: DpAddress, address: DpRegisterAddress, ) -> Result<u32, ArmError>
Answers DP register reads from the DapTable without touching the
wire.
DPIDR gets the part’s value; CTRL/STAT (bank 0) reports debug and
system power-up requested and acknowledged, which ends probe-rs’s
power-up handshake; everything else reads 0. The bases’ own
READ_DAP_REG cannot be used: old firmware returns stale data for it.
Source§fn write_raw_dp_register(
&mut self,
_dp: DpAddress,
_address: DpRegisterAddress,
_value: u32,
) -> Result<(), ArmError>
fn write_raw_dp_register( &mut self, _dp: DpAddress, _address: DpRegisterAddress, _value: u32, ) -> Result<(), ArmError>
Accepts and ignores DP register writes; the base powers up and selects the DAP itself on SWD entry.
Source§fn read_raw_ap_register(
&mut self,
ap: &FullyQualifiedApAddress,
address: u64,
) -> Result<u32, ArmError>
fn read_raw_ap_register( &mut self, ap: &FullyQualifiedApAddress, address: u64, ) -> Result<u32, ArmError>
Answers AP register reads from the DapTable without touching the
wire.
AP0 reports its CSW, BASE and IDR; other registers read 0. Any AP
other than AP0 reads 0 throughout, which probe-rs takes as “no AP”.
Source§fn write_raw_ap_register(
&mut self,
_ap: &FullyQualifiedApAddress,
_address: u64,
_value: u32,
) -> Result<(), ArmError>
fn write_raw_ap_register( &mut self, _ap: &FullyQualifiedApAddress, _address: u64, _value: u32, ) -> Result<(), ArmError>
Accepts and ignores AP register writes: memory never goes through
TAR/DRW, and the base’s memory commands set CSW themselves.
Source§fn try_dap_probe(&self) -> Option<&dyn DapProbe>
fn try_dap_probe(&self) -> Option<&dyn DapProbe>
Returns None: there is no raw DAP access to offer.
Source§fn try_dap_probe_mut(&mut self) -> Option<&mut dyn DapProbe>
fn try_dap_probe_mut(&mut self) -> Option<&mut dyn DapProbe>
Returns None: there is no raw DAP access to offer.
§fn read_raw_ap_register_repeated(
&mut self,
ap: &FullyQualifiedApAddress,
addr: u64,
values: &mut [u32],
) -> Result<(), ArmError>
fn read_raw_ap_register_repeated( &mut self, ap: &FullyQualifiedApAddress, addr: u64, values: &mut [u32], ) -> Result<(), ArmError>
Source§impl Debug for FieldSafeArm
impl Debug for FieldSafeArm
Source§impl SwdSequence for FieldSafeArm
impl SwdSequence for FieldSafeArm
Source§fn swj_sequence(
&mut self,
_bit_len: u8,
_bits: u64,
) -> Result<(), DebugProbeError>
fn swj_sequence( &mut self, _bit_len: u8, _bits: u64, ) -> Result<(), DebugProbeError>
Refuses raw SWJ bit sequences (line resets, JTAG-to-SWD switches); the base performs those itself on SWD entry.
Source§fn swj_pins(
&mut self,
pin_out: u32,
pin_select: u32,
_pin_wait: u32,
) -> Result<u32, DebugProbeError>
fn swj_pins( &mut self, pin_out: u32, pin_select: u32, _pin_wait: u32, ) -> Result<u32, DebugProbeError>
Drives nRST when that is the only pin selected; refuses any other pin.
probe-rs’s reset sequences use this to assert and release reset.
Returns pin_out as the pin state read back; pin_wait is ignored.
Source§impl SwoAccess for FieldSafeArm
impl SwoAccess for FieldSafeArm
Source§fn enable_swo(&mut self, _config: &SwoConfig) -> Result<(), ArmError>
fn enable_swo(&mut self, _config: &SwoConfig) -> Result<(), ArmError>
Refuses: the bases do not capture SWO.
Source§fn disable_swo(&mut self) -> Result<(), ArmError>
fn disable_swo(&mut self) -> Result<(), ArmError>
Does nothing; SWO is never enabled.
Source§fn read_swo_timeout(&mut self, _timeout: Duration) -> Result<Vec<u8>, ArmError>
fn read_swo_timeout(&mut self, _timeout: Duration) -> Result<Vec<u8>, ArmError>
Refuses: the bases do not capture SWO.
§fn read_swo(&mut self) -> Result<Vec<u8>, ArmError>
fn read_swo(&mut self) -> Result<Vec<u8>, ArmError>
§fn swo_poll_interval_hint(&mut self, config: &SwoConfig) -> Option<Duration>
fn swo_poll_interval_hint(&mut self, config: &SwoConfig) -> Option<Duration>
read_swo. Read more§fn swo_buffer_size(&mut self) -> Option<usize>
fn swo_buffer_size(&mut self) -> Option<usize>
Auto Trait Implementations§
impl Freeze for FieldSafeArm
impl RefUnwindSafe for FieldSafeArm
impl Send for FieldSafeArm
impl Sync for FieldSafeArm
impl Unpin for FieldSafeArm
impl UnsafeUnpin for FieldSafeArm
impl UnwindSafe for FieldSafeArm
Blanket Implementations§
§impl<T> ApAccess for Twhere
T: DapAccess,
impl<T> ApAccess for Twhere
T: DapAccess,
§fn read_ap_register<PORT, R>(&mut self, port: &PORT) -> Result<R, ArmError>where
PORT: AccessPortType + ApRegAccess<R> + ?Sized,
R: ApRegister,
fn read_ap_register<PORT, R>(&mut self, port: &PORT) -> Result<R, ArmError>where
PORT: AccessPortType + ApRegAccess<R> + ?Sized,
R: ApRegister,
§fn write_ap_register<PORT, R>(
&mut self,
port: &PORT,
register: R,
) -> Result<(), ArmError>where
PORT: AccessPortType + ApRegAccess<R> + ?Sized,
R: ApRegister,
fn write_ap_register<PORT, R>(
&mut self,
port: &PORT,
register: R,
) -> Result<(), ArmError>where
PORT: AccessPortType + ApRegAccess<R> + ?Sized,
R: ApRegister,
§fn write_ap_register_repeated<PORT, R>(
&mut self,
port: &PORT,
values: &[u32],
) -> Result<(), ArmError>where
PORT: AccessPortType + ApRegAccess<R> + ?Sized,
R: ApRegister,
fn write_ap_register_repeated<PORT, R>(
&mut self,
port: &PORT,
values: &[u32],
) -> Result<(), ArmError>where
PORT: AccessPortType + ApRegAccess<R> + ?Sized,
R: ApRegister,
§fn read_ap_register_repeated<PORT, R>(
&mut self,
port: &PORT,
values: &mut [u32],
) -> Result<(), ArmError>where
PORT: AccessPortType + ApRegAccess<R> + ?Sized,
R: ApRegister,
fn read_ap_register_repeated<PORT, R>(
&mut self,
port: &PORT,
values: &mut [u32],
) -> Result<(), ArmError>where
PORT: AccessPortType + ApRegAccess<R> + ?Sized,
R: ApRegister,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> DpAccess for Twhere
T: DapAccess + ?Sized,
impl<T> DpAccess for Twhere
T: DapAccess + ?Sized,
§fn read_dp_register<R>(&mut self, dp: DpAddress) -> Result<R, ArmError>where
R: DpRegister,
fn read_dp_register<R>(&mut self, dp: DpAddress) -> Result<R, ArmError>where
R: DpRegister,
§fn write_dp_register<R>(
&mut self,
dp: DpAddress,
register: R,
) -> Result<(), ArmError>where
R: DpRegister,
fn write_dp_register<R>(
&mut self,
dp: DpAddress,
register: R,
) -> Result<(), ArmError>where
R: DpRegister,
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.