Update rust nightly, embedded-hal 1.0, embedded-hal-async.
This commit is contained in:
parent
828cdb2951
commit
9bad9365dc
33 changed files with 732 additions and 855 deletions
|
@ -97,7 +97,7 @@ impl<'a, S: PeripheralState> PeripheralMutex<'a, S> {
|
||||||
// Interrupts' priorities can only be changed with raw embassy `Interrupts`,
|
// Interrupts' priorities can only be changed with raw embassy `Interrupts`,
|
||||||
// which can't safely store a `PeripheralMutex` across invocations.
|
// which can't safely store a `PeripheralMutex` across invocations.
|
||||||
// - We can't have preempted a with() call because the irq is disabled during it.
|
// - We can't have preempted a with() call because the irq is disabled during it.
|
||||||
let state = unsafe { &mut *(p as *mut S) };
|
let state = &mut *(p as *mut S);
|
||||||
state.on_interrupt();
|
state.on_interrupt();
|
||||||
});
|
});
|
||||||
irq.set_handler_context(state_ptr as *mut ());
|
irq.set_handler_context(state_ptr as *mut ());
|
||||||
|
|
|
@ -18,8 +18,8 @@ log = { version = "0.4.14", optional = true }
|
||||||
|
|
||||||
embassy = { version = "0.1.0", path = "../embassy", default-features = false }
|
embassy = { version = "0.1.0", path = "../embassy", default-features = false }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../embassy-stm32", default-features = false, optional = true }
|
embassy-stm32 = { version = "0.1.0", path = "../embassy-stm32", default-features = false, optional = true }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.6", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.7", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy"}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2"}
|
||||||
embassy-hal-common = { version = "0.1.0", path = "../embassy-hal-common", default-features = false }
|
embassy-hal-common = { version = "0.1.0", path = "../embassy-hal-common", default-features = false }
|
||||||
futures = { version = "0.3.17", default-features = false, features = [ "async-await" ] }
|
futures = { version = "0.3.17", default-features = false, features = [ "async-await" ] }
|
||||||
embedded-hal = { version = "0.2", features = ["unproven"] }
|
embedded-hal = { version = "0.2", features = ["unproven"] }
|
||||||
|
|
|
@ -78,7 +78,7 @@ impl<'a> SubGhzRadio<'a> {
|
||||||
// This is safe because we only get interrupts when configured for, so
|
// This is safe because we only get interrupts when configured for, so
|
||||||
// the radio will be awaiting on the signal at this point. If not, the ISR will
|
// the radio will be awaiting on the signal at this point. If not, the ISR will
|
||||||
// anyway only adjust the state in the IRQ signal state.
|
// anyway only adjust the state in the IRQ signal state.
|
||||||
let state = unsafe { &mut *(p as *mut StateInner<'a>) };
|
let state = &mut *(p as *mut StateInner<'a>);
|
||||||
state.on_interrupt();
|
state.on_interrupt();
|
||||||
});
|
});
|
||||||
irq.set_handler_context(state_ptr as *mut ());
|
irq.set_handler_context(state_ptr as *mut ());
|
||||||
|
|
|
@ -20,7 +20,7 @@ pub trait RadioSwitch {
|
||||||
/// Semtech Sx127x radio peripheral
|
/// Semtech Sx127x radio peripheral
|
||||||
pub struct Sx127xRadio<SPI, CS, RESET, E, I, RFS>
|
pub struct Sx127xRadio<SPI, CS, RESET, E, I, RFS>
|
||||||
where
|
where
|
||||||
SPI: ReadWrite<u8, Error = E> + 'static,
|
SPI: SpiBus<u8, Error = E> + 'static,
|
||||||
E: 'static,
|
E: 'static,
|
||||||
CS: OutputPin + 'static,
|
CS: OutputPin + 'static,
|
||||||
RESET: OutputPin + 'static,
|
RESET: OutputPin + 'static,
|
||||||
|
@ -42,7 +42,7 @@ pub enum State {
|
||||||
|
|
||||||
impl<SPI, CS, RESET, E, I, RFS> Sx127xRadio<SPI, CS, RESET, E, I, RFS>
|
impl<SPI, CS, RESET, E, I, RFS> Sx127xRadio<SPI, CS, RESET, E, I, RFS>
|
||||||
where
|
where
|
||||||
SPI: ReadWrite<u8, Error = E> + 'static,
|
SPI: SpiBus<u8, Error = E> + 'static,
|
||||||
CS: OutputPin + 'static,
|
CS: OutputPin + 'static,
|
||||||
RESET: OutputPin + 'static,
|
RESET: OutputPin + 'static,
|
||||||
I: Wait + 'static,
|
I: Wait + 'static,
|
||||||
|
@ -64,7 +64,7 @@ where
|
||||||
|
|
||||||
impl<SPI, CS, RESET, E, I, RFS> Timings for Sx127xRadio<SPI, CS, RESET, E, I, RFS>
|
impl<SPI, CS, RESET, E, I, RFS> Timings for Sx127xRadio<SPI, CS, RESET, E, I, RFS>
|
||||||
where
|
where
|
||||||
SPI: ReadWrite<u8, Error = E> + 'static,
|
SPI: SpiBus<u8, Error = E> + 'static,
|
||||||
CS: OutputPin + 'static,
|
CS: OutputPin + 'static,
|
||||||
RESET: OutputPin + 'static,
|
RESET: OutputPin + 'static,
|
||||||
I: Wait + 'static,
|
I: Wait + 'static,
|
||||||
|
@ -80,7 +80,7 @@ where
|
||||||
|
|
||||||
impl<SPI, CS, RESET, E, I, RFS> PhyRxTx for Sx127xRadio<SPI, CS, RESET, E, I, RFS>
|
impl<SPI, CS, RESET, E, I, RFS> PhyRxTx for Sx127xRadio<SPI, CS, RESET, E, I, RFS>
|
||||||
where
|
where
|
||||||
SPI: ReadWrite<u8, Error = E> + 'static,
|
SPI: SpiBus<u8, Error = E> + 'static,
|
||||||
CS: OutputPin + 'static,
|
CS: OutputPin + 'static,
|
||||||
E: 'static,
|
E: 'static,
|
||||||
RESET: OutputPin + 'static,
|
RESET: OutputPin + 'static,
|
||||||
|
@ -89,15 +89,14 @@ where
|
||||||
{
|
{
|
||||||
type PhyError = Sx127xError;
|
type PhyError = Sx127xError;
|
||||||
|
|
||||||
type TxFuture<'m>
|
type TxFuture<'m> = impl Future<Output = Result<u32, Self::PhyError>> + 'm
|
||||||
where
|
where
|
||||||
SPI: 'm,
|
SPI: 'm,
|
||||||
CS: 'm,
|
CS: 'm,
|
||||||
RESET: 'm,
|
RESET: 'm,
|
||||||
E: 'm,
|
E: 'm,
|
||||||
I: 'm,
|
I: 'm,
|
||||||
RFS: 'm,
|
RFS: 'm;
|
||||||
= impl Future<Output = Result<u32, Self::PhyError>> + 'm;
|
|
||||||
|
|
||||||
fn tx<'m>(&'m mut self, config: TxConfig, buf: &'m [u8]) -> Self::TxFuture<'m> {
|
fn tx<'m>(&'m mut self, config: TxConfig, buf: &'m [u8]) -> Self::TxFuture<'m> {
|
||||||
trace!("TX START");
|
trace!("TX START");
|
||||||
|
@ -137,15 +136,14 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type RxFuture<'m>
|
type RxFuture<'m> = impl Future<Output = Result<(usize, RxQuality), Self::PhyError>> + 'm
|
||||||
where
|
where
|
||||||
SPI: 'm,
|
SPI: 'm,
|
||||||
CS: 'm,
|
CS: 'm,
|
||||||
RESET: 'm,
|
RESET: 'm,
|
||||||
E: 'm,
|
E: 'm,
|
||||||
I: 'm,
|
I: 'm,
|
||||||
RFS: 'm,
|
RFS: 'm;
|
||||||
= impl Future<Output = Result<(usize, RxQuality), Self::PhyError>> + 'm;
|
|
||||||
|
|
||||||
fn rx<'m>(&'m mut self, config: RfConfig, buf: &'m mut [u8]) -> Self::RxFuture<'m> {
|
fn rx<'m>(&'m mut self, config: RfConfig, buf: &'m mut [u8]) -> Self::RxFuture<'m> {
|
||||||
trace!("RX START");
|
trace!("RX START");
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
use bit_field::BitField;
|
use bit_field::BitField;
|
||||||
use embassy::time::{Duration, Timer};
|
use embassy::time::{Duration, Timer};
|
||||||
use embedded_hal::digital::v2::OutputPin;
|
use embedded_hal::digital::v2::OutputPin;
|
||||||
use embedded_hal_async::spi::ReadWrite;
|
use embedded_hal_async::spi::SpiBus;
|
||||||
|
|
||||||
mod register;
|
mod register;
|
||||||
use self::register::PaConfig;
|
use self::register::PaConfig;
|
||||||
|
@ -48,7 +48,7 @@ const VERSION_CHECK: u8 = 0x09;
|
||||||
|
|
||||||
impl<SPI, CS, RESET, E> LoRa<SPI, CS, RESET>
|
impl<SPI, CS, RESET, E> LoRa<SPI, CS, RESET>
|
||||||
where
|
where
|
||||||
SPI: ReadWrite<u8, Error = E>,
|
SPI: SpiBus<u8, Error = E>,
|
||||||
CS: OutputPin,
|
CS: OutputPin,
|
||||||
RESET: OutputPin,
|
RESET: OutputPin,
|
||||||
{
|
{
|
||||||
|
|
|
@ -63,8 +63,8 @@ embassy-macros = { version = "0.1.0", path = "../embassy-macros", features = ["n
|
||||||
embassy-hal-common = {version = "0.1.0", path = "../embassy-hal-common" }
|
embassy-hal-common = {version = "0.1.0", path = "../embassy-hal-common" }
|
||||||
|
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.6", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.7", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
log = { version = "0.4.14", optional = true }
|
log = { version = "0.4.14", optional = true }
|
||||||
|
|
|
@ -108,7 +108,7 @@ unsafe fn handle_gpiote_interrupt() {
|
||||||
|
|
||||||
for i in 0..CHANNEL_COUNT {
|
for i in 0..CHANNEL_COUNT {
|
||||||
if g.events_in[i].read().bits() != 0 {
|
if g.events_in[i].read().bits() != 0 {
|
||||||
g.intenclr.write(|w| unsafe { w.bits(1 << i) });
|
g.intenclr.write(|w| w.bits(1 << i));
|
||||||
CHANNEL_WAKERS[i].wake();
|
CHANNEL_WAKERS[i].wake();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -481,102 +481,72 @@ mod eh1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
mod eh1a {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
use super::*;
|
use futures::FutureExt;
|
||||||
use futures::FutureExt;
|
|
||||||
|
|
||||||
impl<'d, T: GpioPin> embedded_hal_async::digital::Wait for Input<'d, T> {
|
impl<'d, T: GpioPin> embedded_hal_async::digital::Wait for Input<'d, T> {
|
||||||
type WaitForHighFuture<'a>
|
type WaitForHighFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_high<'a>(&'a mut self) -> Self::WaitForHighFuture<'a> {
|
fn wait_for_high<'a>(&'a mut self) -> Self::WaitForHighFuture<'a> {
|
||||||
self.wait_for_high().map(Ok)
|
self.wait_for_high().map(Ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
type WaitForLowFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn wait_for_low<'a>(&'a mut self) -> Self::WaitForLowFuture<'a> {
|
||||||
|
self.wait_for_low().map(Ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
type WaitForRisingEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn wait_for_rising_edge<'a>(&'a mut self) -> Self::WaitForRisingEdgeFuture<'a> {
|
||||||
|
self.wait_for_rising_edge().map(Ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
type WaitForFallingEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn wait_for_falling_edge<'a>(&'a mut self) -> Self::WaitForFallingEdgeFuture<'a> {
|
||||||
|
self.wait_for_falling_edge().map(Ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
type WaitForAnyEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn wait_for_any_edge<'a>(&'a mut self) -> Self::WaitForAnyEdgeFuture<'a> {
|
||||||
|
self.wait_for_any_edge().map(Ok)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForLowFuture<'a>
|
impl<'d, T: GpioPin> embedded_hal_async::digital::Wait for Flex<'d, T> {
|
||||||
where
|
type WaitForHighFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_low<'a>(&'a mut self) -> Self::WaitForLowFuture<'a> {
|
fn wait_for_high<'a>(&'a mut self) -> Self::WaitForHighFuture<'a> {
|
||||||
self.wait_for_low().map(Ok)
|
self.wait_for_high().map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForRisingEdgeFuture<'a>
|
type WaitForLowFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_rising_edge<'a>(&'a mut self) -> Self::WaitForRisingEdgeFuture<'a> {
|
fn wait_for_low<'a>(&'a mut self) -> Self::WaitForLowFuture<'a> {
|
||||||
self.wait_for_rising_edge().map(Ok)
|
self.wait_for_low().map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForFallingEdgeFuture<'a>
|
type WaitForRisingEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_falling_edge<'a>(&'a mut self) -> Self::WaitForFallingEdgeFuture<'a> {
|
fn wait_for_rising_edge<'a>(&'a mut self) -> Self::WaitForRisingEdgeFuture<'a> {
|
||||||
self.wait_for_falling_edge().map(Ok)
|
self.wait_for_rising_edge().map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForAnyEdgeFuture<'a>
|
type WaitForFallingEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_any_edge<'a>(&'a mut self) -> Self::WaitForAnyEdgeFuture<'a> {
|
fn wait_for_falling_edge<'a>(&'a mut self) -> Self::WaitForFallingEdgeFuture<'a> {
|
||||||
self.wait_for_any_edge().map(Ok)
|
self.wait_for_falling_edge().map(Ok)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: GpioPin> embedded_hal_async::digital::Wait for Flex<'d, T> {
|
type WaitForAnyEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
type WaitForHighFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_high<'a>(&'a mut self) -> Self::WaitForHighFuture<'a> {
|
fn wait_for_any_edge<'a>(&'a mut self) -> Self::WaitForAnyEdgeFuture<'a> {
|
||||||
self.wait_for_high().map(Ok)
|
self.wait_for_any_edge().map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForLowFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_low<'a>(&'a mut self) -> Self::WaitForLowFuture<'a> {
|
|
||||||
self.wait_for_low().map(Ok)
|
|
||||||
}
|
|
||||||
|
|
||||||
type WaitForRisingEdgeFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_rising_edge<'a>(&'a mut self) -> Self::WaitForRisingEdgeFuture<'a> {
|
|
||||||
self.wait_for_rising_edge().map(Ok)
|
|
||||||
}
|
|
||||||
|
|
||||||
type WaitForFallingEdgeFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_falling_edge<'a>(&'a mut self) -> Self::WaitForFallingEdgeFuture<'a> {
|
|
||||||
self.wait_for_falling_edge().map(Ok)
|
|
||||||
}
|
|
||||||
|
|
||||||
type WaitForAnyEdgeFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_any_edge<'a>(&'a mut self) -> Self::WaitForAnyEdgeFuture<'a> {
|
|
||||||
self.wait_for_any_edge().map(Ok)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -455,43 +455,25 @@ mod eh1 {
|
||||||
type Error = Error;
|
type Error = Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::blocking::Read<u8> for Spim<'d, T> {
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBusFlush for Spim<'d, T> {
|
||||||
|
fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBusRead<u8> for Spim<'d, T> {
|
||||||
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(words, &[])
|
self.blocking_transfer(words, &[])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_transaction(&mut self, words: &mut [&mut [u8]]) -> Result<(), Self::Error> {
|
|
||||||
for buf in words {
|
|
||||||
self.blocking_read(buf)?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::blocking::Write<u8> for Spim<'d, T> {
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBusWrite<u8> for Spim<'d, T> {
|
||||||
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_write(words)
|
self.blocking_write(words)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_transaction(&mut self, words: &[&[u8]]) -> Result<(), Self::Error> {
|
|
||||||
for buf in words {
|
|
||||||
self.blocking_write(buf)?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_iter<WI>(&mut self, words: WI) -> Result<(), Self::Error>
|
|
||||||
where
|
|
||||||
WI: IntoIterator<Item = u8>,
|
|
||||||
{
|
|
||||||
for w in words {
|
|
||||||
self.blocking_write(&[w])?;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::blocking::ReadWrite<u8> for Spim<'d, T> {
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBus<u8> for Spim<'d, T> {
|
||||||
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(read, write)
|
self.blocking_transfer(read, write)
|
||||||
}
|
}
|
||||||
|
@ -499,128 +481,51 @@ mod eh1 {
|
||||||
fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer_in_place(words)
|
self.blocking_transfer_in_place(words)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transaction<'a>(
|
|
||||||
&mut self,
|
|
||||||
operations: &mut [embedded_hal_1::spi::blocking::Operation<'a, u8>],
|
|
||||||
) -> Result<(), Self::Error> {
|
|
||||||
use embedded_hal_1::spi::blocking::Operation;
|
|
||||||
for o in operations {
|
|
||||||
match o {
|
|
||||||
Operation::Read(b) => self.blocking_read(b)?,
|
|
||||||
Operation::Write(b) => self.blocking_write(b)?,
|
|
||||||
Operation::Transfer(r, w) => self.blocking_transfer(r, w)?,
|
|
||||||
Operation::TransferInPlace(b) => self.blocking_transfer_in_place(b)?,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
mod eh1a {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
use super::*;
|
use core::future::Future;
|
||||||
use core::future::Future;
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::Read<u8> for Spim<'d, T> {
|
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusFlush for Spim<'d, T> {
|
||||||
type ReadFuture<'a>
|
type FlushFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, words: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
||||||
self.read(words)
|
async move { Ok(()) }
|
||||||
}
|
|
||||||
|
|
||||||
type ReadTransactionFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read_transaction<'a>(
|
|
||||||
&'a mut self,
|
|
||||||
words: &'a mut [&'a mut [u8]],
|
|
||||||
) -> Self::ReadTransactionFuture<'a> {
|
|
||||||
async move {
|
|
||||||
for buf in words {
|
|
||||||
self.read(buf).await?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::Write<u8> for Spim<'d, T> {
|
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusRead<u8> for Spim<'d, T> {
|
||||||
type WriteFuture<'a>
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write<'a>(&'a mut self, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
fn read<'a>(&'a mut self, words: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
self.write(data)
|
self.read(words)
|
||||||
}
|
|
||||||
|
|
||||||
type WriteTransactionFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write_transaction<'a>(
|
|
||||||
&'a mut self,
|
|
||||||
words: &'a [&'a [u8]],
|
|
||||||
) -> Self::WriteTransactionFuture<'a> {
|
|
||||||
async move {
|
|
||||||
for buf in words {
|
|
||||||
self.write(buf).await?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::spi::ReadWrite<u8> for Spim<'d, T> {
|
impl<'d, T: Instance> embedded_hal_async::spi::SpiBusWrite<u8> for Spim<'d, T> {
|
||||||
type TransferFuture<'a>
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transfer<'a>(&'a mut self, rx: &'a mut [u8], tx: &'a [u8]) -> Self::TransferFuture<'a> {
|
fn write<'a>(&'a mut self, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
self.transfer(rx, tx)
|
self.write(data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransferInPlaceFuture<'a>
|
impl<'d, T: Instance> embedded_hal_async::spi::SpiBus<u8> for Spim<'d, T> {
|
||||||
where
|
type TransferFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transfer_in_place<'a>(
|
fn transfer<'a>(&'a mut self, rx: &'a mut [u8], tx: &'a [u8]) -> Self::TransferFuture<'a> {
|
||||||
&'a mut self,
|
self.transfer(rx, tx)
|
||||||
words: &'a mut [u8],
|
}
|
||||||
) -> Self::TransferInPlaceFuture<'a> {
|
|
||||||
self.transfer_in_place(words)
|
|
||||||
}
|
|
||||||
|
|
||||||
type TransactionFuture<'a>
|
type TransferInPlaceFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transaction<'a>(
|
fn transfer_in_place<'a>(
|
||||||
&'a mut self,
|
&'a mut self,
|
||||||
operations: &'a mut [embedded_hal_async::spi::Operation<'a, u8>],
|
words: &'a mut [u8],
|
||||||
) -> Self::TransactionFuture<'a> {
|
) -> Self::TransferInPlaceFuture<'a> {
|
||||||
use embedded_hal_1::spi::blocking::Operation;
|
self.transfer_in_place(words)
|
||||||
async move {
|
|
||||||
for o in operations {
|
|
||||||
match o {
|
|
||||||
Operation::Read(b) => self.read(b).await?,
|
|
||||||
Operation::Write(b) => self.write(b).await?,
|
|
||||||
Operation::Transfer(r, w) => self.transfer(r, w).await?,
|
|
||||||
Operation::TransferInPlace(b) => self.transfer_in_place(b).await?,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -743,52 +743,43 @@ mod eh1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
impl<'d, T: Instance> embedded_hal_async::i2c::I2c for Twim<'d, T> {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
type ReadFuture<'a>
|
impl<'d, T: Instance> embedded_hal_async::i2c::I2c for Twim<'d, T> {
|
||||||
where
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
self.read(address, buffer)
|
self.read(address, buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WriteFuture<'a>
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Self::WriteFuture<'a> {
|
fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
self.write(address, bytes)
|
self.write(address, bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WriteReadFuture<'a>
|
type WriteReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write_read<'a>(
|
fn write_read<'a>(
|
||||||
&'a mut self,
|
&'a mut self,
|
||||||
address: u8,
|
address: u8,
|
||||||
wr_buffer: &'a [u8],
|
wr_buffer: &'a [u8],
|
||||||
rd_buffer: &'a mut [u8],
|
rd_buffer: &'a mut [u8],
|
||||||
) -> Self::WriteReadFuture<'a> {
|
) -> Self::WriteReadFuture<'a> {
|
||||||
self.write_read(address, wr_buffer, rd_buffer)
|
self.write_read(address, wr_buffer, rd_buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransactionFuture<'a>
|
type TransactionFuture<'a, 'b> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a, 'b: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transaction<'a>(
|
fn transaction<'a, 'b>(
|
||||||
&'a mut self,
|
&'a mut self,
|
||||||
address: u8,
|
address: u8,
|
||||||
operations: &mut [embedded_hal_async::i2c::Operation<'a>],
|
operations: &'a mut [embedded_hal_async::i2c::Operation<'b>],
|
||||||
) -> Self::TransactionFuture<'a> {
|
) -> Self::TransactionFuture<'a, 'b> {
|
||||||
let _ = address;
|
let _ = address;
|
||||||
let _ = operations;
|
let _ = operations;
|
||||||
async move { todo!() }
|
async move { todo!() }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -934,105 +934,78 @@ mod eh1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
mod eh1a {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
use super::*;
|
use core::future::Future;
|
||||||
use core::future::Future;
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::serial::Read for Uarte<'d, T> {
|
impl<'d, T: Instance> embedded_hal_async::serial::Read for Uarte<'d, T> {
|
||||||
type ReadFuture<'a>
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn read<'a>(&'a mut self, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
self.read(buffer)
|
self.read(buffer)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::serial::Write for Uarte<'d, T> {
|
|
||||||
type WriteFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write<'a>(&'a mut self, buffer: &'a [u8]) -> Self::WriteFuture<'a> {
|
|
||||||
self.write(buffer)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type FlushFuture<'a>
|
impl<'d, T: Instance> embedded_hal_async::serial::Write for Uarte<'d, T> {
|
||||||
where
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
fn write<'a>(&'a mut self, buffer: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
async move { Ok(()) }
|
self.write(buffer)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::serial::Write for UarteTx<'d, T> {
|
type FlushFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
type WriteFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write<'a>(&'a mut self, buffer: &'a [u8]) -> Self::WriteFuture<'a> {
|
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
||||||
self.write(buffer)
|
async move { Ok(()) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type FlushFuture<'a>
|
impl<'d, T: Instance> embedded_hal_async::serial::Write for UarteTx<'d, T> {
|
||||||
where
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
fn write<'a>(&'a mut self, buffer: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
async move { Ok(()) }
|
self.write(buffer)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_async::serial::Read for UarteRx<'d, T> {
|
type FlushFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
type ReadFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
||||||
self.read(buffer)
|
async move { Ok(()) }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, U: Instance, T: TimerInstance> embedded_hal_async::serial::Read
|
|
||||||
for UarteWithIdle<'d, U, T>
|
|
||||||
{
|
|
||||||
type ReadFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
|
||||||
self.read(buffer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, U: Instance, T: TimerInstance> embedded_hal_async::serial::Write
|
|
||||||
for UarteWithIdle<'d, U, T>
|
|
||||||
{
|
|
||||||
type WriteFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write<'a>(&'a mut self, buffer: &'a [u8]) -> Self::WriteFuture<'a> {
|
|
||||||
self.write(buffer)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type FlushFuture<'a>
|
impl<'d, T: Instance> embedded_hal_async::serial::Read for UarteRx<'d, T> {
|
||||||
where
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
fn read<'a>(&'a mut self, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
async move { Ok(()) }
|
self.read(buffer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'d, U: Instance, T: TimerInstance> embedded_hal_async::serial::Read
|
||||||
|
for UarteWithIdle<'d, U, T>
|
||||||
|
{
|
||||||
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn read<'a>(&'a mut self, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
|
self.read(buffer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'d, U: Instance, T: TimerInstance> embedded_hal_async::serial::Write
|
||||||
|
for UarteWithIdle<'d, U, T>
|
||||||
|
{
|
||||||
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn write<'a>(&'a mut self, buffer: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
|
self.write(buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
type FlushFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
||||||
|
async move { Ok(()) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,5 +34,5 @@ rp2040-pac2 = { git = "https://github.com/embassy-rs/rp2040-pac2", rev="9ad7223a
|
||||||
#rp2040-pac2 = { path = "../../rp/rp2040-pac2", features = ["rt"] }
|
#rp2040-pac2 = { path = "../../rp/rp2040-pac2", features = ["rt"] }
|
||||||
|
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.6", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.7", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
|
|
|
@ -342,43 +342,25 @@ mod eh1 {
|
||||||
type Error = Error;
|
type Error = Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::blocking::Read<u8> for Spi<'d, T> {
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBusFlush for Spi<'d, T> {
|
||||||
|
fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBusRead<u8> for Spi<'d, T> {
|
||||||
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(words, &[])
|
self.blocking_transfer(words, &[])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_transaction(&mut self, words: &mut [&mut [u8]]) -> Result<(), Self::Error> {
|
|
||||||
for buf in words {
|
|
||||||
self.blocking_read(buf)?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::blocking::Write<u8> for Spi<'d, T> {
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBusWrite<u8> for Spi<'d, T> {
|
||||||
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_write(words)
|
self.blocking_write(words)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_transaction(&mut self, words: &[&[u8]]) -> Result<(), Self::Error> {
|
|
||||||
for buf in words {
|
|
||||||
self.blocking_write(buf)?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_iter<WI>(&mut self, words: WI) -> Result<(), Self::Error>
|
|
||||||
where
|
|
||||||
WI: IntoIterator<Item = u8>,
|
|
||||||
{
|
|
||||||
for w in words {
|
|
||||||
self.blocking_write(&[w])?;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> embedded_hal_1::spi::blocking::ReadWrite<u8> for Spi<'d, T> {
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBus<u8> for Spi<'d, T> {
|
||||||
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer(read, write)
|
self.blocking_transfer(read, write)
|
||||||
}
|
}
|
||||||
|
@ -386,21 +368,5 @@ mod eh1 {
|
||||||
fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
self.blocking_transfer_in_place(words)
|
self.blocking_transfer_in_place(words)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transaction<'a>(
|
|
||||||
&mut self,
|
|
||||||
operations: &mut [embedded_hal_1::spi::blocking::Operation<'a, u8>],
|
|
||||||
) -> Result<(), Self::Error> {
|
|
||||||
use embedded_hal_1::spi::blocking::Operation;
|
|
||||||
for o in operations {
|
|
||||||
match o {
|
|
||||||
Operation::Read(b) => self.blocking_read(b)?,
|
|
||||||
Operation::Write(b) => self.blocking_write(b)?,
|
|
||||||
Operation::Transfer(r, w) => self.blocking_transfer(r, w)?,
|
|
||||||
Operation::TransferInPlace(b) => self.blocking_transfer_in_place(b)?,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,8 @@ embassy-hal-common = {version = "0.1.0", path = "../embassy-hal-common" }
|
||||||
embassy-net = { version = "0.1.0", path = "../embassy-net", default-features = false, optional = true }
|
embassy-net = { version = "0.1.0", path = "../embassy-net", default-features = false, optional = true }
|
||||||
|
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.6", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.7", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
|
|
||||||
defmt = { version = "0.3", optional = true }
|
defmt = { version = "0.3", optional = true }
|
||||||
log = { version = "0.4.14", optional = true }
|
log = { version = "0.4.14", optional = true }
|
||||||
|
|
|
@ -45,7 +45,7 @@ pub struct Ethernet<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> {
|
||||||
macro_rules! config_pins {
|
macro_rules! config_pins {
|
||||||
($($pin:ident),*) => {
|
($($pin:ident),*) => {
|
||||||
// NOTE(unsafe) Exclusive access to the registers
|
// NOTE(unsafe) Exclusive access to the registers
|
||||||
critical_section::with(|_| unsafe {
|
critical_section::with(|_| {
|
||||||
$(
|
$(
|
||||||
$pin.set_as_af($pin.af_num(), AFType::OutputPushPull);
|
$pin.set_as_af($pin.af_num(), AFType::OutputPushPull);
|
||||||
$pin.set_speed(Speed::VeryHigh);
|
$pin.set_speed(Speed::VeryHigh);
|
||||||
|
|
|
@ -36,7 +36,7 @@ pub struct Ethernet<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> {
|
||||||
macro_rules! config_pins {
|
macro_rules! config_pins {
|
||||||
($($pin:ident),*) => {
|
($($pin:ident),*) => {
|
||||||
// NOTE(unsafe) Exclusive access to the registers
|
// NOTE(unsafe) Exclusive access to the registers
|
||||||
critical_section::with(|_| unsafe {
|
critical_section::with(|_| {
|
||||||
$(
|
$(
|
||||||
$pin.set_as_af($pin.af_num(), AFType::OutputPushPull);
|
$pin.set_as_af($pin.af_num(), AFType::OutputPushPull);
|
||||||
$pin.set_speed(Speed::VeryHigh);
|
$pin.set_speed(Speed::VeryHigh);
|
||||||
|
|
|
@ -165,55 +165,40 @@ mod eh1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
mod eh1a {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
use super::*;
|
use futures::FutureExt;
|
||||||
use futures::FutureExt;
|
|
||||||
|
|
||||||
impl<'d, T: GpioPin> embedded_hal_async::digital::Wait for ExtiInput<'d, T> {
|
impl<'d, T: GpioPin> embedded_hal_async::digital::Wait for ExtiInput<'d, T> {
|
||||||
type WaitForHighFuture<'a>
|
type WaitForHighFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_high<'a>(&'a mut self) -> Self::WaitForHighFuture<'a> {
|
fn wait_for_high<'a>(&'a mut self) -> Self::WaitForHighFuture<'a> {
|
||||||
self.wait_for_high().map(Ok)
|
self.wait_for_high().map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForLowFuture<'a>
|
type WaitForLowFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_low<'a>(&'a mut self) -> Self::WaitForLowFuture<'a> {
|
fn wait_for_low<'a>(&'a mut self) -> Self::WaitForLowFuture<'a> {
|
||||||
self.wait_for_low().map(Ok)
|
self.wait_for_low().map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForRisingEdgeFuture<'a>
|
type WaitForRisingEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_rising_edge<'a>(&'a mut self) -> Self::WaitForRisingEdgeFuture<'a> {
|
fn wait_for_rising_edge<'a>(&'a mut self) -> Self::WaitForRisingEdgeFuture<'a> {
|
||||||
self.wait_for_rising_edge().map(Ok)
|
self.wait_for_rising_edge().map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForFallingEdgeFuture<'a>
|
type WaitForFallingEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_falling_edge<'a>(&'a mut self) -> Self::WaitForFallingEdgeFuture<'a> {
|
fn wait_for_falling_edge<'a>(&'a mut self) -> Self::WaitForFallingEdgeFuture<'a> {
|
||||||
self.wait_for_falling_edge().map(Ok)
|
self.wait_for_falling_edge().map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WaitForAnyEdgeFuture<'a>
|
type WaitForAnyEdgeFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn wait_for_any_edge<'a>(&'a mut self) -> Self::WaitForAnyEdgeFuture<'a> {
|
fn wait_for_any_edge<'a>(&'a mut self) -> Self::WaitForAnyEdgeFuture<'a> {
|
||||||
self.wait_for_any_edge().map(Ok)
|
self.wait_for_any_edge().map(Ok)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -917,58 +917,46 @@ mod eh1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
mod eh1a {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
use super::super::{RxDma, TxDma};
|
use super::{RxDma, TxDma};
|
||||||
use super::*;
|
use core::future::Future;
|
||||||
use core::future::Future;
|
|
||||||
|
|
||||||
impl<'d, T: Instance, TXDMA: TxDma<T>, RXDMA: RxDma<T>> embedded_hal_async::i2c::I2c
|
impl<'d, T: Instance, TXDMA: TxDma<T>, RXDMA: RxDma<T>> embedded_hal_async::i2c::I2c
|
||||||
for I2c<'d, T, TXDMA, RXDMA>
|
for I2c<'d, T, TXDMA, RXDMA>
|
||||||
{
|
{
|
||||||
type ReadFuture<'a>
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
self.read(address, buffer)
|
self.read(address, buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
type WriteFuture<'a>
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
Self: 'a,
|
self.write(address, bytes)
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
}
|
||||||
fn write<'a>(&'a mut self, address: u8, bytes: &'a [u8]) -> Self::WriteFuture<'a> {
|
|
||||||
self.write(address, bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
type WriteReadFuture<'a>
|
type WriteReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
fn write_read<'a>(
|
||||||
Self: 'a,
|
&'a mut self,
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
address: u8,
|
||||||
fn write_read<'a>(
|
bytes: &'a [u8],
|
||||||
&'a mut self,
|
buffer: &'a mut [u8],
|
||||||
address: u8,
|
) -> Self::WriteReadFuture<'a> {
|
||||||
bytes: &'a [u8],
|
self.write_read(address, bytes, buffer)
|
||||||
buffer: &'a mut [u8],
|
}
|
||||||
) -> Self::WriteReadFuture<'a> {
|
|
||||||
self.write_read(address, bytes, buffer)
|
|
||||||
}
|
|
||||||
|
|
||||||
type TransactionFuture<'a>
|
type TransactionFuture<'a, 'b> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a, 'b: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transaction<'a>(
|
fn transaction<'a, 'b>(
|
||||||
&'a mut self,
|
&'a mut self,
|
||||||
address: u8,
|
address: u8,
|
||||||
operations: &mut [embedded_hal_async::i2c::Operation<'a>],
|
operations: &'a mut [embedded_hal_async::i2c::Operation<'b>],
|
||||||
) -> Self::TransactionFuture<'a> {
|
) -> Self::TransactionFuture<'a, 'b> {
|
||||||
let _ = address;
|
let _ = address;
|
||||||
let _ = operations;
|
let _ = operations;
|
||||||
async move { todo!() }
|
async move { todo!() }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -445,6 +445,15 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn blocking_read<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> {
|
||||||
|
self.set_word_size(W::WORDSIZE);
|
||||||
|
let regs = T::regs();
|
||||||
|
for word in words.iter_mut() {
|
||||||
|
*word = transfer_word(regs, W::default())?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn blocking_transfer_in_place<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> {
|
pub fn blocking_transfer_in_place<W: Word>(&mut self, words: &mut [W]) -> Result<(), Error> {
|
||||||
self.set_word_size(W::WORDSIZE);
|
self.set_word_size(W::WORDSIZE);
|
||||||
let regs = T::regs();
|
let regs = T::regs();
|
||||||
|
@ -453,6 +462,21 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> {
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn blocking_transfer<W: Word>(&mut self, read: &mut [W], write: &[W]) -> Result<(), Error> {
|
||||||
|
self.set_word_size(W::WORDSIZE);
|
||||||
|
let regs = T::regs();
|
||||||
|
|
||||||
|
let len = read.len().max(write.len());
|
||||||
|
for i in 0..len {
|
||||||
|
let wb = write.get(i).copied().unwrap_or_default();
|
||||||
|
let rb = transfer_word(regs, wb)?;
|
||||||
|
if let Some(r) = read.get_mut(i) {
|
||||||
|
*r = rb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance, Tx, Rx> Drop for Spi<'d, T, Tx, Rx> {
|
impl<'d, T: Instance, Tx, Rx> Drop for Spi<'d, T, Tx, Rx> {
|
||||||
|
@ -669,6 +693,34 @@ mod eh1 {
|
||||||
type Error = Error;
|
type Error = Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'d, T: Instance, Tx, Rx> embedded_hal_1::spi::blocking::SpiBusFlush for Spi<'d, T, Tx, Rx> {
|
||||||
|
fn flush(&mut self) -> Result<(), Self::Error> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBusRead<u8> for Spi<'d, T, NoDma, NoDma> {
|
||||||
|
fn read(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
|
self.blocking_read(words)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBusWrite<u8> for Spi<'d, T, NoDma, NoDma> {
|
||||||
|
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
||||||
|
self.blocking_write(words)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'d, T: Instance> embedded_hal_1::spi::blocking::SpiBus<u8> for Spi<'d, T, NoDma, NoDma> {
|
||||||
|
fn transfer(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Self::Error> {
|
||||||
|
self.blocking_transfer(read, write)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn transfer_in_place(&mut self, words: &mut [u8]) -> Result<(), Self::Error> {
|
||||||
|
self.blocking_transfer_in_place(words)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl embedded_hal_1::spi::Error for Error {
|
impl embedded_hal_1::spi::Error for Error {
|
||||||
fn kind(&self) -> embedded_hal_1::spi::ErrorKind {
|
fn kind(&self) -> embedded_hal_1::spi::ErrorKind {
|
||||||
match *self {
|
match *self {
|
||||||
|
@ -681,115 +733,55 @@ mod eh1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
mod eh1a {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
use super::*;
|
use core::future::Future;
|
||||||
use core::future::Future;
|
impl<'d, T: Instance, Tx, Rx> embedded_hal_async::spi::SpiBusFlush for Spi<'d, T, Tx, Rx> {
|
||||||
|
type FlushFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
impl<'d, T: Instance, Tx: TxDma<T>, Rx> embedded_hal_async::spi::Write<u8> for Spi<'d, T, Tx, Rx> {
|
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
||||||
type WriteFuture<'a>
|
async { Ok(()) }
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write<'a>(&'a mut self, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
|
||||||
self.write(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
type WriteTransactionFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write_transaction<'a>(
|
|
||||||
&'a mut self,
|
|
||||||
words: &'a [&'a [u8]],
|
|
||||||
) -> Self::WriteTransactionFuture<'a> {
|
|
||||||
async move {
|
|
||||||
for buf in words {
|
|
||||||
self.write(buf).await?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, Tx: TxDma<T>, Rx: RxDma<T>> embedded_hal_async::spi::Read<u8>
|
impl<'d, T: Instance, Tx: TxDma<T>, Rx> embedded_hal_async::spi::SpiBusWrite<u8>
|
||||||
for Spi<'d, T, Tx, Rx>
|
for Spi<'d, T, Tx, Rx>
|
||||||
{
|
{
|
||||||
type ReadFuture<'a>
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, data: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn write<'a>(&'a mut self, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
self.read(data)
|
self.write(data)
|
||||||
}
|
|
||||||
|
|
||||||
type ReadTransactionFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read_transaction<'a>(
|
|
||||||
&'a mut self,
|
|
||||||
words: &'a mut [&'a mut [u8]],
|
|
||||||
) -> Self::ReadTransactionFuture<'a> {
|
|
||||||
async move {
|
|
||||||
for buf in words {
|
|
||||||
self.read(buf).await?
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, Tx: TxDma<T>, Rx: RxDma<T>> embedded_hal_async::spi::ReadWrite<u8>
|
impl<'d, T: Instance, Tx: TxDma<T>, Rx: RxDma<T>> embedded_hal_async::spi::SpiBusRead<u8>
|
||||||
for Spi<'d, T, Tx, Rx>
|
for Spi<'d, T, Tx, Rx>
|
||||||
{
|
{
|
||||||
type TransferFuture<'a>
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transfer<'a>(&'a mut self, rx: &'a mut [u8], tx: &'a [u8]) -> Self::TransferFuture<'a> {
|
fn read<'a>(&'a mut self, data: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
self.transfer(rx, tx)
|
self.read(data)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransferInPlaceFuture<'a>
|
impl<'d, T: Instance, Tx: TxDma<T>, Rx: RxDma<T>> embedded_hal_async::spi::SpiBus<u8>
|
||||||
where
|
for Spi<'d, T, Tx, Rx>
|
||||||
Self: 'a,
|
{
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
type TransferFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
fn transfer_in_place<'a>(
|
fn transfer<'a>(&'a mut self, rx: &'a mut [u8], tx: &'a [u8]) -> Self::TransferFuture<'a> {
|
||||||
&'a mut self,
|
self.transfer(rx, tx)
|
||||||
words: &'a mut [u8],
|
}
|
||||||
) -> Self::TransferInPlaceFuture<'a> {
|
|
||||||
// TODO: Implement async version
|
|
||||||
let result = self.blocking_transfer_in_place(words);
|
|
||||||
async move { result }
|
|
||||||
}
|
|
||||||
|
|
||||||
type TransactionFuture<'a>
|
type TransferInPlaceFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transaction<'a>(
|
fn transfer_in_place<'a>(
|
||||||
&'a mut self,
|
&'a mut self,
|
||||||
operations: &'a mut [embedded_hal_async::spi::Operation<'a, u8>],
|
words: &'a mut [u8],
|
||||||
) -> Self::TransactionFuture<'a> {
|
) -> Self::TransferInPlaceFuture<'a> {
|
||||||
use embedded_hal_1::spi::blocking::Operation;
|
// TODO: Implement async version
|
||||||
async move {
|
let result = self.blocking_transfer_in_place(words);
|
||||||
for o in operations {
|
async move { result }
|
||||||
match o {
|
|
||||||
Operation::Read(b) => self.read(b).await?,
|
|
||||||
Operation::Write(b) => self.write(b).await?,
|
|
||||||
Operation::Transfer(r, w) => self.transfer(r, w).await?,
|
|
||||||
Operation::TransferInPlace(b) => self.transfer_in_place(b).await?,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -862,7 +854,7 @@ pub(crate) mod sealed {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Word: Copy + 'static + sealed::Word {}
|
pub trait Word: Copy + 'static + sealed::Word + Default {}
|
||||||
|
|
||||||
impl Word for u8 {}
|
impl Word for u8 {}
|
||||||
impl Word for u16 {}
|
impl Word for u16 {}
|
||||||
|
|
|
@ -275,45 +275,36 @@ mod eh1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
mod eh1a {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
use super::*;
|
use core::future::Future;
|
||||||
use core::future::Future;
|
|
||||||
|
|
||||||
impl<'d, T: Instance, TxDma, RxDma> embedded_hal_async::serial::Write for Uart<'d, T, TxDma, RxDma>
|
impl<'d, T: Instance, TxDma, RxDma> embedded_hal_async::serial::Write for Uart<'d, T, TxDma, RxDma>
|
||||||
where
|
|
||||||
TxDma: crate::usart::TxDma<T>,
|
|
||||||
{
|
|
||||||
type WriteFuture<'a>
|
|
||||||
where
|
where
|
||||||
Self: 'a,
|
TxDma: crate::usart::TxDma<T>,
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
{
|
||||||
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
fn write<'a>(&'a mut self, buf: &'a [u8]) -> Self::WriteFuture<'a> {
|
fn write<'a>(&'a mut self, buf: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
self.write(buf)
|
self.write(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
type FlushFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
|
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
||||||
|
async move { Ok(()) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type FlushFuture<'a>
|
impl<'d, T: Instance, TxDma, RxDma> embedded_hal_async::serial::Read for Uart<'d, T, TxDma, RxDma>
|
||||||
where
|
where
|
||||||
Self: 'a,
|
RxDma: crate::usart::RxDma<T>,
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
{
|
||||||
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
async move { Ok(()) }
|
self.read(buf)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl<'d, T: Instance, TxDma, RxDma> embedded_hal_async::serial::Read for Uart<'d, T, TxDma, RxDma>
|
|
||||||
where
|
|
||||||
RxDma: crate::usart::RxDma<T>,
|
|
||||||
{
|
|
||||||
type ReadFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
|
||||||
self.read(buf)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,8 @@ std = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6", features = ["unproven"] }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.6", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy" }
|
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.7", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2" }
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy"}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2"}
|
||||||
embedded-storage = "0.3.0"
|
embedded-storage = "0.3.0"
|
||||||
embedded-storage-async = "0.3.0"
|
embedded-storage-async = "0.3.0"
|
||||||
nb = "1.0.0"
|
nb = "1.0.0"
|
||||||
|
|
|
@ -39,18 +39,9 @@ where
|
||||||
+ blocking::i2c::Read<Error = E>
|
+ blocking::i2c::Read<Error = E>
|
||||||
+ blocking::i2c::Write<Error = E>,
|
+ blocking::i2c::Write<Error = E>,
|
||||||
{
|
{
|
||||||
type WriteFuture<'a>
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
Self: 'a,
|
type WriteReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
type ReadFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
type WriteReadFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn read<'a>(&'a mut self, address: u8, buffer: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
async move { self.wrapped.read(address, buffer) }
|
async move { self.wrapped.read(address, buffer) }
|
||||||
|
@ -69,16 +60,13 @@ where
|
||||||
async move { self.wrapped.write_read(address, bytes, buffer) }
|
async move { self.wrapped.write_read(address, bytes, buffer) }
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransactionFuture<'a>
|
type TransactionFuture<'a, 'b> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a, 'b: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transaction<'a>(
|
fn transaction<'a, 'b>(
|
||||||
&'a mut self,
|
&'a mut self,
|
||||||
address: u8,
|
address: u8,
|
||||||
operations: &mut [embedded_hal_async::i2c::Operation<'a>],
|
operations: &'a mut [embedded_hal_async::i2c::Operation<'b>],
|
||||||
) -> Self::TransactionFuture<'a> {
|
) -> Self::TransactionFuture<'a, 'b> {
|
||||||
let _ = address;
|
let _ = address;
|
||||||
let _ = operations;
|
let _ = operations;
|
||||||
async move { todo!() }
|
async move { todo!() }
|
||||||
|
@ -97,15 +85,12 @@ where
|
||||||
type Error = E;
|
type Error = E;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, E> embedded_hal_async::spi::ReadWrite<u8> for BlockingAsync<T>
|
impl<T, E> embedded_hal_async::spi::SpiBus<u8> for BlockingAsync<T>
|
||||||
where
|
where
|
||||||
E: embedded_hal_1::spi::Error + 'static,
|
E: embedded_hal_1::spi::Error + 'static,
|
||||||
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
||||||
{
|
{
|
||||||
type TransferFuture<'a>
|
type TransferFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transfer<'a>(&'a mut self, read: &'a mut [u8], write: &'a [u8]) -> Self::TransferFuture<'a> {
|
fn transfer<'a>(&'a mut self, read: &'a mut [u8], write: &'a [u8]) -> Self::TransferFuture<'a> {
|
||||||
async move {
|
async move {
|
||||||
|
@ -118,37 +103,31 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransferInPlaceFuture<'a>
|
type TransferInPlaceFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transfer_in_place<'a>(&'a mut self, _: &'a mut [u8]) -> Self::TransferInPlaceFuture<'a> {
|
fn transfer_in_place<'a>(&'a mut self, _: &'a mut [u8]) -> Self::TransferInPlaceFuture<'a> {
|
||||||
async move { todo!() }
|
async move { todo!() }
|
||||||
}
|
}
|
||||||
|
|
||||||
type TransactionFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn transaction<'a>(
|
|
||||||
&'a mut self,
|
|
||||||
_: &'a mut [embedded_hal_async::spi::Operation<'a, u8>],
|
|
||||||
) -> Self::TransactionFuture<'a> {
|
|
||||||
async move { todo!() }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, E> embedded_hal_async::spi::Write<u8> for BlockingAsync<T>
|
impl<T, E> embedded_hal_async::spi::SpiBusFlush for BlockingAsync<T>
|
||||||
where
|
where
|
||||||
E: embedded_hal_1::spi::Error + 'static,
|
E: embedded_hal_1::spi::Error + 'static,
|
||||||
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
||||||
{
|
{
|
||||||
type WriteFuture<'a>
|
type FlushFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
async move { Ok(()) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, E> embedded_hal_async::spi::SpiBusWrite<u8> for BlockingAsync<T>
|
||||||
|
where
|
||||||
|
E: embedded_hal_1::spi::Error + 'static,
|
||||||
|
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
||||||
|
{
|
||||||
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
|
|
||||||
fn write<'a>(&'a mut self, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
fn write<'a>(&'a mut self, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
async move {
|
async move {
|
||||||
|
@ -156,26 +135,14 @@ where
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type WriteTransactionFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn write_transaction<'a>(&'a mut self, _: &'a [&'a [u8]]) -> Self::WriteTransactionFuture<'a> {
|
|
||||||
async move { todo!() }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, E> embedded_hal_async::spi::Read<u8> for BlockingAsync<T>
|
impl<T, E> embedded_hal_async::spi::SpiBusRead<u8> for BlockingAsync<T>
|
||||||
where
|
where
|
||||||
E: embedded_hal_1::spi::Error + 'static,
|
E: embedded_hal_1::spi::Error + 'static,
|
||||||
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
T: blocking::spi::Transfer<u8, Error = E> + blocking::spi::Write<u8, Error = E>,
|
||||||
{
|
{
|
||||||
type ReadFuture<'a>
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read<'a>(&'a mut self, data: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn read<'a>(&'a mut self, data: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
async move {
|
async move {
|
||||||
|
@ -183,18 +150,6 @@ where
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadTransactionFuture<'a>
|
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn read_transaction<'a>(
|
|
||||||
&'a mut self,
|
|
||||||
_: &'a mut [&'a mut [u8]],
|
|
||||||
) -> Self::ReadTransactionFuture<'a> {
|
|
||||||
async move { todo!() }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uart implementatinos
|
// Uart implementatinos
|
||||||
|
@ -211,10 +166,7 @@ where
|
||||||
T: serial::Read<u8, Error = E>,
|
T: serial::Read<u8, Error = E>,
|
||||||
E: embedded_hal_1::serial::Error + 'static,
|
E: embedded_hal_1::serial::Error + 'static,
|
||||||
{
|
{
|
||||||
type ReadFuture<'a>
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where T: 'a;
|
||||||
where
|
|
||||||
T: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
async move {
|
async move {
|
||||||
let mut pos = 0;
|
let mut pos = 0;
|
||||||
|
@ -238,18 +190,12 @@ where
|
||||||
T: blocking::serial::Write<u8, Error = E> + serial::Read<u8, Error = E>,
|
T: blocking::serial::Write<u8, Error = E> + serial::Read<u8, Error = E>,
|
||||||
E: embedded_hal_1::serial::Error + 'static,
|
E: embedded_hal_1::serial::Error + 'static,
|
||||||
{
|
{
|
||||||
type WriteFuture<'a>
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where T: 'a;
|
||||||
where
|
|
||||||
T: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
fn write<'a>(&'a mut self, buf: &'a [u8]) -> Self::WriteFuture<'a> {
|
fn write<'a>(&'a mut self, buf: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
async move { self.wrapped.bwrite_all(buf) }
|
async move { self.wrapped.bwrite_all(buf) }
|
||||||
}
|
}
|
||||||
|
|
||||||
type FlushFuture<'a>
|
type FlushFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where T: 'a;
|
||||||
where
|
|
||||||
T: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
fn flush<'a>(&'a mut self) -> Self::FlushFuture<'a> {
|
||||||
async move { self.wrapped.bflush() }
|
async move { self.wrapped.bflush() }
|
||||||
}
|
}
|
||||||
|
@ -273,18 +219,12 @@ where
|
||||||
const WRITE_SIZE: usize = <T as NorFlash>::WRITE_SIZE;
|
const WRITE_SIZE: usize = <T as NorFlash>::WRITE_SIZE;
|
||||||
const ERASE_SIZE: usize = <T as NorFlash>::ERASE_SIZE;
|
const ERASE_SIZE: usize = <T as NorFlash>::ERASE_SIZE;
|
||||||
|
|
||||||
type WriteFuture<'a>
|
type WriteFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
fn write<'a>(&'a mut self, offset: u32, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
fn write<'a>(&'a mut self, offset: u32, data: &'a [u8]) -> Self::WriteFuture<'a> {
|
||||||
async move { self.wrapped.write(offset, data) }
|
async move { self.wrapped.write(offset, data) }
|
||||||
}
|
}
|
||||||
|
|
||||||
type EraseFuture<'a>
|
type EraseFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
fn erase<'a>(&'a mut self, from: u32, to: u32) -> Self::EraseFuture<'a> {
|
fn erase<'a>(&'a mut self, from: u32, to: u32) -> Self::EraseFuture<'a> {
|
||||||
async move { self.wrapped.erase(from, to) }
|
async move { self.wrapped.erase(from, to) }
|
||||||
}
|
}
|
||||||
|
@ -295,10 +235,7 @@ where
|
||||||
T: ReadNorFlash,
|
T: ReadNorFlash,
|
||||||
{
|
{
|
||||||
const READ_SIZE: usize = <T as ReadNorFlash>::READ_SIZE;
|
const READ_SIZE: usize = <T as ReadNorFlash>::READ_SIZE;
|
||||||
type ReadFuture<'a>
|
type ReadFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
fn read<'a>(&'a mut self, address: u32, data: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
fn read<'a>(&'a mut self, address: u32, data: &'a mut [u8]) -> Self::ReadFuture<'a> {
|
||||||
async move { self.wrapped.read(address, data) }
|
async move { self.wrapped.read(address, data) }
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,8 +55,8 @@ defmt = { version = "0.3", optional = true }
|
||||||
log = { version = "0.4.14", optional = true }
|
log = { version = "0.4.14", optional = true }
|
||||||
|
|
||||||
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6" }
|
embedded-hal-02 = { package = "embedded-hal", version = "0.2.6" }
|
||||||
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.6", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-1 = { package = "embedded-hal", version = "1.0.0-alpha.7", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy", optional = true}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2", optional = true}
|
||||||
|
|
||||||
futures = { version = "0.3.17", default-features = false, features = [ "cfg-target-has-atomic", "unstable" ] }
|
futures = { version = "0.3.17", default-features = false, features = [ "cfg-target-has-atomic", "unstable" ] }
|
||||||
pin-project = { version = "1.0.8", default-features = false }
|
pin-project = { version = "1.0.8", default-features = false }
|
||||||
|
|
|
@ -1,12 +1,7 @@
|
||||||
#![cfg_attr(not(any(feature = "std", feature = "wasm")), no_std)]
|
#![cfg_attr(not(any(feature = "std", feature = "wasm")), no_std)]
|
||||||
#![cfg_attr(
|
#![cfg_attr(
|
||||||
feature = "nightly",
|
feature = "nightly",
|
||||||
feature(
|
feature(generic_associated_types, type_alias_impl_trait)
|
||||||
const_fn_trait_bound,
|
|
||||||
const_fn_fn_ptr_basics,
|
|
||||||
generic_associated_types,
|
|
||||||
type_alias_impl_trait
|
|
||||||
)
|
|
||||||
)]
|
)]
|
||||||
#![allow(clippy::new_without_default)]
|
#![allow(clippy::new_without_default)]
|
||||||
|
|
||||||
|
|
|
@ -31,32 +31,26 @@ mod eh1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "unstable-traits", feature = "nightly"))]
|
cfg_if::cfg_if! {
|
||||||
mod eh1a {
|
if #[cfg(all(feature = "unstable-traits", feature = "nightly"))] {
|
||||||
use super::*;
|
use crate::time::Timer;
|
||||||
use crate::time::Timer;
|
use core::future::Future;
|
||||||
use core::future::Future;
|
use futures::FutureExt;
|
||||||
use futures::FutureExt;
|
|
||||||
|
|
||||||
impl embedded_hal_async::delay::DelayUs for Delay {
|
impl embedded_hal_async::delay::DelayUs for Delay {
|
||||||
type Error = core::convert::Infallible;
|
type Error = core::convert::Infallible;
|
||||||
|
|
||||||
type DelayUsFuture<'a>
|
type DelayUsFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn delay_us(&mut self, micros: u32) -> Self::DelayUsFuture<'_> {
|
fn delay_us(&mut self, micros: u32) -> Self::DelayUsFuture<'_> {
|
||||||
Timer::after(Duration::from_micros(micros as _)).map(Ok)
|
Timer::after(Duration::from_micros(micros as _)).map(Ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
type DelayMsFuture<'a>
|
type DelayMsFuture<'a> = impl Future<Output = Result<(), Self::Error>> + 'a where Self: 'a;
|
||||||
where
|
|
||||||
Self: 'a,
|
|
||||||
= impl Future<Output = Result<(), Self::Error>> + 'a;
|
|
||||||
|
|
||||||
fn delay_ms(&mut self, millis: u32) -> Self::DelayMsFuture<'_> {
|
fn delay_ms(&mut self, millis: u32) -> Self::DelayMsFuture<'_> {
|
||||||
Timer::after(Duration::from_millis(millis as _)).map(Ok)
|
Timer::after(Duration::from_millis(millis as _)).map(Ok)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ version = "0.1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["nightly"]
|
default = ["nightly"]
|
||||||
nightly = ["embassy-nrf/nightly"]
|
nightly = ["embassy-nrf/nightly", "embassy-nrf/unstable-traits"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] }
|
embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] }
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
authors = ["Dario Nieuwenhuis <dirbaio@dirbaio.net>"]
|
authors = ["Dario Nieuwenhuis <dirbaio@dirbaio.net>"]
|
||||||
edition = "2018"
|
edition = "2021"
|
||||||
name = "embassy-rp-examples"
|
name = "embassy-rp-examples"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
||||||
|
@ -15,9 +15,12 @@ defmt-rtt = "0.3"
|
||||||
|
|
||||||
cortex-m = "0.7.3"
|
cortex-m = "0.7.3"
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
|
||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await", "cfg-target-has-atomic", "unstable"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await", "cfg-target-has-atomic", "unstable"] }
|
||||||
display-interface-spi = "0.4.1"
|
display-interface-spi = "0.4.1"
|
||||||
embedded-graphics = "0.7.1"
|
embedded-graphics = "0.7.1"
|
||||||
st7789 = "0.6.1"
|
st7789 = "0.6.1"
|
||||||
|
|
||||||
|
embedded-hal = { version = "1.0.0-alpha.7", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2" }
|
||||||
|
display-interface = "0.4.1"
|
||||||
|
byte-slice-cast = { version = "1.2.0", default-features = false }
|
||||||
|
|
|
@ -6,16 +6,14 @@
|
||||||
mod example_common;
|
mod example_common;
|
||||||
|
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
use core::fmt::Debug;
|
|
||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use display_interface_spi::SPIInterfaceNoCS;
|
|
||||||
use embassy::executor::Spawner;
|
use embassy::executor::Spawner;
|
||||||
use embassy::time::Delay;
|
use embassy::time::Delay;
|
||||||
use embassy_rp::peripherals;
|
use embassy_rp::gpio::{Level, Output};
|
||||||
use embassy_rp::spi;
|
use embassy_rp::spi;
|
||||||
use embassy_rp::spi::Spi;
|
use embassy_rp::spi::Spi;
|
||||||
use embassy_rp::{gpio, Peripherals};
|
use embassy_rp::Peripherals;
|
||||||
use embedded_graphics::image::{Image, ImageRawLE};
|
use embedded_graphics::image::{Image, ImageRawLE};
|
||||||
use embedded_graphics::mono_font::ascii::FONT_10X20;
|
use embedded_graphics::mono_font::ascii::FONT_10X20;
|
||||||
use embedded_graphics::mono_font::MonoTextStyle;
|
use embedded_graphics::mono_font::MonoTextStyle;
|
||||||
|
@ -23,9 +21,15 @@ use embedded_graphics::pixelcolor::Rgb565;
|
||||||
use embedded_graphics::prelude::*;
|
use embedded_graphics::prelude::*;
|
||||||
use embedded_graphics::primitives::{PrimitiveStyleBuilder, Rectangle};
|
use embedded_graphics::primitives::{PrimitiveStyleBuilder, Rectangle};
|
||||||
use embedded_graphics::text::Text;
|
use embedded_graphics::text::Text;
|
||||||
use gpio::{Level, Output};
|
|
||||||
use st7789::{Orientation, ST7789};
|
use st7789::{Orientation, ST7789};
|
||||||
|
|
||||||
|
use crate::my_display_interface::SPIDeviceInterface;
|
||||||
|
use crate::shared_spi::SpiDeviceWithCs;
|
||||||
|
use crate::touch::Touch;
|
||||||
|
|
||||||
|
//const DISPLAY_FREQ: u32 = 64_000_000;
|
||||||
|
const TOUCH_FREQ: u32 = 200_000;
|
||||||
|
|
||||||
#[embassy::main]
|
#[embassy::main]
|
||||||
async fn main(_spawner: Spawner, p: Peripherals) {
|
async fn main(_spawner: Spawner, p: Peripherals) {
|
||||||
info!("Hello World!");
|
info!("Hello World!");
|
||||||
|
@ -42,17 +46,16 @@ async fn main(_spawner: Spawner, p: Peripherals) {
|
||||||
|
|
||||||
// create SPI
|
// create SPI
|
||||||
let mut config = spi::Config::default();
|
let mut config = spi::Config::default();
|
||||||
config.frequency = DISPLAY_FREQ;
|
config.frequency = TOUCH_FREQ; // use the lowest freq
|
||||||
config.phase = spi::Phase::CaptureOnSecondTransition;
|
config.phase = spi::Phase::CaptureOnSecondTransition;
|
||||||
config.polarity = spi::Polarity::IdleHigh;
|
config.polarity = spi::Polarity::IdleHigh;
|
||||||
|
|
||||||
let spi = RefCell::new(SpiState {
|
let spi_bus = RefCell::new(Spi::new(p.SPI1, clk, mosi, miso, config));
|
||||||
last_mode: SpiMode::Display,
|
|
||||||
spi: Spi::new(p.SPI1, clk, mosi, miso, config),
|
|
||||||
display_cs: Output::new(display_cs, Level::Low),
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut touch = Touch::new(TouchSpi(&spi), Output::new(touch_cs, Level::High));
|
let display_spi = SpiDeviceWithCs::new(&spi_bus, Output::new(display_cs, Level::High));
|
||||||
|
let touch_spi = SpiDeviceWithCs::new(&spi_bus, Output::new(touch_cs, Level::High));
|
||||||
|
|
||||||
|
let mut touch = Touch::new(touch_spi);
|
||||||
|
|
||||||
let dcx = Output::new(dcx, Level::Low);
|
let dcx = Output::new(dcx, Level::Low);
|
||||||
let rst = Output::new(rst, Level::Low);
|
let rst = Output::new(rst, Level::Low);
|
||||||
|
@ -62,7 +65,7 @@ async fn main(_spawner: Spawner, p: Peripherals) {
|
||||||
let _bl = Output::new(bl, Level::High);
|
let _bl = Output::new(bl, Level::High);
|
||||||
|
|
||||||
// display interface abstraction from SPI and DC
|
// display interface abstraction from SPI and DC
|
||||||
let di = SPIInterfaceNoCS::new(DisplaySpi(&spi), dcx);
|
let di = SPIDeviceInterface::new(display_spi, dcx);
|
||||||
|
|
||||||
// create driver
|
// create driver
|
||||||
let mut display = ST7789::new(di, rst, 240, 320);
|
let mut display = ST7789::new(di, rst, 240, 320);
|
||||||
|
@ -104,107 +107,293 @@ async fn main(_spawner: Spawner, p: Peripherals) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
mod shared_spi {
|
||||||
enum SpiMode {
|
use core::cell::RefCell;
|
||||||
Display,
|
use core::fmt::Debug;
|
||||||
Touch,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SpiState {
|
use embedded_hal::digital::blocking::OutputPin;
|
||||||
spi: Spi<'static, peripherals::SPI1>,
|
use embedded_hal::spi;
|
||||||
display_cs: Output<'static, peripherals::PIN_9>,
|
use embedded_hal::spi::blocking::SpiDevice;
|
||||||
|
|
||||||
last_mode: SpiMode,
|
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
|
||||||
}
|
pub enum SpiDeviceWithCsError<BUS, CS> {
|
||||||
|
#[allow(unused)] // will probably use in the future when adding a flush() to SpiBus
|
||||||
|
Spi(BUS),
|
||||||
|
Cs(CS),
|
||||||
|
}
|
||||||
|
|
||||||
const DISPLAY_FREQ: u32 = 64_000_000;
|
impl<BUS, CS> spi::Error for SpiDeviceWithCsError<BUS, CS>
|
||||||
const TOUCH_FREQ: u32 = 200_000;
|
where
|
||||||
|
BUS: spi::Error + Debug,
|
||||||
struct DisplaySpi<'a>(&'a RefCell<SpiState>);
|
CS: Debug,
|
||||||
impl<'a> embedded_hal::blocking::spi::Write<u8> for DisplaySpi<'a> {
|
{
|
||||||
type Error = core::convert::Infallible;
|
fn kind(&self) -> spi::ErrorKind {
|
||||||
|
match self {
|
||||||
fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
|
Self::Spi(e) => e.kind(),
|
||||||
let this = &mut *self.0.borrow_mut();
|
Self::Cs(_) => spi::ErrorKind::Other,
|
||||||
if this.last_mode != SpiMode::Display {
|
}
|
||||||
this.spi.set_frequency(DISPLAY_FREQ);
|
|
||||||
this.display_cs.set_low();
|
|
||||||
this.last_mode = SpiMode::Display;
|
|
||||||
}
|
}
|
||||||
this.spi.write(words).unwrap();
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
struct TouchSpi<'a>(&'a RefCell<SpiState>);
|
pub struct SpiDeviceWithCs<'a, BUS, CS> {
|
||||||
impl<'a> embedded_hal::blocking::spi::Transfer<u8> for TouchSpi<'a> {
|
bus: &'a RefCell<BUS>,
|
||||||
type Error = core::convert::Infallible;
|
cs: CS,
|
||||||
|
}
|
||||||
|
|
||||||
fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> {
|
impl<'a, BUS, CS> SpiDeviceWithCs<'a, BUS, CS> {
|
||||||
let this = &mut *self.0.borrow_mut();
|
pub fn new(bus: &'a RefCell<BUS>, cs: CS) -> Self {
|
||||||
if this.last_mode != SpiMode::Touch {
|
Self { bus, cs }
|
||||||
this.spi.set_frequency(TOUCH_FREQ);
|
|
||||||
this.display_cs.set_high();
|
|
||||||
this.last_mode = SpiMode::Touch;
|
|
||||||
}
|
}
|
||||||
this.spi.transfer(words).unwrap();
|
|
||||||
Ok(words)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Calibration {
|
|
||||||
x1: i32,
|
|
||||||
x2: i32,
|
|
||||||
y1: i32,
|
|
||||||
y2: i32,
|
|
||||||
sx: i32,
|
|
||||||
sy: i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
const CALIBRATION: Calibration = Calibration {
|
|
||||||
x1: 3880,
|
|
||||||
x2: 340,
|
|
||||||
y1: 262,
|
|
||||||
y2: 3850,
|
|
||||||
sx: 320,
|
|
||||||
sy: 240,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Touch<
|
|
||||||
SPI: embedded_hal::blocking::spi::Transfer<u8>,
|
|
||||||
CS: embedded_hal::digital::v2::OutputPin,
|
|
||||||
> {
|
|
||||||
spi: SPI,
|
|
||||||
cs: CS,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<SPI: embedded_hal::blocking::spi::Transfer<u8>, CS: embedded_hal::digital::v2::OutputPin>
|
|
||||||
Touch<SPI, CS>
|
|
||||||
where
|
|
||||||
SPI::Error: Debug,
|
|
||||||
CS::Error: Debug,
|
|
||||||
{
|
|
||||||
pub fn new(spi: SPI, cs: CS) -> Self {
|
|
||||||
Self { spi, cs }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read(&mut self) -> Option<(i32, i32)> {
|
impl<'a, BUS, CS> spi::ErrorType for SpiDeviceWithCs<'a, BUS, CS>
|
||||||
self.cs.set_low().unwrap();
|
where
|
||||||
let mut buf = [0x90, 0x00, 0x00, 0xd0, 0x00, 0x00];
|
BUS: spi::ErrorType,
|
||||||
self.spi.transfer(&mut buf).unwrap();
|
CS: OutputPin,
|
||||||
self.cs.set_high().unwrap();
|
{
|
||||||
|
type Error = SpiDeviceWithCsError<BUS::Error, CS::Error>;
|
||||||
|
}
|
||||||
|
|
||||||
let x = ((buf[1] as u32) << 5 | (buf[2] as u32) >> 3) as i32;
|
impl<'a, BUS, CS> SpiDevice for SpiDeviceWithCs<'a, BUS, CS>
|
||||||
let y = ((buf[4] as u32) << 5 | (buf[5] as u32) >> 3) as i32;
|
where
|
||||||
|
BUS: spi::blocking::SpiBusFlush,
|
||||||
|
CS: OutputPin,
|
||||||
|
{
|
||||||
|
type Bus = BUS;
|
||||||
|
|
||||||
let cal = &CALIBRATION;
|
fn transaction<R>(
|
||||||
|
&mut self,
|
||||||
|
f: impl FnOnce(&mut Self::Bus) -> Result<R, BUS::Error>,
|
||||||
|
) -> Result<R, Self::Error> {
|
||||||
|
let mut bus = self.bus.borrow_mut();
|
||||||
|
self.cs.set_low().map_err(SpiDeviceWithCsError::Cs)?;
|
||||||
|
|
||||||
let x = ((x - cal.x1) * cal.sx / (cal.x2 - cal.x1)).clamp(0, cal.sx);
|
let f_res = f(&mut bus);
|
||||||
let y = ((y - cal.y1) * cal.sy / (cal.y2 - cal.y1)).clamp(0, cal.sy);
|
|
||||||
if x == 0 && y == 0 {
|
// On failure, it's important to still flush and deassert CS.
|
||||||
None
|
let flush_res = bus.flush();
|
||||||
} else {
|
let cs_res = self.cs.set_high();
|
||||||
Some((x, y))
|
|
||||||
|
let f_res = f_res.map_err(SpiDeviceWithCsError::Spi)?;
|
||||||
|
flush_res.map_err(SpiDeviceWithCsError::Spi)?;
|
||||||
|
cs_res.map_err(SpiDeviceWithCsError::Cs)?;
|
||||||
|
|
||||||
|
Ok(f_res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Driver for the XPT2046 resistive touchscreen sensor
|
||||||
|
mod touch {
|
||||||
|
use embedded_hal::spi::blocking::{SpiBus, SpiBusRead, SpiBusWrite, SpiDevice};
|
||||||
|
|
||||||
|
struct Calibration {
|
||||||
|
x1: i32,
|
||||||
|
x2: i32,
|
||||||
|
y1: i32,
|
||||||
|
y2: i32,
|
||||||
|
sx: i32,
|
||||||
|
sy: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
const CALIBRATION: Calibration = Calibration {
|
||||||
|
x1: 3880,
|
||||||
|
x2: 340,
|
||||||
|
y1: 262,
|
||||||
|
y2: 3850,
|
||||||
|
sx: 320,
|
||||||
|
sy: 240,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct Touch<SPI: SpiDevice> {
|
||||||
|
spi: SPI,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<SPI> Touch<SPI>
|
||||||
|
where
|
||||||
|
SPI: SpiDevice,
|
||||||
|
SPI::Bus: SpiBus,
|
||||||
|
{
|
||||||
|
pub fn new(spi: SPI) -> Self {
|
||||||
|
Self { spi }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn read(&mut self) -> Option<(i32, i32)> {
|
||||||
|
let mut x = [0; 2];
|
||||||
|
let mut y = [0; 2];
|
||||||
|
self.spi
|
||||||
|
.transaction(|bus| {
|
||||||
|
bus.write(&[0x90])?;
|
||||||
|
bus.read(&mut x)?;
|
||||||
|
bus.write(&[0xd0])?;
|
||||||
|
bus.read(&mut y)?;
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let x = (u16::from_be_bytes(x) >> 3) as i32;
|
||||||
|
let y = (u16::from_be_bytes(y) >> 3) as i32;
|
||||||
|
|
||||||
|
let cal = &CALIBRATION;
|
||||||
|
|
||||||
|
let x = ((x - cal.x1) * cal.sx / (cal.x2 - cal.x1)).clamp(0, cal.sx);
|
||||||
|
let y = ((y - cal.y1) * cal.sy / (cal.y2 - cal.y1)).clamp(0, cal.sy);
|
||||||
|
if x == 0 && y == 0 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some((x, y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod my_display_interface {
|
||||||
|
use display_interface::{DataFormat, DisplayError, WriteOnlyDataCommand};
|
||||||
|
use embedded_hal::digital::blocking::OutputPin;
|
||||||
|
use embedded_hal::spi::blocking::{SpiBusWrite, SpiDevice};
|
||||||
|
|
||||||
|
/// SPI display interface.
|
||||||
|
///
|
||||||
|
/// This combines the SPI peripheral and a data/command pin
|
||||||
|
pub struct SPIDeviceInterface<SPI, DC> {
|
||||||
|
spi: SPI,
|
||||||
|
dc: DC,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<SPI, DC> SPIDeviceInterface<SPI, DC>
|
||||||
|
where
|
||||||
|
SPI: SpiDevice,
|
||||||
|
SPI::Bus: SpiBusWrite,
|
||||||
|
DC: OutputPin,
|
||||||
|
{
|
||||||
|
/// Create new SPI interface for communciation with a display driver
|
||||||
|
pub fn new(spi: SPI, dc: DC) -> Self {
|
||||||
|
Self { spi, dc }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<SPI, DC> WriteOnlyDataCommand for SPIDeviceInterface<SPI, DC>
|
||||||
|
where
|
||||||
|
SPI: SpiDevice,
|
||||||
|
SPI::Bus: SpiBusWrite,
|
||||||
|
DC: OutputPin,
|
||||||
|
{
|
||||||
|
fn send_commands(&mut self, cmds: DataFormat<'_>) -> Result<(), DisplayError> {
|
||||||
|
let r = self.spi.transaction(|bus| {
|
||||||
|
// 1 = data, 0 = command
|
||||||
|
if let Err(_) = self.dc.set_low() {
|
||||||
|
return Ok(Err(DisplayError::DCError));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send words over SPI
|
||||||
|
send_u8(bus, cmds)?;
|
||||||
|
|
||||||
|
Ok(Ok(()))
|
||||||
|
});
|
||||||
|
r.map_err(|_| DisplayError::BusWriteError)?
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError> {
|
||||||
|
let r = self.spi.transaction(|bus| {
|
||||||
|
// 1 = data, 0 = command
|
||||||
|
if let Err(_) = self.dc.set_high() {
|
||||||
|
return Ok(Err(DisplayError::DCError));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send words over SPI
|
||||||
|
send_u8(bus, buf)?;
|
||||||
|
|
||||||
|
Ok(Ok(()))
|
||||||
|
});
|
||||||
|
r.map_err(|_| DisplayError::BusWriteError)?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn send_u8<T: SpiBusWrite>(spi: &mut T, words: DataFormat<'_>) -> Result<(), T::Error> {
|
||||||
|
match words {
|
||||||
|
DataFormat::U8(slice) => spi.write(slice),
|
||||||
|
DataFormat::U16(slice) => {
|
||||||
|
use byte_slice_cast::*;
|
||||||
|
spi.write(slice.as_byte_slice())
|
||||||
|
}
|
||||||
|
DataFormat::U16LE(slice) => {
|
||||||
|
use byte_slice_cast::*;
|
||||||
|
for v in slice.as_mut() {
|
||||||
|
*v = v.to_le();
|
||||||
|
}
|
||||||
|
spi.write(slice.as_byte_slice())
|
||||||
|
}
|
||||||
|
DataFormat::U16BE(slice) => {
|
||||||
|
use byte_slice_cast::*;
|
||||||
|
for v in slice.as_mut() {
|
||||||
|
*v = v.to_be();
|
||||||
|
}
|
||||||
|
spi.write(slice.as_byte_slice())
|
||||||
|
}
|
||||||
|
DataFormat::U8Iter(iter) => {
|
||||||
|
let mut buf = [0; 32];
|
||||||
|
let mut i = 0;
|
||||||
|
|
||||||
|
for v in iter.into_iter() {
|
||||||
|
buf[i] = v;
|
||||||
|
i += 1;
|
||||||
|
|
||||||
|
if i == buf.len() {
|
||||||
|
spi.write(&buf)?;
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if i > 0 {
|
||||||
|
spi.write(&buf[..i])?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
DataFormat::U16LEIter(iter) => {
|
||||||
|
use byte_slice_cast::*;
|
||||||
|
let mut buf = [0; 32];
|
||||||
|
let mut i = 0;
|
||||||
|
|
||||||
|
for v in iter.map(u16::to_le) {
|
||||||
|
buf[i] = v;
|
||||||
|
i += 1;
|
||||||
|
|
||||||
|
if i == buf.len() {
|
||||||
|
spi.write(&buf.as_byte_slice())?;
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if i > 0 {
|
||||||
|
spi.write(&buf[..i].as_byte_slice())?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
DataFormat::U16BEIter(iter) => {
|
||||||
|
use byte_slice_cast::*;
|
||||||
|
let mut buf = [0; 64];
|
||||||
|
let mut i = 0;
|
||||||
|
let len = buf.len();
|
||||||
|
|
||||||
|
for v in iter.map(u16::to_be) {
|
||||||
|
buf[i] = v;
|
||||||
|
i += 1;
|
||||||
|
|
||||||
|
if i == len {
|
||||||
|
spi.write(&buf.as_byte_slice())?;
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if i > 0 {
|
||||||
|
spi.write(&buf[..i].as_byte_slice())?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
_ => unimplemented!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ resolver = "2"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt", "unstable-traits"] }
|
embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt", "unstable-traits"] }
|
||||||
embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["nightly", "defmt", "stm32f429zi", "unstable-pac", "memory-x", "time-driver-any", "exti", "usb-otg"] }
|
embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["nightly", "unstable-traits", "defmt", "stm32f429zi", "unstable-pac", "memory-x", "time-driver-any", "exti", "usb-otg"] }
|
||||||
|
|
||||||
defmt = "0.3"
|
defmt = "0.3"
|
||||||
defmt-rtt = "0.3"
|
defmt-rtt = "0.3"
|
||||||
|
|
|
@ -19,7 +19,7 @@ defmt-rtt = "0.3"
|
||||||
cortex-m = "0.7.3"
|
cortex-m = "0.7.3"
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy"}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2"}
|
||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
heapless = { version = "0.7.5", default-features = false }
|
heapless = { version = "0.7.5", default-features = false }
|
||||||
|
|
|
@ -18,7 +18,7 @@ defmt-rtt = "0.3"
|
||||||
cortex-m = "0.7.3"
|
cortex-m = "0.7.3"
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy"}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2"}
|
||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
futures = { version = "0.3.17", default-features = false, features = ["async-await"] }
|
||||||
heapless = { version = "0.7.5", default-features = false }
|
heapless = { version = "0.7.5", default-features = false }
|
||||||
|
|
|
@ -12,7 +12,7 @@ use embassy_stm32::spi::{Config, Spi};
|
||||||
use embassy_stm32::time::Hertz;
|
use embassy_stm32::time::Hertz;
|
||||||
use embassy_stm32::Peripherals;
|
use embassy_stm32::Peripherals;
|
||||||
use embassy_traits::adapter::BlockingAsync;
|
use embassy_traits::adapter::BlockingAsync;
|
||||||
use embedded_hal_async::spi::ReadWrite;
|
use embedded_hal_async::spi::SpiBus;
|
||||||
use example_common::*;
|
use example_common::*;
|
||||||
|
|
||||||
#[embassy::main]
|
#[embassy::main]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Before upgrading check that everything is available on all tier1 targets here:
|
# Before upgrading check that everything is available on all tier1 targets here:
|
||||||
# https://rust-lang.github.io/rustup-components-history
|
# https://rust-lang.github.io/rustup-components-history
|
||||||
[toolchain]
|
[toolchain]
|
||||||
channel = "nightly-2022-02-20"
|
channel = "nightly-2022-03-10"
|
||||||
components = [ "rust-src", "rustfmt" ]
|
components = [ "rust-src", "rustfmt" ]
|
||||||
targets = [ "thumbv7em-none-eabi", "thumbv7m-none-eabi", "thumbv6m-none-eabi", "thumbv7em-none-eabihf", "thumbv8m.main-none-eabihf", "wasm32-unknown-unknown" ]
|
targets = [ "thumbv7em-none-eabi", "thumbv7m-none-eabi", "thumbv6m-none-eabi", "thumbv7em-none-eabihf", "thumbv8m.main-none-eabihf", "wasm32-unknown-unknown" ]
|
||||||
|
|
|
@ -23,7 +23,7 @@ defmt-rtt = "0.3.0"
|
||||||
cortex-m = "0.7.3"
|
cortex-m = "0.7.3"
|
||||||
cortex-m-rt = "0.7.0"
|
cortex-m-rt = "0.7.0"
|
||||||
embedded-hal = "0.2.6"
|
embedded-hal = "0.2.6"
|
||||||
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy"}
|
embedded-hal-async = { version = "0.0.1", git = "https://github.com/embassy-rs/embedded-hal", branch = "embassy2"}
|
||||||
panic-probe = { version = "0.3.0", features = ["print-defmt"] }
|
panic-probe = { version = "0.3.0", features = ["print-defmt"] }
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
|
|
Loading…
Reference in a new issue