pub struct MIMXRT5xxS { /* private fields */ }
Expand description
Debug sequences for MIMXRT5xxS MCUs.
MCUs in this series do not have any on-board flash memory, and instead there is a non-programmable boot ROM which attempts to find a suitable program from a variety of different sources. The entry point for application code therefore varies depending on the boot medium.
Note: These sequences assume that the chip’s PIO4_5
is connected
to an active-low reset signal on the NOR flash chip, and will attempt
to reset the flash when resetting the overall system. This pin selection
matches the evaluation kit (MIMXRT595-EVK) but there’s currently no way
to make that customizable for other boards.
Because the system begins execution in the boot ROM, it isn’t possible to use a standard reset vector catch on this platform. Instead, the series datasheet (section 60.3.4) describes the following protocol:
- Set a data watchpoint for a read from location 0x50002034.
- Use SYSRESETREQ to reset the core and peripherals.
- Wait 100ms to allow the boot ROM to re-enable debug.
- Check whether the core is halted due to the watchpoint, by checking DHCSR.
- If the core doesn’t halt or halts for some reason other than the watchpoint, use the special debug mailbox protocol to exit the ISP mode and enter an infinite loop, at which point we can halt the MCU explicitly.
- Clear the data watchpoint.
The debug mailbox protocol handles, among other things, recovering debug access when the part enters its ISP mode. ISP mode has debug disabled to prevent tampering with the system’s security features. Datasheet section 60.3.1 describes the special debug recovery process.
Implementations§
Source§impl MIMXRT5xxS
impl MIMXRT5xxS
Sourcepub fn create(family: MIMXRTFamily) -> Arc<dyn ArmDebugSequence>
pub fn create(family: MIMXRTFamily) -> Arc<dyn ArmDebugSequence>
Create a sequence handle for the MIMXRT5xxS.
Trait Implementations§
Source§impl ArmDebugSequence for MIMXRT5xxS
impl ArmDebugSequence for MIMXRT5xxS
Source§fn debug_port_start(
&self,
interface: &mut ArmCommunicationInterface<Initialized>,
dp: DpAddress,
) -> Result<(), ArmError>
fn debug_port_start( &self, interface: &mut ArmCommunicationInterface<Initialized>, dp: DpAddress, ) -> Result<(), ArmError>
DebugPortStart
function from the ARM SVD Debug Description.Source§fn reset_system(
&self,
probe: &mut dyn ArmMemoryInterface,
core_type: CoreType,
_debug_base: Option<u64>,
) -> Result<(), ArmError>
fn reset_system( &self, probe: &mut dyn ArmMemoryInterface, core_type: CoreType, _debug_base: Option<u64>, ) -> Result<(), ArmError>
ResetSystem
function from the ARM SVD Debug Description.Source§fn reset_hardware_deassert(
&self,
memory: &mut dyn ArmMemoryInterface,
) -> Result<(), ArmError>
fn reset_hardware_deassert( &self, memory: &mut dyn ArmMemoryInterface, ) -> Result<(), ArmError>
ResetHardwareDeassert
function from the ARM SVD Debug Description.Source§fn reset_hardware_assert(
&self,
interface: &mut dyn DapProbe,
) -> Result<(), ArmError>
fn reset_hardware_assert( &self, interface: &mut dyn DapProbe, ) -> Result<(), ArmError>
ResetHardwareAssert
function from the ARM SVD Debug Description.Source§fn debug_port_setup(
&self,
interface: &mut dyn DapProbe,
dp: DpAddress,
) -> Result<(), ArmError>
fn debug_port_setup( &self, interface: &mut dyn DapProbe, dp: DpAddress, ) -> Result<(), ArmError>
DebugPortSetup
function
from the ARM SVD Debug Description. Read moreSource§fn debug_core_start(
&self,
interface: &mut dyn ArmProbeInterface,
core_ap: &FullyQualifiedApAddress,
core_type: CoreType,
debug_base: Option<u64>,
cti_base: Option<u64>,
) -> Result<(), ArmError>
fn debug_core_start( &self, interface: &mut dyn ArmProbeInterface, core_ap: &FullyQualifiedApAddress, core_type: CoreType, debug_base: Option<u64>, cti_base: Option<u64>, ) -> Result<(), ArmError>
DebugCoreStart
function from the ARM SVD Debug Description.Source§fn reset_catch_set(
&self,
core: &mut dyn ArmMemoryInterface,
core_type: CoreType,
debug_base: Option<u64>,
) -> Result<(), ArmError>
fn reset_catch_set( &self, core: &mut dyn ArmMemoryInterface, core_type: CoreType, debug_base: Option<u64>, ) -> Result<(), ArmError>
ResetCatchSet
function from
the ARM SVD Debug Description.Source§fn reset_catch_clear(
&self,
core: &mut dyn ArmMemoryInterface,
core_type: CoreType,
debug_base: Option<u64>,
) -> Result<(), ArmError>
fn reset_catch_clear( &self, core: &mut dyn ArmMemoryInterface, core_type: CoreType, debug_base: Option<u64>, ) -> Result<(), ArmError>
ResetCatchSet
function from
the ARM SVD Debug Description.Source§fn trace_start(
&self,
interface: &mut dyn ArmProbeInterface,
components: &[CoresightComponent],
_sink: &TraceSink,
) -> Result<(), ArmError>
fn trace_start( &self, interface: &mut dyn ArmProbeInterface, components: &[CoresightComponent], _sink: &TraceSink, ) -> Result<(), ArmError>
Source§fn debug_device_unlock(
&self,
_interface: &mut dyn ArmProbeInterface,
_default_ap: &FullyQualifiedApAddress,
_permissions: &Permissions,
) -> Result<(), ArmError>
fn debug_device_unlock( &self, _interface: &mut dyn ArmProbeInterface, _default_ap: &FullyQualifiedApAddress, _permissions: &Permissions, ) -> Result<(), ArmError>
DebugDeviceUnlock
function from the ARM SVD Debug Description.Source§fn recover_support_start(
&self,
_interface: &mut dyn ArmMemoryInterface,
) -> Result<(), ArmError>
fn recover_support_start( &self, _interface: &mut dyn ArmMemoryInterface, ) -> Result<(), ArmError>
RecoverSupportStart
function from the ARM SVD Debug Description.Source§fn debug_core_stop(
&self,
interface: &mut dyn ArmMemoryInterface,
core_type: CoreType,
) -> Result<(), ArmError>
fn debug_core_stop( &self, interface: &mut dyn ArmMemoryInterface, core_type: CoreType, ) -> Result<(), ArmError>
Source§fn debug_port_stop(
&self,
interface: &mut dyn DapProbe,
dp: DpAddress,
) -> Result<(), ArmError>
fn debug_port_stop( &self, interface: &mut dyn DapProbe, dp: DpAddress, ) -> Result<(), ArmError>
Source§fn debug_port_connect(
&self,
interface: &mut dyn DapProbe,
dp: DpAddress,
) -> Result<(), ArmError>
fn debug_port_connect( &self, interface: &mut dyn DapProbe, dp: DpAddress, ) -> Result<(), ArmError>
Source§fn prepare_running_on_ram(
&self,
vector_table_addr: u64,
session: &mut Session,
) -> Result<(), Error>
fn prepare_running_on_ram( &self, vector_table_addr: u64, session: &mut Session, ) -> Result<(), Error>
Source§fn debug_erase_sequence(&self) -> Option<Arc<dyn DebugEraseSequence>>
fn debug_erase_sequence(&self) -> Option<Arc<dyn DebugEraseSequence>>
Source§fn allowed_access_ports(&self) -> Vec<u8>
fn allowed_access_ports(&self) -> Vec<u8>
Auto Trait Implementations§
impl Freeze for MIMXRT5xxS
impl RefUnwindSafe for MIMXRT5xxS
impl Send for MIMXRT5xxS
impl Sync for MIMXRT5xxS
impl Unpin for MIMXRT5xxS
impl UnwindSafe for MIMXRT5xxS
Blanket Implementations§
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
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> 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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§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 moreSource§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 moreSource§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
Source§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
Source§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.Source§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.Source§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.Source§impl<T> Tap for T
impl<T> Tap for T
Source§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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 moreSource§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.Source§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.Source§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.Source§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.Source§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.Source§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.Source§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.