Run rustfmt.
This commit is contained in:
@ -13,29 +13,27 @@
|
||||
//!
|
||||
//! Please also see [crate::uarte] to understand when [BufferedUarte] should be used.
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use core::cmp::min;
|
||||
use core::future::Future;
|
||||
use core::marker::PhantomData;
|
||||
use core::sync::atomic::{compiler_fence, Ordering};
|
||||
use core::task::Poll;
|
||||
|
||||
use embassy::waitqueue::WakerRegistration;
|
||||
use embassy_cortex_m::peripheral::{PeripheralMutex, PeripheralState, StateStorage};
|
||||
use embassy_hal_common::ring_buffer::RingBuffer;
|
||||
use embassy_hal_common::{low_power_wait_until, unborrow};
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::gpio::Pin as GpioPin;
|
||||
use crate::pac;
|
||||
use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task};
|
||||
use crate::timer::Instance as TimerInstance;
|
||||
use crate::timer::{Frequency, Timer};
|
||||
use crate::uarte::{apply_workaround_for_enable_anomaly, Config, Instance as UarteInstance};
|
||||
|
||||
// Re-export SVD variants to allow user to directly set values
|
||||
pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity};
|
||||
|
||||
use crate::gpio::Pin as GpioPin;
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task};
|
||||
use crate::timer::{Frequency, Instance as TimerInstance, Timer};
|
||||
use crate::uarte::{apply_workaround_for_enable_anomaly, Config, Instance as UarteInstance};
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||
enum RxState {
|
||||
Idle,
|
||||
@ -234,9 +232,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Read for Buffe
|
||||
}
|
||||
}
|
||||
|
||||
impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::BufRead
|
||||
for BufferedUarte<'d, U, T>
|
||||
{
|
||||
impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::BufRead for BufferedUarte<'d, U, T> {
|
||||
type FillBufFuture<'a> = impl Future<Output = Result<&'a [u8], Self::Error>>
|
||||
where
|
||||
Self: 'a;
|
||||
@ -276,9 +272,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::BufRead
|
||||
}
|
||||
}
|
||||
|
||||
impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write
|
||||
for BufferedUarte<'d, U, T>
|
||||
{
|
||||
impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write for BufferedUarte<'d, U, T> {
|
||||
type WriteFuture<'a> = impl Future<Output = Result<usize, Self::Error>>
|
||||
where
|
||||
Self: 'a;
|
||||
|
@ -197,9 +197,10 @@ impl_saadc_input!(P0_04, ANALOGINPUT2);
|
||||
impl_saadc_input!(P0_05, ANALOGINPUT3);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(POWER_CLOCK);
|
||||
declare!(RADIO);
|
||||
declare!(UARTE0_UART0);
|
||||
|
@ -218,9 +218,10 @@ impl_saadc_input!(P0_30, ANALOGINPUT6);
|
||||
impl_saadc_input!(P0_31, ANALOGINPUT7);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(POWER_CLOCK);
|
||||
declare!(RADIO);
|
||||
declare!(UARTE0_UART0);
|
||||
|
@ -219,9 +219,10 @@ impl_saadc_input!(P0_30, ANALOGINPUT6);
|
||||
impl_saadc_input!(P0_31, ANALOGINPUT7);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(POWER_CLOCK);
|
||||
declare!(RADIO);
|
||||
declare!(UARTE0_UART0);
|
||||
|
@ -211,9 +211,10 @@ impl_ppi_channel!(PPI_CH30, 30 => static);
|
||||
impl_ppi_channel!(PPI_CH31, 31 => static);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(POWER_CLOCK);
|
||||
declare!(RADIO);
|
||||
declare!(UARTE0_UART0);
|
||||
|
@ -235,9 +235,10 @@ impl_saadc_input!(P0_30, ANALOGINPUT6);
|
||||
impl_saadc_input!(P0_31, ANALOGINPUT7);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(POWER_CLOCK);
|
||||
declare!(RADIO);
|
||||
declare!(UARTE0_UART0);
|
||||
|
@ -278,9 +278,10 @@ impl_saadc_input!(P0_30, ANALOGINPUT6);
|
||||
impl_saadc_input!(P0_31, ANALOGINPUT7);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(POWER_CLOCK);
|
||||
declare!(RADIO);
|
||||
declare!(UARTE0_UART0);
|
||||
|
@ -283,9 +283,10 @@ impl_saadc_input!(P0_30, ANALOGINPUT6);
|
||||
impl_saadc_input!(P0_31, ANALOGINPUT7);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(POWER_CLOCK);
|
||||
declare!(RADIO);
|
||||
declare!(UARTE0_UART0);
|
||||
|
@ -468,9 +468,10 @@ impl_saadc_input!(P0_19, ANALOGINPUT6);
|
||||
impl_saadc_input!(P0_20, ANALOGINPUT7);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(FPU);
|
||||
declare!(CACHE);
|
||||
declare!(SPU);
|
||||
|
@ -328,9 +328,10 @@ impl_ppi_channel!(PPI_CH30, 30 => configurable);
|
||||
impl_ppi_channel!(PPI_CH31, 31 => configurable);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(CLOCK_POWER);
|
||||
declare!(RADIO);
|
||||
declare!(RNG);
|
||||
|
@ -346,9 +346,10 @@ impl_saadc_input!(P0_19, ANALOGINPUT6);
|
||||
impl_saadc_input!(P0_20, ANALOGINPUT7);
|
||||
|
||||
pub mod irqs {
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
use embassy_macros::cortex_m_interrupt_declare as declare;
|
||||
|
||||
use crate::pac::Interrupt as InterruptEnum;
|
||||
|
||||
declare!(SPU);
|
||||
declare!(CLOCK_POWER);
|
||||
declare!(UARTE0_SPIM0_SPIS0_TWIM0_TWIS0);
|
||||
|
@ -4,15 +4,13 @@ use core::convert::Infallible;
|
||||
use core::hint::unreachable_unchecked;
|
||||
use core::marker::PhantomData;
|
||||
|
||||
use crate::Unborrow;
|
||||
use cfg_if::cfg_if;
|
||||
use embassy_hal_common::{unborrow, unsafe_impl_unborrow};
|
||||
|
||||
use crate::pac;
|
||||
use self::sealed::Pin as _;
|
||||
use crate::pac::p0 as gpio;
|
||||
use crate::pac::p0::pin_cnf::{DRIVE_A, PULL_A};
|
||||
|
||||
use self::sealed::Pin as _;
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
/// A GPIO port with up to 32 pins.
|
||||
#[derive(Debug, Eq, PartialEq)]
|
||||
@ -93,11 +91,7 @@ pub struct Output<'d, T: Pin> {
|
||||
}
|
||||
|
||||
impl<'d, T: Pin> Output<'d, T> {
|
||||
pub fn new(
|
||||
pin: impl Unborrow<Target = T> + 'd,
|
||||
initial_output: Level,
|
||||
drive: OutputDrive,
|
||||
) -> Self {
|
||||
pub fn new(pin: impl Unborrow<Target = T> + 'd, initial_output: Level, drive: OutputDrive) -> Self {
|
||||
let mut pin = Flex::new(pin);
|
||||
match initial_output {
|
||||
Level::High => pin.set_high(),
|
||||
|
@ -1,17 +1,17 @@
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use core::convert::Infallible;
|
||||
use core::future::Future;
|
||||
use core::marker::PhantomData;
|
||||
use core::task::{Context, Poll};
|
||||
|
||||
use embassy::waitqueue::AtomicWaker;
|
||||
use embassy_hal_common::unsafe_impl_unborrow;
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::gpio::sealed::Pin as _;
|
||||
use crate::gpio::{AnyPin, Flex, Input, Output, Pin as GpioPin};
|
||||
use crate::pac;
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::ppi::{Event, Task};
|
||||
use crate::{interrupt, peripherals};
|
||||
use crate::{interrupt, pac, peripherals};
|
||||
|
||||
pub const CHANNEL_COUNT: usize = 8;
|
||||
|
||||
@ -468,9 +468,7 @@ mod eh1 {
|
||||
type Error = Infallible;
|
||||
}
|
||||
|
||||
impl<'d, C: Channel, T: GpioPin> embedded_hal_1::digital::blocking::InputPin
|
||||
for InputChannel<'d, C, T>
|
||||
{
|
||||
impl<'d, C: Channel, T: GpioPin> embedded_hal_1::digital::blocking::InputPin for InputChannel<'d, C, T> {
|
||||
fn is_high(&self) -> Result<bool, Self::Error> {
|
||||
Ok(self.pin.is_high())
|
||||
}
|
||||
|
@ -35,10 +35,7 @@
|
||||
//! mutable slices always reside in RAM.
|
||||
|
||||
#![no_std]
|
||||
#![cfg_attr(
|
||||
feature = "nightly",
|
||||
feature(generic_associated_types, type_alias_impl_trait)
|
||||
)]
|
||||
#![cfg_attr(feature = "nightly", feature(generic_associated_types, type_alias_impl_trait))]
|
||||
|
||||
#[cfg(not(any(
|
||||
feature = "nrf51",
|
||||
@ -115,9 +112,10 @@ mod chip;
|
||||
pub use chip::EASY_DMA_SIZE;
|
||||
|
||||
pub mod interrupt {
|
||||
pub use crate::chip::irqs::*;
|
||||
pub use cortex_m::interrupt::{CriticalSection, Mutex};
|
||||
pub use embassy_cortex_m::interrupt::*;
|
||||
|
||||
pub use crate::chip::irqs::*;
|
||||
}
|
||||
|
||||
// Reexports
|
||||
@ -126,7 +124,6 @@ pub mod interrupt {
|
||||
pub use chip::pac;
|
||||
#[cfg(not(feature = "unstable-pac"))]
|
||||
pub(crate) use chip::pac;
|
||||
|
||||
pub use chip::{peripherals, Peripherals};
|
||||
pub use embassy_cortex_m::executor;
|
||||
pub use embassy_hal_common::{unborrow, Unborrow};
|
||||
|
@ -1,17 +1,16 @@
|
||||
//! Nvmcerature sensor interface.
|
||||
|
||||
use crate::pac;
|
||||
use crate::peripherals::NVMC;
|
||||
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::ptr;
|
||||
use core::slice;
|
||||
use core::{ptr, slice};
|
||||
|
||||
use embassy_hal_common::unborrow;
|
||||
use embedded_storage::nor_flash::{
|
||||
ErrorType, MultiwriteNorFlash, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash,
|
||||
};
|
||||
|
||||
use crate::peripherals::NVMC;
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
pub const PAGE_SIZE: usize = 4096;
|
||||
pub const FLASH_SIZE: usize = crate::chip::FLASH_SIZE;
|
||||
|
||||
|
@ -1,11 +1,9 @@
|
||||
use core::marker::PhantomData;
|
||||
|
||||
use crate::Unborrow;
|
||||
use embassy_hal_common::unborrow;
|
||||
|
||||
use crate::pac;
|
||||
|
||||
use super::{Channel, ConfigurableChannel, Event, Ppi, Task};
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
const DPPI_ENABLE_BIT: u32 = 0x8000_0000;
|
||||
const DPPI_CHANNEL_MASK: u32 = 0x0000_00FF;
|
||||
@ -21,12 +19,7 @@ impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 1> {
|
||||
}
|
||||
|
||||
impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 2> {
|
||||
pub fn new_one_to_two(
|
||||
ch: impl Unborrow<Target = C> + 'd,
|
||||
event: Event,
|
||||
task1: Task,
|
||||
task2: Task,
|
||||
) -> Self {
|
||||
pub fn new_one_to_two(ch: impl Unborrow<Target = C> + 'd, event: Event, task1: Task, task2: Task) -> Self {
|
||||
Ppi::new_many_to_many(ch, [event], [task1, task2])
|
||||
}
|
||||
}
|
||||
@ -64,9 +57,7 @@ impl<'d, C: ConfigurableChannel, const EVENT_COUNT: usize, const TASK_COUNT: usi
|
||||
}
|
||||
}
|
||||
|
||||
impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize>
|
||||
Ppi<'d, C, EVENT_COUNT, TASK_COUNT>
|
||||
{
|
||||
impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize> Ppi<'d, C, EVENT_COUNT, TASK_COUNT> {
|
||||
/// Enables the channel.
|
||||
pub fn enable(&mut self) {
|
||||
let n = self.ch.number();
|
||||
@ -80,9 +71,7 @@ impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize>
|
||||
}
|
||||
}
|
||||
|
||||
impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize> Drop
|
||||
for Ppi<'d, C, EVENT_COUNT, TASK_COUNT>
|
||||
{
|
||||
impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize> Drop for Ppi<'d, C, EVENT_COUNT, TASK_COUNT> {
|
||||
fn drop(&mut self) {
|
||||
self.disable();
|
||||
|
||||
|
@ -15,12 +15,13 @@
|
||||
//! many tasks and events, but any single task or event can only be coupled with one channel.
|
||||
//!
|
||||
|
||||
use crate::peripherals;
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::ptr::NonNull;
|
||||
|
||||
use embassy_hal_common::unsafe_impl_unborrow;
|
||||
|
||||
use crate::{peripherals, Unborrow};
|
||||
|
||||
#[cfg(feature = "_dppi")]
|
||||
mod dppi;
|
||||
#[cfg(feature = "_ppi")]
|
||||
|
@ -1,10 +1,9 @@
|
||||
use core::marker::PhantomData;
|
||||
|
||||
use crate::Unborrow;
|
||||
use embassy_hal_common::unborrow;
|
||||
|
||||
use super::{Channel, ConfigurableChannel, Event, Ppi, StaticChannel, Task};
|
||||
use crate::pac;
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
impl Task {
|
||||
fn reg_val(&self) -> u32 {
|
||||
@ -55,12 +54,7 @@ impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 1> {
|
||||
|
||||
#[cfg(not(feature = "nrf51"))] // Not for nrf51 because of the fork task
|
||||
impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 2> {
|
||||
pub fn new_one_to_two(
|
||||
ch: impl Unborrow<Target = C> + 'd,
|
||||
event: Event,
|
||||
task1: Task,
|
||||
task2: Task,
|
||||
) -> Self {
|
||||
pub fn new_one_to_two(ch: impl Unborrow<Target = C> + 'd, event: Event, task1: Task, task2: Task) -> Self {
|
||||
unborrow!(ch);
|
||||
|
||||
let r = regs();
|
||||
@ -76,9 +70,7 @@ impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 2> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize>
|
||||
Ppi<'d, C, EVENT_COUNT, TASK_COUNT>
|
||||
{
|
||||
impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize> Ppi<'d, C, EVENT_COUNT, TASK_COUNT> {
|
||||
/// Enables the channel.
|
||||
pub fn enable(&mut self) {
|
||||
let n = self.ch.number();
|
||||
@ -92,9 +84,7 @@ impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize>
|
||||
}
|
||||
}
|
||||
|
||||
impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize> Drop
|
||||
for Ppi<'d, C, EVENT_COUNT, TASK_COUNT>
|
||||
{
|
||||
impl<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize> Drop for Ppi<'d, C, EVENT_COUNT, TASK_COUNT> {
|
||||
fn drop(&mut self) {
|
||||
self.disable();
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
#![macro_use]
|
||||
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::sync::atomic::{compiler_fence, Ordering};
|
||||
|
||||
use embassy_hal_common::unborrow;
|
||||
|
||||
use crate::gpio::sealed::Pin as _;
|
||||
use crate::gpio::{AnyPin, Pin as GpioPin, PselBits};
|
||||
use crate::interrupt::Interrupt;
|
||||
use crate::pac;
|
||||
use crate::ppi::{Event, Task};
|
||||
use crate::util::slice_in_ram_or;
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
/// SimplePwm is the traditional pwm interface you're probably used to, allowing
|
||||
/// to simply set a duty cycle across up to four channels.
|
||||
@ -68,14 +68,7 @@ impl<'d, T: Instance> SequencePwm<'d, T> {
|
||||
config: Config,
|
||||
) -> Result<Self, Error> {
|
||||
unborrow!(ch0, ch1);
|
||||
Self::new_inner(
|
||||
pwm,
|
||||
Some(ch0.degrade()),
|
||||
Some(ch1.degrade()),
|
||||
None,
|
||||
None,
|
||||
config,
|
||||
)
|
||||
Self::new_inner(pwm, Some(ch0.degrade()), Some(ch1.degrade()), None, None, config)
|
||||
}
|
||||
|
||||
/// Create a new 3-channel PWM
|
||||
@ -171,10 +164,8 @@ impl<'d, T: Instance> SequencePwm<'d, T> {
|
||||
CounterMode::UpAndDown => w.updown().up_and_down(),
|
||||
CounterMode::Up => w.updown().up(),
|
||||
});
|
||||
r.prescaler
|
||||
.write(|w| w.prescaler().bits(config.prescaler as u8));
|
||||
r.countertop
|
||||
.write(|w| unsafe { w.countertop().bits(config.max_duty) });
|
||||
r.prescaler.write(|w| w.prescaler().bits(config.prescaler as u8));
|
||||
r.countertop.write(|w| unsafe { w.countertop().bits(config.max_duty) });
|
||||
|
||||
Ok(Self {
|
||||
phantom: PhantomData,
|
||||
@ -391,9 +382,7 @@ impl<'d, 's, T: Instance> SingleSequencer<'d, 's, T> {
|
||||
pub fn start(&self, times: SingleSequenceMode) -> Result<(), Error> {
|
||||
let (start_seq, times) = match times {
|
||||
SingleSequenceMode::Times(n) if n == 1 => (StartSequence::One, SequenceMode::Loop(1)),
|
||||
SingleSequenceMode::Times(n) if n & 1 == 1 => {
|
||||
(StartSequence::One, SequenceMode::Loop((n / 2) + 1))
|
||||
}
|
||||
SingleSequenceMode::Times(n) if n & 1 == 1 => (StartSequence::One, SequenceMode::Loop((n / 2) + 1)),
|
||||
SingleSequenceMode::Times(n) => (StartSequence::Zero, SequenceMode::Loop(n / 2)),
|
||||
SingleSequenceMode::Infinite => (StartSequence::Zero, SequenceMode::Infinite),
|
||||
};
|
||||
@ -424,11 +413,7 @@ pub struct Sequencer<'d, 's, T: Instance> {
|
||||
impl<'d, 's, T: Instance> Sequencer<'d, 's, T> {
|
||||
/// Create a new double sequence. In the absence of sequence 1, sequence 0
|
||||
/// will be used twice in the one loop.
|
||||
pub fn new(
|
||||
pwm: &'s mut SequencePwm<'d, T>,
|
||||
sequence0: Sequence<'s>,
|
||||
sequence1: Option<Sequence<'s>>,
|
||||
) -> Self {
|
||||
pub fn new(pwm: &'s mut SequencePwm<'d, T>, sequence0: Sequence<'s>, sequence1: Option<Sequence<'s>>) -> Self {
|
||||
Sequencer {
|
||||
_pwm: pwm,
|
||||
sequence0,
|
||||
@ -457,42 +442,26 @@ impl<'d, 's, T: Instance> Sequencer<'d, 's, T> {
|
||||
|
||||
let r = T::regs();
|
||||
|
||||
r.seq0
|
||||
.refresh
|
||||
.write(|w| unsafe { w.bits(sequence0.config.refresh) });
|
||||
r.seq0
|
||||
.enddelay
|
||||
.write(|w| unsafe { w.bits(sequence0.config.end_delay) });
|
||||
r.seq0
|
||||
.ptr
|
||||
.write(|w| unsafe { w.bits(sequence0.words.as_ptr() as u32) });
|
||||
r.seq0
|
||||
.cnt
|
||||
.write(|w| unsafe { w.bits(sequence0.words.len() as u32) });
|
||||
r.seq0.refresh.write(|w| unsafe { w.bits(sequence0.config.refresh) });
|
||||
r.seq0.enddelay.write(|w| unsafe { w.bits(sequence0.config.end_delay) });
|
||||
r.seq0.ptr.write(|w| unsafe { w.bits(sequence0.words.as_ptr() as u32) });
|
||||
r.seq0.cnt.write(|w| unsafe { w.bits(sequence0.words.len() as u32) });
|
||||
|
||||
r.seq1
|
||||
.refresh
|
||||
.write(|w| unsafe { w.bits(alt_sequence.config.refresh) });
|
||||
r.seq1.refresh.write(|w| unsafe { w.bits(alt_sequence.config.refresh) });
|
||||
r.seq1
|
||||
.enddelay
|
||||
.write(|w| unsafe { w.bits(alt_sequence.config.end_delay) });
|
||||
r.seq1
|
||||
.ptr
|
||||
.write(|w| unsafe { w.bits(alt_sequence.words.as_ptr() as u32) });
|
||||
r.seq1
|
||||
.cnt
|
||||
.write(|w| unsafe { w.bits(alt_sequence.words.len() as u32) });
|
||||
r.seq1.cnt.write(|w| unsafe { w.bits(alt_sequence.words.len() as u32) });
|
||||
|
||||
r.enable.write(|w| w.enable().enabled());
|
||||
|
||||
// defensive before seqstart
|
||||
compiler_fence(Ordering::SeqCst);
|
||||
|
||||
let seqstart_index = if start_seq == StartSequence::One {
|
||||
1
|
||||
} else {
|
||||
0
|
||||
};
|
||||
let seqstart_index = if start_seq == StartSequence::One { 1 } else { 0 };
|
||||
|
||||
match times {
|
||||
// just the one time, no loop count
|
||||
@ -604,10 +573,7 @@ pub enum CounterMode {
|
||||
impl<'d, T: Instance> SimplePwm<'d, T> {
|
||||
/// Create a new 1-channel PWM
|
||||
#[allow(unused_unsafe)]
|
||||
pub fn new_1ch(
|
||||
pwm: impl Unborrow<Target = T> + 'd,
|
||||
ch0: impl Unborrow<Target = impl GpioPin> + 'd,
|
||||
) -> Self {
|
||||
pub fn new_1ch(pwm: impl Unborrow<Target = T> + 'd, ch0: impl Unborrow<Target = impl GpioPin> + 'd) -> Self {
|
||||
unborrow!(ch0);
|
||||
Self::new_inner(pwm, Some(ch0.degrade()), None, None, None)
|
||||
}
|
||||
@ -632,13 +598,7 @@ impl<'d, T: Instance> SimplePwm<'d, T> {
|
||||
ch2: impl Unborrow<Target = impl GpioPin> + 'd,
|
||||
) -> Self {
|
||||
unborrow!(ch0, ch1, ch2);
|
||||
Self::new_inner(
|
||||
pwm,
|
||||
Some(ch0.degrade()),
|
||||
Some(ch1.degrade()),
|
||||
Some(ch2.degrade()),
|
||||
None,
|
||||
)
|
||||
Self::new_inner(pwm, Some(ch0.degrade()), Some(ch1.degrade()), Some(ch2.degrade()), None)
|
||||
}
|
||||
|
||||
/// Create a new 4-channel PWM
|
||||
@ -709,9 +669,7 @@ impl<'d, T: Instance> SimplePwm<'d, T> {
|
||||
// Enable
|
||||
r.enable.write(|w| w.enable().enabled());
|
||||
|
||||
r.seq0
|
||||
.ptr
|
||||
.write(|w| unsafe { w.bits((&pwm.duty).as_ptr() as u32) });
|
||||
r.seq0.ptr.write(|w| unsafe { w.bits((&pwm.duty).as_ptr() as u32) });
|
||||
|
||||
r.seq0.cnt.write(|w| unsafe { w.bits(4) });
|
||||
r.seq0.refresh.write(|w| unsafe { w.bits(0) });
|
||||
@ -750,9 +708,7 @@ impl<'d, T: Instance> SimplePwm<'d, T> {
|
||||
self.duty[channel] = duty & 0x7FFF;
|
||||
|
||||
// reload ptr in case self was moved
|
||||
r.seq0
|
||||
.ptr
|
||||
.write(|w| unsafe { w.bits((&self.duty).as_ptr() as u32) });
|
||||
r.seq0.ptr.write(|w| unsafe { w.bits((&self.duty).as_ptr() as u32) });
|
||||
|
||||
// defensive before seqstart
|
||||
compiler_fence(Ordering::SeqCst);
|
||||
|
@ -1,19 +1,18 @@
|
||||
//! Quadrature decoder interface
|
||||
|
||||
use crate::gpio::sealed::Pin as _;
|
||||
use crate::gpio::{AnyPin, Pin as GpioPin};
|
||||
use crate::interrupt;
|
||||
use crate::pac;
|
||||
use crate::peripherals::QDEC;
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::task::Poll;
|
||||
|
||||
use embassy::waitqueue::AtomicWaker;
|
||||
use embassy_hal_common::unborrow;
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::gpio::sealed::Pin as _;
|
||||
use crate::gpio::{AnyPin, Pin as GpioPin};
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::peripherals::QDEC;
|
||||
use crate::{interrupt, pac, Unborrow};
|
||||
|
||||
/// Quadrature decoder
|
||||
pub struct Qdec<'d> {
|
||||
phantom: PhantomData<&'d QDEC>,
|
||||
@ -63,14 +62,7 @@ impl<'d> Qdec<'d> {
|
||||
config: Config,
|
||||
) -> Self {
|
||||
unborrow!(a, b, led);
|
||||
Self::new_inner(
|
||||
qdec,
|
||||
irq,
|
||||
a.degrade(),
|
||||
b.degrade(),
|
||||
Some(led.degrade()),
|
||||
config,
|
||||
)
|
||||
Self::new_inner(qdec, irq, a.degrade(), b.degrade(), Some(led.degrade()), config)
|
||||
}
|
||||
|
||||
fn new_inner(
|
||||
@ -139,9 +131,7 @@ impl<'d> Qdec<'d> {
|
||||
});
|
||||
irq.enable();
|
||||
|
||||
Self {
|
||||
phantom: PhantomData,
|
||||
}
|
||||
Self { phantom: PhantomData }
|
||||
}
|
||||
|
||||
/// Perform an asynchronous read of the decoder.
|
||||
|
@ -1,22 +1,20 @@
|
||||
#![macro_use]
|
||||
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::ptr;
|
||||
use core::task::Poll;
|
||||
|
||||
use embassy_hal_common::drop::DropBomb;
|
||||
use embassy_hal_common::unborrow;
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::gpio::sealed::Pin as _;
|
||||
use crate::gpio::{self, Pin as GpioPin};
|
||||
use crate::pac;
|
||||
|
||||
pub use crate::pac::qspi::ifconfig0::ADDRMODE_A as AddressMode;
|
||||
pub use crate::pac::qspi::ifconfig0::PPSIZE_A as WritePageSize;
|
||||
pub use crate::pac::qspi::ifconfig0::READOC_A as ReadOpcode;
|
||||
pub use crate::pac::qspi::ifconfig0::WRITEOC_A as WriteOpcode;
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
pub use crate::pac::qspi::ifconfig0::{
|
||||
ADDRMODE_A as AddressMode, PPSIZE_A as WritePageSize, READOC_A as ReadOpcode, WRITEOC_A as WriteOpcode,
|
||||
};
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
// TODO
|
||||
// - config:
|
||||
@ -168,12 +166,7 @@ impl<'d, T: Instance, const FLASH_SIZE: usize> Qspi<'d, T, FLASH_SIZE> {
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn custom_instruction(
|
||||
&mut self,
|
||||
opcode: u8,
|
||||
req: &[u8],
|
||||
resp: &mut [u8],
|
||||
) -> Result<(), Error> {
|
||||
pub async fn custom_instruction(&mut self, opcode: u8, req: &[u8], resp: &mut [u8]) -> Result<(), Error> {
|
||||
let bomb = DropBomb::new();
|
||||
|
||||
let len = core::cmp::max(req.len(), resp.len()) as u8;
|
||||
@ -188,12 +181,7 @@ impl<'d, T: Instance, const FLASH_SIZE: usize> Qspi<'d, T, FLASH_SIZE> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn blocking_custom_instruction(
|
||||
&mut self,
|
||||
opcode: u8,
|
||||
req: &[u8],
|
||||
resp: &mut [u8],
|
||||
) -> Result<(), Error> {
|
||||
pub fn blocking_custom_instruction(&mut self, opcode: u8, req: &[u8], resp: &mut [u8]) -> Result<(), Error> {
|
||||
let len = core::cmp::max(req.len(), resp.len()) as u8;
|
||||
self.custom_instruction_start(opcode, req, len)?;
|
||||
|
||||
@ -292,15 +280,9 @@ impl<'d, T: Instance, const FLASH_SIZE: usize> Qspi<'d, T, FLASH_SIZE> {
|
||||
|
||||
let r = T::regs();
|
||||
|
||||
r.read
|
||||
.src
|
||||
.write(|w| unsafe { w.src().bits(address as u32) });
|
||||
r.read
|
||||
.dst
|
||||
.write(|w| unsafe { w.dst().bits(data.as_ptr() as u32) });
|
||||
r.read
|
||||
.cnt
|
||||
.write(|w| unsafe { w.cnt().bits(data.len() as u32) });
|
||||
r.read.src.write(|w| unsafe { w.src().bits(address as u32) });
|
||||
r.read.dst.write(|w| unsafe { w.dst().bits(data.as_ptr() as u32) });
|
||||
r.read.cnt.write(|w| unsafe { w.cnt().bits(data.len() as u32) });
|
||||
|
||||
r.events_ready.reset();
|
||||
r.intenset.write(|w| w.ready().set());
|
||||
@ -322,15 +304,9 @@ impl<'d, T: Instance, const FLASH_SIZE: usize> Qspi<'d, T, FLASH_SIZE> {
|
||||
}
|
||||
|
||||
let r = T::regs();
|
||||
r.write
|
||||
.src
|
||||
.write(|w| unsafe { w.src().bits(data.as_ptr() as u32) });
|
||||
r.write
|
||||
.dst
|
||||
.write(|w| unsafe { w.dst().bits(address as u32) });
|
||||
r.write
|
||||
.cnt
|
||||
.write(|w| unsafe { w.cnt().bits(data.len() as u32) });
|
||||
r.write.src.write(|w| unsafe { w.src().bits(data.as_ptr() as u32) });
|
||||
r.write.dst.write(|w| unsafe { w.dst().bits(address as u32) });
|
||||
r.write.cnt.write(|w| unsafe { w.cnt().bits(data.len() as u32) });
|
||||
|
||||
r.events_ready.reset();
|
||||
r.intenset.write(|w| w.ready().set());
|
||||
@ -346,9 +322,7 @@ impl<'d, T: Instance, const FLASH_SIZE: usize> Qspi<'d, T, FLASH_SIZE> {
|
||||
}
|
||||
|
||||
let r = T::regs();
|
||||
r.erase
|
||||
.ptr
|
||||
.write(|w| unsafe { w.ptr().bits(address as u32) });
|
||||
r.erase.ptr.write(|w| unsafe { w.ptr().bits(address as u32) });
|
||||
r.erase.len.write(|w| w.len()._4kb());
|
||||
|
||||
r.events_ready.reset();
|
||||
@ -458,9 +432,7 @@ impl<'d, T: Instance, const FLASH_SIZE: usize> Drop for Qspi<'d, T, FLASH_SIZE>
|
||||
}
|
||||
}
|
||||
|
||||
use embedded_storage::nor_flash::{
|
||||
ErrorType, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash,
|
||||
};
|
||||
use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash};
|
||||
|
||||
impl<'d, T: Instance, const FLASH_SIZE: usize> ErrorType for Qspi<'d, T, FLASH_SIZE> {
|
||||
type Error = Error;
|
||||
|
@ -1,19 +1,16 @@
|
||||
use core::marker::PhantomData;
|
||||
use core::ptr;
|
||||
use core::sync::atomic::AtomicPtr;
|
||||
use core::sync::atomic::Ordering;
|
||||
use core::sync::atomic::{AtomicPtr, Ordering};
|
||||
use core::task::Poll;
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use embassy::waitqueue::AtomicWaker;
|
||||
use embassy_hal_common::drop::OnDrop;
|
||||
use embassy_hal_common::unborrow;
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::interrupt;
|
||||
use crate::pac;
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::peripherals::RNG;
|
||||
use crate::{interrupt, pac, Unborrow};
|
||||
|
||||
impl RNG {
|
||||
fn regs() -> &'static pac::rng::RegisterBlock {
|
||||
@ -48,10 +45,7 @@ impl<'d> Rng<'d> {
|
||||
/// e.g. using `mem::forget`.
|
||||
///
|
||||
/// The synchronous API is safe.
|
||||
pub fn new(
|
||||
_rng: impl Unborrow<Target = RNG> + 'd,
|
||||
irq: impl Unborrow<Target = interrupt::RNG> + 'd,
|
||||
) -> Self {
|
||||
pub fn new(_rng: impl Unborrow<Target = RNG> + 'd, irq: impl Unborrow<Target = interrupt::RNG> + 'd) -> Self {
|
||||
unborrow!(irq);
|
||||
|
||||
let this = Self {
|
||||
|
@ -1,29 +1,23 @@
|
||||
#![macro_use]
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::sync::atomic::{compiler_fence, Ordering};
|
||||
use core::task::Poll;
|
||||
|
||||
use embassy::waitqueue::AtomicWaker;
|
||||
use embassy_hal_common::unborrow;
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::interrupt;
|
||||
use crate::ppi::{ConfigurableChannel, Event, Ppi, Task};
|
||||
use crate::timer::{Frequency, Instance as TimerInstance, Timer};
|
||||
use crate::{pac, peripherals};
|
||||
|
||||
use pac::{saadc, SAADC};
|
||||
|
||||
use saadc::ch::config::{GAIN_A, REFSEL_A, RESP_A, TACQ_A};
|
||||
// We treat the positive and negative channels with the same enum values to keep our type tidy and given they are the same
|
||||
pub(crate) use saadc::ch::pselp::PSELP_A as InputChannel;
|
||||
use saadc::oversample::OVERSAMPLE_A;
|
||||
use saadc::resolution::VAL_A;
|
||||
|
||||
use saadc::{
|
||||
ch::config::{GAIN_A, REFSEL_A, RESP_A, TACQ_A},
|
||||
oversample::OVERSAMPLE_A,
|
||||
resolution::VAL_A,
|
||||
};
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::ppi::{ConfigurableChannel, Event, Ppi, Task};
|
||||
use crate::timer::{Frequency, Instance as TimerInstance, Timer};
|
||||
use crate::{interrupt, pac, peripherals, Unborrow};
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
@ -178,23 +172,17 @@ impl<'d, const N: usize> Saadc<'d, N> {
|
||||
|
||||
let r = unsafe { &*SAADC::ptr() };
|
||||
|
||||
let Config {
|
||||
resolution,
|
||||
oversample,
|
||||
} = config;
|
||||
let Config { resolution, oversample } = config;
|
||||
|
||||
// Configure channels
|
||||
r.enable.write(|w| w.enable().enabled());
|
||||
r.resolution.write(|w| w.val().variant(resolution.into()));
|
||||
r.oversample
|
||||
.write(|w| w.oversample().variant(oversample.into()));
|
||||
r.oversample.write(|w| w.oversample().variant(oversample.into()));
|
||||
|
||||
for (i, cc) in channel_configs.iter().enumerate() {
|
||||
r.ch[i].pselp.write(|w| w.pselp().variant(cc.p_channel));
|
||||
if let Some(n_channel) = cc.n_channel {
|
||||
r.ch[i]
|
||||
.pseln
|
||||
.write(|w| unsafe { w.pseln().bits(n_channel as u8) });
|
||||
r.ch[i].pseln.write(|w| unsafe { w.pseln().bits(n_channel as u8) });
|
||||
}
|
||||
r.ch[i].config.write(|w| {
|
||||
w.refsel().variant(cc.reference.into());
|
||||
@ -223,9 +211,7 @@ impl<'d, const N: usize> Saadc<'d, N> {
|
||||
irq.unpend();
|
||||
irq.enable();
|
||||
|
||||
Self {
|
||||
phantom: PhantomData,
|
||||
}
|
||||
Self { phantom: PhantomData }
|
||||
}
|
||||
|
||||
fn on_interrupt(_ctx: *mut ()) {
|
||||
@ -285,12 +271,8 @@ impl<'d, const N: usize> Saadc<'d, N> {
|
||||
let r = Self::regs();
|
||||
|
||||
// Set up the DMA
|
||||
r.result
|
||||
.ptr
|
||||
.write(|w| unsafe { w.ptr().bits(buf.as_mut_ptr() as u32) });
|
||||
r.result
|
||||
.maxcnt
|
||||
.write(|w| unsafe { w.maxcnt().bits(N as _) });
|
||||
r.result.ptr.write(|w| unsafe { w.ptr().bits(buf.as_mut_ptr() as u32) });
|
||||
r.result.maxcnt.write(|w| unsafe { w.maxcnt().bits(N as _) });
|
||||
|
||||
// Reset and enable the end event
|
||||
r.events_end.reset();
|
||||
@ -353,11 +335,8 @@ impl<'d, const N: usize> Saadc<'d, N> {
|
||||
// We want the task start to effectively short with the last one ending so
|
||||
// we don't miss any samples. It'd be great for the SAADC to offer a SHORTS
|
||||
// register instead, but it doesn't, so we must use PPI.
|
||||
let mut start_ppi = Ppi::new_one_to_one(
|
||||
ppi_ch1,
|
||||
Event::from_reg(&r.events_end),
|
||||
Task::from_reg(&r.tasks_start),
|
||||
);
|
||||
let mut start_ppi =
|
||||
Ppi::new_one_to_one(ppi_ch1, Event::from_reg(&r.events_end), Task::from_reg(&r.tasks_start));
|
||||
start_ppi.enable();
|
||||
|
||||
let mut timer = Timer::new(timer);
|
||||
@ -365,11 +344,7 @@ impl<'d, const N: usize> Saadc<'d, N> {
|
||||
timer.cc(0).write(sample_counter);
|
||||
timer.cc(0).short_compare_clear();
|
||||
|
||||
let mut sample_ppi = Ppi::new_one_to_one(
|
||||
ppi_ch2,
|
||||
timer.cc(0).event_compare(),
|
||||
Task::from_reg(&r.tasks_sample),
|
||||
);
|
||||
let mut sample_ppi = Ppi::new_one_to_one(ppi_ch2, timer.cc(0).event_compare(), Task::from_reg(&r.tasks_sample));
|
||||
|
||||
timer.start();
|
||||
|
||||
@ -417,9 +392,7 @@ impl<'d, const N: usize> Saadc<'d, N> {
|
||||
r.result
|
||||
.ptr
|
||||
.write(|w| unsafe { w.ptr().bits(bufs[0].as_mut_ptr() as u32) });
|
||||
r.result
|
||||
.maxcnt
|
||||
.write(|w| unsafe { w.maxcnt().bits((N0 * N) as _) });
|
||||
r.result.maxcnt.write(|w| unsafe { w.maxcnt().bits((N0 * N) as _) });
|
||||
|
||||
// Reset and enable the events
|
||||
r.events_end.reset();
|
||||
@ -500,8 +473,7 @@ impl<'d> Saadc<'d, 1> {
|
||||
) where
|
||||
S: FnMut(&[[i16; 1]]) -> SamplerState,
|
||||
{
|
||||
self.run_sampler(bufs, Some(sample_rate_divisor), || {}, sampler)
|
||||
.await;
|
||||
self.run_sampler(bufs, Some(sample_rate_divisor), || {}, sampler).await;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,23 +1,20 @@
|
||||
#![macro_use]
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::sync::atomic::{compiler_fence, Ordering};
|
||||
use core::task::Poll;
|
||||
|
||||
use embassy_hal_common::unborrow;
|
||||
pub use embedded_hal_02::spi::{Mode, Phase, Polarity, MODE_0, MODE_1, MODE_2, MODE_3};
|
||||
use futures::future::poll_fn;
|
||||
pub use pac::spim0::frequency::FREQUENCY_A as Frequency;
|
||||
|
||||
use crate::chip::FORCE_COPY_BUFFER_SIZE;
|
||||
use crate::gpio::sealed::Pin as _;
|
||||
use crate::gpio::{self, AnyPin};
|
||||
use crate::gpio::{Pin as GpioPin, PselBits};
|
||||
use crate::interrupt::Interrupt;
|
||||
use crate::util::{slice_ptr_parts, slice_ptr_parts_mut};
|
||||
use crate::{pac, util::slice_in_ram_or};
|
||||
|
||||
pub use embedded_hal_02::spi::{Mode, Phase, Polarity, MODE_0, MODE_1, MODE_2, MODE_3};
|
||||
pub use pac::spim0::frequency::FREQUENCY_A as Frequency;
|
||||
use crate::gpio::{self, AnyPin, Pin as GpioPin, PselBits};
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::util::{slice_in_ram_or, slice_ptr_parts, slice_ptr_parts_mut};
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
@ -183,9 +180,7 @@ impl<'d, T: Instance> Spim<'d, T> {
|
||||
irq.unpend();
|
||||
irq.enable();
|
||||
|
||||
Self {
|
||||
phantom: PhantomData,
|
||||
}
|
||||
Self { phantom: PhantomData }
|
||||
}
|
||||
|
||||
fn on_interrupt(_: *mut ()) {
|
||||
@ -295,11 +290,7 @@ impl<'d, T: Instance> Spim<'d, T> {
|
||||
}
|
||||
|
||||
/// Same as [`blocking_transfer`](Spim::blocking_transfer) but will fail instead of copying data into RAM. Consult the module level documentation to learn more.
|
||||
pub fn blocking_transfer_from_ram(
|
||||
&mut self,
|
||||
read: &mut [u8],
|
||||
write: &[u8],
|
||||
) -> Result<(), Error> {
|
||||
pub fn blocking_transfer_from_ram(&mut self, read: &mut [u8], write: &[u8]) -> Result<(), Error> {
|
||||
self.blocking_inner(read, write)
|
||||
}
|
||||
|
||||
|
@ -1,18 +1,18 @@
|
||||
//! Temperature sensor interface.
|
||||
|
||||
use crate::interrupt;
|
||||
use crate::pac;
|
||||
use crate::peripherals::TEMP;
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::task::Poll;
|
||||
|
||||
use embassy::waitqueue::AtomicWaker;
|
||||
use embassy_hal_common::{drop::OnDrop, unborrow};
|
||||
use embassy_hal_common::drop::OnDrop;
|
||||
use embassy_hal_common::unborrow;
|
||||
use fixed::types::I30F2;
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::peripherals::TEMP;
|
||||
use crate::{interrupt, pac, Unborrow};
|
||||
|
||||
/// Integrated temperature sensor.
|
||||
pub struct Temp<'d> {
|
||||
_temp: PhantomData<&'d TEMP>,
|
||||
@ -22,10 +22,7 @@ pub struct Temp<'d> {
|
||||
static WAKER: AtomicWaker = AtomicWaker::new();
|
||||
|
||||
impl<'d> Temp<'d> {
|
||||
pub fn new(
|
||||
_t: impl Unborrow<Target = TEMP> + 'd,
|
||||
irq: impl Unborrow<Target = interrupt::TEMP> + 'd,
|
||||
) -> Self {
|
||||
pub fn new(_t: impl Unborrow<Target = TEMP> + 'd, irq: impl Unborrow<Target = interrupt::TEMP> + 'd) -> Self {
|
||||
unborrow!(_t, irq);
|
||||
|
||||
// Enable interrupt that signals temperature values
|
||||
|
@ -1,14 +1,14 @@
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use core::cell::Cell;
|
||||
use core::sync::atomic::{compiler_fence, AtomicU32, AtomicU8, Ordering};
|
||||
use core::{mem, ptr};
|
||||
|
||||
use critical_section::CriticalSection;
|
||||
use embassy::blocking_mutex::raw::CriticalSectionRawMutex;
|
||||
use embassy::blocking_mutex::CriticalSectionMutex as Mutex;
|
||||
use embassy::time::driver::{AlarmHandle, Driver};
|
||||
|
||||
use crate::interrupt;
|
||||
use crate::pac;
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::{interrupt, pac};
|
||||
|
||||
fn rtc() -> &'static pac::rtc0::RegisterBlock {
|
||||
unsafe { &*pac::RTC1::ptr() }
|
||||
@ -220,15 +220,13 @@ impl Driver for RtcDriver {
|
||||
}
|
||||
|
||||
unsafe fn allocate_alarm(&self) -> Option<AlarmHandle> {
|
||||
let id = self
|
||||
.alarm_count
|
||||
.fetch_update(Ordering::AcqRel, Ordering::Acquire, |x| {
|
||||
if x < ALARM_COUNT as u8 {
|
||||
Some(x + 1)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
let id = self.alarm_count.fetch_update(Ordering::AcqRel, Ordering::Acquire, |x| {
|
||||
if x < ALARM_COUNT as u8 {
|
||||
Some(x + 1)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
});
|
||||
|
||||
match id {
|
||||
Ok(id) => Some(AlarmHandle::new(id)),
|
||||
|
@ -3,16 +3,14 @@
|
||||
use core::marker::PhantomData;
|
||||
use core::task::Poll;
|
||||
|
||||
use crate::interrupt::Interrupt;
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use embassy::waitqueue::AtomicWaker;
|
||||
use embassy_hal_common::drop::OnDrop;
|
||||
use embassy_hal_common::unborrow;
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::pac;
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::ppi::{Event, Task};
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
pub(crate) mod sealed {
|
||||
|
||||
@ -131,9 +129,7 @@ impl<'d, T: Instance, I: TimerType> Timer<'d, T, I> {
|
||||
fn new_irqless(_timer: impl Unborrow<Target = T> + 'd) -> Self {
|
||||
let regs = T::regs();
|
||||
|
||||
let mut this = Self {
|
||||
phantom: PhantomData,
|
||||
};
|
||||
let mut this = Self { phantom: PhantomData };
|
||||
|
||||
// Stop the timer before doing anything else,
|
||||
// since changing BITMODE while running can cause 'unpredictable behaviour' according to the specification.
|
||||
@ -233,11 +229,7 @@ impl<'d, T: Instance, I: TimerType> Timer<'d, T, I> {
|
||||
/// Panics if `n` >= the number of CC registers this timer has (4 for a normal timer, 6 for an extended timer).
|
||||
pub fn cc(&mut self, n: usize) -> Cc<T, I> {
|
||||
if n >= T::CCS {
|
||||
panic!(
|
||||
"Cannot get CC register {} of timer with {} CC registers.",
|
||||
n,
|
||||
T::CCS
|
||||
);
|
||||
panic!("Cannot get CC register {} of timer with {} CC registers.", n, T::CCS);
|
||||
}
|
||||
Cc {
|
||||
n,
|
||||
|
@ -6,12 +6,12 @@
|
||||
//!
|
||||
//! - nRF52832: Section 33
|
||||
//! - nRF52840: Section 6.31
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::Unborrow;
|
||||
use core::future::Future;
|
||||
use core::marker::PhantomData;
|
||||
use core::sync::atomic::{compiler_fence, Ordering::SeqCst};
|
||||
use core::sync::atomic::compiler_fence;
|
||||
use core::sync::atomic::Ordering::SeqCst;
|
||||
use core::task::Poll;
|
||||
|
||||
#[cfg(feature = "time")]
|
||||
use embassy::time::{Duration, Instant};
|
||||
use embassy::waitqueue::AtomicWaker;
|
||||
@ -19,10 +19,10 @@ use embassy_hal_common::unborrow;
|
||||
use futures::future::poll_fn;
|
||||
|
||||
use crate::chip::{EASY_DMA_SIZE, FORCE_COPY_BUFFER_SIZE};
|
||||
use crate::gpio;
|
||||
use crate::gpio::Pin as GpioPin;
|
||||
use crate::pac;
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::util::{slice_in_ram, slice_in_ram_or};
|
||||
use crate::{gpio, pac, Unborrow};
|
||||
|
||||
pub enum Frequency {
|
||||
#[doc = "26738688: 100 kbps"]
|
||||
@ -134,9 +134,7 @@ impl<'d, T: Instance> Twim<'d, T> {
|
||||
irq.unpend();
|
||||
irq.enable();
|
||||
|
||||
Self {
|
||||
phantom: PhantomData,
|
||||
}
|
||||
Self { phantom: PhantomData }
|
||||
}
|
||||
|
||||
fn on_interrupt(_: *mut ()) {
|
||||
@ -319,12 +317,7 @@ impl<'d, T: Instance> Twim<'d, T> {
|
||||
})
|
||||
}
|
||||
|
||||
fn setup_write_from_ram(
|
||||
&mut self,
|
||||
address: u8,
|
||||
buffer: &[u8],
|
||||
inten: bool,
|
||||
) -> Result<(), Error> {
|
||||
fn setup_write_from_ram(&mut self, address: u8, buffer: &[u8], inten: bool) -> Result<(), Error> {
|
||||
let r = T::regs();
|
||||
|
||||
compiler_fence(SeqCst);
|
||||
@ -506,12 +499,7 @@ impl<'d, T: Instance> Twim<'d, T> {
|
||||
///
|
||||
/// The buffers must have a length of at most 255 bytes on the nRF52832
|
||||
/// and at most 65535 bytes on the nRF52840.
|
||||
pub fn blocking_write_read(
|
||||
&mut self,
|
||||
address: u8,
|
||||
wr_buffer: &[u8],
|
||||
rd_buffer: &mut [u8],
|
||||
) -> Result<(), Error> {
|
||||
pub fn blocking_write_read(&mut self, address: u8, wr_buffer: &[u8], rd_buffer: &mut [u8]) -> Result<(), Error> {
|
||||
self.setup_write_read(address, wr_buffer, rd_buffer, false)?;
|
||||
self.blocking_wait();
|
||||
compiler_fence(SeqCst);
|
||||
@ -543,12 +531,7 @@ impl<'d, T: Instance> Twim<'d, T> {
|
||||
///
|
||||
/// See [`blocking_write`].
|
||||
#[cfg(feature = "time")]
|
||||
pub fn blocking_write_timeout(
|
||||
&mut self,
|
||||
address: u8,
|
||||
buffer: &[u8],
|
||||
timeout: Duration,
|
||||
) -> Result<(), Error> {
|
||||
pub fn blocking_write_timeout(&mut self, address: u8, buffer: &[u8], timeout: Duration) -> Result<(), Error> {
|
||||
self.setup_write(address, buffer, false)?;
|
||||
self.blocking_wait_timeout(timeout)?;
|
||||
compiler_fence(SeqCst);
|
||||
@ -578,12 +561,7 @@ impl<'d, T: Instance> Twim<'d, T> {
|
||||
/// The buffer must have a length of at most 255 bytes on the nRF52832
|
||||
/// and at most 65535 bytes on the nRF52840.
|
||||
#[cfg(feature = "time")]
|
||||
pub fn blocking_read_timeout(
|
||||
&mut self,
|
||||
address: u8,
|
||||
buffer: &mut [u8],
|
||||
timeout: Duration,
|
||||
) -> Result<(), Error> {
|
||||
pub fn blocking_read_timeout(&mut self, address: u8, buffer: &mut [u8], timeout: Duration) -> Result<(), Error> {
|
||||
self.setup_read(address, buffer, false)?;
|
||||
self.blocking_wait_timeout(timeout)?;
|
||||
compiler_fence(SeqCst);
|
||||
@ -662,12 +640,7 @@ impl<'d, T: Instance> Twim<'d, T> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn write_read(
|
||||
&mut self,
|
||||
address: u8,
|
||||
wr_buffer: &[u8],
|
||||
rd_buffer: &mut [u8],
|
||||
) -> Result<(), Error> {
|
||||
pub async fn write_read(&mut self, address: u8, wr_buffer: &[u8], rd_buffer: &mut [u8]) -> Result<(), Error> {
|
||||
self.setup_write_read(address, wr_buffer, rd_buffer, true)?;
|
||||
self.async_wait().await;
|
||||
compiler_fence(SeqCst);
|
||||
@ -786,12 +759,7 @@ mod eh02 {
|
||||
impl<'a, T: Instance> embedded_hal_02::blocking::i2c::WriteRead for Twim<'a, T> {
|
||||
type Error = Error;
|
||||
|
||||
fn write_read<'w>(
|
||||
&mut self,
|
||||
addr: u8,
|
||||
bytes: &'w [u8],
|
||||
buffer: &'w mut [u8],
|
||||
) -> Result<(), Error> {
|
||||
fn write_read<'w>(&mut self, addr: u8, bytes: &'w [u8], buffer: &'w mut [u8]) -> Result<(), Error> {
|
||||
self.blocking_write_read(addr, bytes, buffer)
|
||||
}
|
||||
}
|
||||
@ -809,12 +777,12 @@ mod eh1 {
|
||||
Self::Transmit => embedded_hal_1::i2c::ErrorKind::Other,
|
||||
Self::Receive => embedded_hal_1::i2c::ErrorKind::Other,
|
||||
Self::DMABufferNotInDataMemory => embedded_hal_1::i2c::ErrorKind::Other,
|
||||
Self::AddressNack => embedded_hal_1::i2c::ErrorKind::NoAcknowledge(
|
||||
embedded_hal_1::i2c::NoAcknowledgeSource::Address,
|
||||
),
|
||||
Self::DataNack => embedded_hal_1::i2c::ErrorKind::NoAcknowledge(
|
||||
embedded_hal_1::i2c::NoAcknowledgeSource::Data,
|
||||
),
|
||||
Self::AddressNack => {
|
||||
embedded_hal_1::i2c::ErrorKind::NoAcknowledge(embedded_hal_1::i2c::NoAcknowledgeSource::Address)
|
||||
}
|
||||
Self::DataNack => {
|
||||
embedded_hal_1::i2c::ErrorKind::NoAcknowledge(embedded_hal_1::i2c::NoAcknowledgeSource::Data)
|
||||
}
|
||||
Self::Overrun => embedded_hal_1::i2c::ErrorKind::Overrun,
|
||||
Self::Timeout => embedded_hal_1::i2c::ErrorKind::Other,
|
||||
}
|
||||
@ -841,24 +809,14 @@ mod eh1 {
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn write_iter_read<B>(
|
||||
&mut self,
|
||||
_address: u8,
|
||||
_bytes: B,
|
||||
_buffer: &mut [u8],
|
||||
) -> Result<(), Self::Error>
|
||||
fn write_iter_read<B>(&mut self, _address: u8, _bytes: B, _buffer: &mut [u8]) -> Result<(), Self::Error>
|
||||
where
|
||||
B: IntoIterator<Item = u8>,
|
||||
{
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn write_read(
|
||||
&mut self,
|
||||
address: u8,
|
||||
wr_buffer: &[u8],
|
||||
rd_buffer: &mut [u8],
|
||||
) -> Result<(), Self::Error> {
|
||||
fn write_read(&mut self, address: u8, wr_buffer: &[u8], rd_buffer: &mut [u8]) -> Result<(), Self::Error> {
|
||||
self.blocking_write_read(address, wr_buffer, rd_buffer)
|
||||
}
|
||||
|
||||
@ -870,11 +828,7 @@ mod eh1 {
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn transaction_iter<'a, O>(
|
||||
&mut self,
|
||||
_address: u8,
|
||||
_operations: O,
|
||||
) -> Result<(), Self::Error>
|
||||
fn transaction_iter<'a, O>(&mut self, _address: u8, _operations: O) -> Result<(), Self::Error>
|
||||
where
|
||||
O: IntoIterator<Item = embedded_hal_1::i2c::blocking::Operation<'a>>,
|
||||
{
|
||||
|
@ -13,27 +13,24 @@
|
||||
//! memory may be used given that buffers are passed in directly to its read and write
|
||||
//! methods.
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::sync::atomic::{compiler_fence, Ordering};
|
||||
use core::task::Poll;
|
||||
|
||||
use embassy_hal_common::drop::OnDrop;
|
||||
use embassy_hal_common::unborrow;
|
||||
use futures::future::poll_fn;
|
||||
// Re-export SVD variants to allow user to directly set values.
|
||||
pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity};
|
||||
|
||||
use crate::chip::{EASY_DMA_SIZE, FORCE_COPY_BUFFER_SIZE};
|
||||
use crate::gpio::sealed::Pin as _;
|
||||
use crate::gpio::{self, AnyPin, Pin as GpioPin, PselBits};
|
||||
use crate::interrupt::Interrupt;
|
||||
use crate::pac;
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task};
|
||||
use crate::timer::Instance as TimerInstance;
|
||||
use crate::timer::{Frequency, Timer};
|
||||
use crate::timer::{Frequency, Instance as TimerInstance, Timer};
|
||||
use crate::util::slice_in_ram_or;
|
||||
|
||||
// Re-export SVD variants to allow user to directly set values.
|
||||
pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity};
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
#[non_exhaustive]
|
||||
pub struct Config {
|
||||
@ -182,12 +179,8 @@ impl<'d, T: Instance> Uarte<'d, T> {
|
||||
|
||||
Self {
|
||||
phantom: PhantomData,
|
||||
tx: UarteTx {
|
||||
phantom: PhantomData,
|
||||
},
|
||||
rx: UarteRx {
|
||||
phantom: PhantomData,
|
||||
},
|
||||
tx: UarteTx { phantom: PhantomData },
|
||||
rx: UarteRx { phantom: PhantomData },
|
||||
}
|
||||
}
|
||||
|
||||
@ -893,9 +886,7 @@ mod eh02 {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'d, U: Instance, T: TimerInstance> embedded_hal_02::blocking::serial::Write<u8>
|
||||
for UarteWithIdle<'d, U, T>
|
||||
{
|
||||
impl<'d, U: Instance, T: TimerInstance> embedded_hal_02::blocking::serial::Write<u8> for UarteWithIdle<'d, U, T> {
|
||||
type Error = Error;
|
||||
|
||||
fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
|
||||
@ -956,9 +947,7 @@ mod eh1 {
|
||||
type Error = Error;
|
||||
}
|
||||
|
||||
impl<'d, U: Instance, T: TimerInstance> embedded_hal_1::serial::ErrorType
|
||||
for UarteWithIdle<'d, U, T>
|
||||
{
|
||||
impl<'d, U: Instance, T: TimerInstance> embedded_hal_1::serial::ErrorType for UarteWithIdle<'d, U, T> {
|
||||
type Error = Error;
|
||||
}
|
||||
}
|
||||
|
@ -1,25 +1,23 @@
|
||||
#![macro_use]
|
||||
|
||||
use crate::interrupt::InterruptExt;
|
||||
use crate::Unborrow;
|
||||
use core::marker::PhantomData;
|
||||
use core::mem::MaybeUninit;
|
||||
use core::sync::atomic::{compiler_fence, AtomicU32, Ordering};
|
||||
use core::task::Poll;
|
||||
|
||||
use cortex_m::peripheral::NVIC;
|
||||
use embassy::waitqueue::AtomicWaker;
|
||||
use embassy_hal_common::unborrow;
|
||||
pub use embassy_usb;
|
||||
use embassy_usb::driver::{self, EndpointError, Event, Unsupported};
|
||||
use embassy_usb::types::{EndpointAddress, EndpointInfo, EndpointType, UsbDirection};
|
||||
use futures::future::poll_fn;
|
||||
use futures::Future;
|
||||
|
||||
pub use embassy_usb;
|
||||
use pac::usbd::RegisterBlock;
|
||||
|
||||
use crate::interrupt::Interrupt;
|
||||
use crate::pac;
|
||||
use crate::interrupt::{Interrupt, InterruptExt};
|
||||
use crate::util::slice_in_ram;
|
||||
use crate::{pac, Unborrow};
|
||||
|
||||
const NEW_AW: AtomicWaker = AtomicWaker::new();
|
||||
static BUS_WAKER: AtomicWaker = NEW_AW;
|
||||
@ -35,10 +33,7 @@ pub struct Driver<'d, T: Instance> {
|
||||
}
|
||||
|
||||
impl<'d, T: Instance> Driver<'d, T> {
|
||||
pub fn new(
|
||||
_usb: impl Unborrow<Target = T> + 'd,
|
||||
irq: impl Unborrow<Target = T::Interrupt> + 'd,
|
||||
) -> Self {
|
||||
pub fn new(_usb: impl Unborrow<Target = T> + 'd, irq: impl Unborrow<Target = T::Interrupt> + 'd) -> Self {
|
||||
unborrow!(irq);
|
||||
irq.set_handler(Self::on_interrupt);
|
||||
irq.unpend();
|
||||
@ -143,9 +138,7 @@ impl<'d, T: Instance> driver::Driver<'d> for Driver<'d, T> {
|
||||
|
||||
fn start(self, control_max_packet_size: u16) -> (Self::Bus, Self::ControlPipe) {
|
||||
(
|
||||
Bus {
|
||||
phantom: PhantomData,
|
||||
},
|
||||
Bus { phantom: PhantomData },
|
||||
ControlPipe {
|
||||
_phantom: PhantomData,
|
||||
max_packet_size: control_max_packet_size,
|
||||
@ -266,8 +259,7 @@ impl<'d, T: Instance> driver::Bus for Bus<'d, T> {
|
||||
let regs = T::regs();
|
||||
unsafe {
|
||||
if ep_addr.index() == 0 {
|
||||
regs.tasks_ep0stall
|
||||
.write(|w| w.tasks_ep0stall().bit(stalled));
|
||||
regs.tasks_ep0stall.write(|w| w.tasks_ep0stall().bit(stalled));
|
||||
} else {
|
||||
regs.epstall.write(|w| {
|
||||
w.ep().bits(ep_addr.index() as u8 & 0b111);
|
||||
@ -370,8 +362,7 @@ impl<'d, T: Instance> driver::Bus for Bus<'d, T> {
|
||||
regs.eventcause.write(|w| w.usbwuallowed().set_bit());
|
||||
|
||||
regs.dpdmvalue.write(|w| w.state().resume());
|
||||
regs.tasks_dpdmdrive
|
||||
.write(|w| w.tasks_dpdmdrive().set_bit());
|
||||
regs.tasks_dpdmdrive.write(|w| w.tasks_dpdmdrive().set_bit());
|
||||
|
||||
Poll::Ready(())
|
||||
} else {
|
||||
@ -520,11 +511,7 @@ unsafe fn read_dma<T: Instance>(i: usize, buf: &mut [u8]) -> Result<usize, Endpo
|
||||
dma_start();
|
||||
regs.events_endepout[i].reset();
|
||||
regs.tasks_startepout[i].write(|w| w.tasks_startepout().set_bit());
|
||||
while regs.events_endepout[i]
|
||||
.read()
|
||||
.events_endepout()
|
||||
.bit_is_clear()
|
||||
{}
|
||||
while regs.events_endepout[i].read().events_endepout().bit_is_clear() {}
|
||||
regs.events_endepout[i].reset();
|
||||
dma_end();
|
||||
|
||||
@ -579,9 +566,7 @@ impl<'d, T: Instance> driver::EndpointOut for Endpoint<'d, T, Out> {
|
||||
let i = self.info.addr.index();
|
||||
assert!(i != 0);
|
||||
|
||||
self.wait_data_ready()
|
||||
.await
|
||||
.map_err(|_| EndpointError::Disabled)?;
|
||||
self.wait_data_ready().await.map_err(|_| EndpointError::Disabled)?;
|
||||
|
||||
unsafe { read_dma::<T>(i, buf) }
|
||||
}
|
||||
@ -596,9 +581,7 @@ impl<'d, T: Instance> driver::EndpointIn for Endpoint<'d, T, In> {
|
||||
let i = self.info.addr.index();
|
||||
assert!(i != 0);
|
||||
|
||||
self.wait_data_ready()
|
||||
.await
|
||||
.map_err(|_| EndpointError::Disabled)?;
|
||||
self.wait_data_ready().await.map_err(|_| EndpointError::Disabled)?;
|
||||
|
||||
unsafe { write_dma::<T>(i, buf) }
|
||||
|
||||
@ -659,20 +642,14 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> {
|
||||
}
|
||||
}
|
||||
|
||||
fn data_out<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a mut [u8],
|
||||
_first: bool,
|
||||
_last: bool,
|
||||
) -> Self::DataOutFuture<'a> {
|
||||
fn data_out<'a>(&'a mut self, buf: &'a mut [u8], _first: bool, _last: bool) -> Self::DataOutFuture<'a> {
|
||||
async move {
|
||||
let regs = T::regs();
|
||||
|
||||
regs.events_ep0datadone.reset();
|
||||
|
||||
// This starts a RX on EP0. events_ep0datadone notifies when done.
|
||||
regs.tasks_ep0rcvout
|
||||
.write(|w| w.tasks_ep0rcvout().set_bit());
|
||||
regs.tasks_ep0rcvout.write(|w| w.tasks_ep0rcvout().set_bit());
|
||||
|
||||
// Wait until ready
|
||||
regs.intenset.write(|w| {
|
||||
@ -701,12 +678,7 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> {
|
||||
}
|
||||
}
|
||||
|
||||
fn data_in<'a>(
|
||||
&'a mut self,
|
||||
buf: &'a [u8],
|
||||
_first: bool,
|
||||
last: bool,
|
||||
) -> Self::DataInFuture<'a> {
|
||||
fn data_in<'a>(&'a mut self, buf: &'a [u8], _first: bool, last: bool) -> Self::DataInFuture<'a> {
|
||||
async move {
|
||||
let regs = T::regs();
|
||||
regs.events_ep0datadone.reset();
|
||||
@ -745,8 +717,7 @@ impl<'d, T: Instance> driver::ControlPipe for ControlPipe<'d, T> {
|
||||
fn accept<'a>(&'a mut self) -> Self::AcceptFuture<'a> {
|
||||
async move {
|
||||
let regs = T::regs();
|
||||
regs.tasks_ep0status
|
||||
.write(|w| w.tasks_ep0status().bit(true));
|
||||
regs.tasks_ep0status.write(|w| w.tasks_ep0status().bit(true));
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user