pub struct Connection { /* private fields */ }Expand description
Active connection to a PICOBOOT device
This object is used to send commands to a connected PICOBOOT capable device.
§Example
let mut picoboot = Picoboot::from_first(None).await?;
let conn = picoboot.connect().await?;
conn.flash_erase_start(4096).await?;
conn.flash_write_start(&[0u8; 4096]).await?;
let data = conn.flash_read_start(4096).await?;Implementations§
Source§impl Connection
impl Connection
Sourcepub async fn reset_interface(&mut self) -> Result<(), Error>
pub async fn reset_interface(&mut self) -> Result<(), Error>
Resets PICOBOOT USB interface.
This may be called after opening a brand new connection to ensure a consistent starting state, or to reset a stalled connection.
Note that this resets any exclusive access, re-enabling the USB mass storage device if it was ejects due to exclusivity.
Returns:
Ok(())- If interface is successfully reset.
Sourcepub async fn send_cmd(
&mut self,
cmd: PicobootCmd,
buf: Option<&[u8]>,
) -> Result<Vec<u8>, Error>
pub async fn send_cmd( &mut self, cmd: PicobootCmd, buf: Option<&[u8]>, ) -> Result<Vec<u8>, Error>
Sends a low-level command to the PICOBOOT device.
Depending on the command, the buffer argument may be used to send data to the device.
Depending on the command, the returned Vec may contain data from the device.
Returns:
Ok(Vec<u8>)- Data returned from the device, if any.
Sourcepub async fn set_exclusive_access(
&mut self,
access: Access,
) -> Result<(), Error>
pub async fn set_exclusive_access( &mut self, access: Access, ) -> Result<(), Error>
Requests an exclusive access mode with the device.
Returns:
Ok(())- If the exclusive access mode is successfully set.
Sourcepub async fn reboot(&mut self, delay: Duration) -> Result<(), Error>
pub async fn reboot(&mut self, delay: Duration) -> Result<(), Error>
Performs a simple reboot of the device.
Args:
delay- Time to start the device after. Must fit into a u32 milliseconds.
For a target Target::Custom this command is not supported - use
Self::reboot_rp2040 or Self::reboot_rp2350 instead.
Returns:
Ok(())- If reboot command is successfully sent.
Sourcepub async fn reboot_rp2040(
&mut self,
program_counter: u32,
stack_pointer: u32,
delay: Duration,
) -> Result<(), Error>
pub async fn reboot_rp2040( &mut self, program_counter: u32, stack_pointer: u32, delay: Duration, ) -> Result<(), Error>
Reboots the device with a specified program counter, stack pointer, and delay.
Note, reboot is not supported on the RP2350.
program_counter- Program counter to start the device with. Use0for a standard flash boot, or a RAM address to start executing at.stack_pointer- Stack pointer to start the device with. Unused ifprogram_counteris0.delay- Time to start the device after. Must fit into a u32 milliseconds.
Returns:
Ok(())- If reboot command is successfully sent.
Sourcepub async fn reboot_rp2350(
&mut self,
flags: u32,
p0: u32,
p1: u32,
delay: Duration,
) -> Result<(), Error>
pub async fn reboot_rp2350( &mut self, flags: u32, p0: u32, p1: u32, delay: Duration, ) -> Result<(), Error>
Reboots the device out of BOOTSEL mode into normal operation
Note, not supported on the RP2040.
Args:
flags- Reboot flags to use.p0- Reboot parameter 0.p1- Reboot parameter 1.delay- Time to start the device after. Must fit into a u32 milliseconds.
See the RP2350 datasheet, section 5.4.8.24. reboot for details on the flags and parameters. For a standard boot, set them all to 0.
Returns:
Ok(())- If reboot command is successfully sent.
Sourcepub async fn flash_erase_start(&mut self, size: usize) -> Result<(), Error>
pub async fn flash_erase_start(&mut self, size: usize) -> Result<(), Error>
Erases the flash memory of the device from the start
Args:
size- Number of bytes to erase. Will be rounded up to the nearest multiple ofTarget::flash_sector_size.
Returns:
Ok(())- If erase command is successfully sent.
Sourcepub async fn flash_erase(&mut self, addr: u32, size: u32) -> Result<(), Error>
pub async fn flash_erase(&mut self, addr: u32, size: u32) -> Result<(), Error>
Erases the flash memory of the device.
addr- Address to start the erase. Must be on a multiple ofTarget::flash_sector_size.size- Number of bytes to erase. Must be a multiple ofTarget::flash_sector_size.
Returns:
Ok(())- If erase command is successfully sent.
Sourcepub async fn flash_write_start(&mut self, buf: &[u8]) -> Result<(), Error>
pub async fn flash_write_start(&mut self, buf: &[u8]) -> Result<(), Error>
Writes a buffer to the start of the flash memory of the device.
Args:
buf- Buffer of data to write to flash. Should be a multiple ofTarget::flash_page_size. If not, the remainder of the final page is zero-filled.
Returns:
Ok(())- If write command is successfully sent.
Sourcepub async fn flash_write(&mut self, addr: u32, buf: &[u8]) -> Result<(), Error>
pub async fn flash_write(&mut self, addr: u32, buf: &[u8]) -> Result<(), Error>
Writes a buffer to the flash memory of the device.
addr- Address to start the write. Must be on a multiple ofTarget::flash_page_size.buf- Buffer of data to write to memory. Should be a multiple ofTarget::flash_page_size. If not, the remainder of the final page is zero-filled.
Returns:
Ok(())- If write command is successfully sent.
Sourcepub async fn write(&mut self, addr: u32, buf: &[u8]) -> Result<(), Error>
pub async fn write(&mut self, addr: u32, buf: &[u8]) -> Result<(), Error>
Writes a buffer to the (RAM) memory of the device.
For flash, use flash_write() as that polices valid flash write addresses and sizes.
addr- Address to start the write.buf- Buffer of data to write to memory.
Sourcepub async fn flash_read_start(&mut self, size: u32) -> Result<Vec<u8>, Error>
pub async fn flash_read_start(&mut self, size: u32) -> Result<Vec<u8>, Error>
Reads from the start of flash memory of the device.
addr- Address to start the read.size- Number of bytes to read.
Returns:
Ok(Vec<u8>)- Buffer of data read from flash.
Sourcepub async fn flash_read(
&mut self,
addr: u32,
size: u32,
) -> Result<Vec<u8>, Error>
pub async fn flash_read( &mut self, addr: u32, size: u32, ) -> Result<Vec<u8>, Error>
Reads from the flash memory of the device.
addr- Address to start the write. Must be on a multiple ofTarget::flash_page_size.size- Amount of read. Should be a multiple ofTarget::flash_page_size. If not, it will be rejected.
Sourcepub async fn read(&mut self, addr: u32, size: u32) -> Result<Vec<u8>, Error>
pub async fn read(&mut self, addr: u32, size: u32) -> Result<Vec<u8>, Error>
Reads from memory of the device.
For flash reads, use flash_read() or flash_read_start() as that polices valid flash read addresses and sizes.
Sourcepub async fn enter_xip(&mut self) -> Result<(), Error>
pub async fn enter_xip(&mut self) -> Result<(), Error>
Enter Flash XIP (execute-in-place) mode.
Only functional on RP2040 devices - is a no-op on RP2350.
Returns:
Ok(())- If enter XIP command is successfully sent.
Sourcepub async fn exit_xip(&mut self) -> Result<(), Error>
pub async fn exit_xip(&mut self) -> Result<(), Error>
Exits Flash XIP (execute-in-place) mode.
Only functional on RP2040 devices - is a no-op on RP2350.
Returns:
Ok(())- If exit XIP command is successfully sent.
Sourcepub async fn get_command_status(&mut self) -> Result<PicobootStatusCmd, Error>
pub async fn get_command_status(&mut self) -> Result<PicobootStatusCmd, Error>
Issues a GET_COMMAND_STATUS control request to the device and returns the result.
Sourcepub async fn send_picobootx_cmd(
&mut self,
cmd: PicobootXCmd,
buf: Option<&[u8]>,
) -> Result<Vec<u8>, Error>
pub async fn send_picobootx_cmd( &mut self, cmd: PicobootXCmd, buf: Option<&[u8]>, ) -> Result<Vec<u8>, Error>
Sends a custom picobootx protocol extension command to the device.
Follows identical protocol mechanics to send_cmd but accepts an arbitrary
magic value. The caller is responsible for constructing valid args for
their extension protocol using the PicobootXCmd struct.
Trait Implementations§
Source§impl Clone for Connection
impl Clone for Connection
Source§fn clone(&self) -> Connection
fn clone(&self) -> Connection
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for Connection
impl Debug for Connection
Auto Trait Implementations§
impl Freeze for Connection
impl RefUnwindSafe for Connection
impl Send for Connection
impl Sync for Connection
impl Unpin for Connection
impl UnsafeUnpin for Connection
impl UnwindSafe for Connection
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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> 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.