Skip to main content

Connection

Struct Connection 

Source
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

Source

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.
Source

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.
Source

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.
Source

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.
Source

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. Use 0 for a standard flash boot, or a RAM address to start executing at.
  • stack_pointer - Stack pointer to start the device with. Unused if program_counter is 0.
  • delay - Time to start the device after. Must fit into a u32 milliseconds.

Returns:

  • Ok(()) - If reboot command is successfully sent.
Source

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.
Source

pub async fn flash_erase_start(&mut self, size: usize) -> Result<(), Error>

Erases the flash memory of the device from the start

Args:

Returns:

  • Ok(()) - If erase command is successfully sent.
Source

pub async fn flash_erase(&mut self, addr: u32, size: u32) -> Result<(), Error>

Erases the flash memory of the device.

Returns:

  • Ok(()) - If erase command is successfully sent.
Source

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 of Target::flash_page_size. If not, the remainder of the final page is zero-filled.

Returns:

  • Ok(()) - If write command is successfully sent.
Source

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 of Target::flash_page_size.
  • buf - Buffer of data to write to memory. Should be a multiple of Target::flash_page_size. If not, the remainder of the final page is zero-filled.

Returns:

  • Ok(()) - If write command is successfully sent.
Source

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.
Source

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.
Source

pub async fn flash_read( &mut self, addr: u32, size: u32, ) -> Result<Vec<u8>, Error>

Reads from the flash memory of the device.

Source

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.

Source

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.
Source

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.
Source

pub fn target(&mut self) -> &Target

Returns the target type of the connected PICOBOOT device

Source

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.

Source

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

Source§

fn clone(&self) -> Connection

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Connection

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for Connection

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.