Rename Unborrowed -> PeripheralRef, Unborrow -> Peripheral
This commit is contained in:
		| @@ -3,7 +3,7 @@ use core::{mem, ptr}; | |||||||
|  |  | ||||||
| use atomic_polyfill::{compiler_fence, AtomicPtr, Ordering}; | use atomic_polyfill::{compiler_fence, AtomicPtr, Ordering}; | ||||||
| use cortex_m::peripheral::NVIC; | use cortex_m::peripheral::NVIC; | ||||||
| use embassy_hal_common::Unborrow; | use embassy_hal_common::Peripheral; | ||||||
| pub use embassy_macros::cortex_m_interrupt_take as take; | pub use embassy_macros::cortex_m_interrupt_take as take; | ||||||
|  |  | ||||||
| /// Implementation detail, do not use outside embassy crates. | /// Implementation detail, do not use outside embassy crates. | ||||||
| @@ -32,7 +32,7 @@ unsafe impl cortex_m::interrupt::InterruptNumber for NrWrap { | |||||||
|  |  | ||||||
| /// Represents an interrupt type that can be configured by embassy to handle | /// Represents an interrupt type that can be configured by embassy to handle | ||||||
| /// interrupts. | /// interrupts. | ||||||
| pub unsafe trait Interrupt: Unborrow<Target = Self> { | pub unsafe trait Interrupt: Peripheral<P = Self> { | ||||||
|     /// Return the NVIC interrupt number for this interrupt. |     /// Return the NVIC interrupt number for this interrupt. | ||||||
|     fn number(&self) -> u16; |     fn number(&self) -> u16; | ||||||
|     /// Steal an instance of this interrupt |     /// Steal an instance of this interrupt | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ use core::mem::MaybeUninit; | |||||||
|  |  | ||||||
| use cortex_m::peripheral::scb::VectActive; | use cortex_m::peripheral::scb::VectActive; | ||||||
| use cortex_m::peripheral::{NVIC, SCB}; | use cortex_m::peripheral::{NVIC, SCB}; | ||||||
| use embassy_hal_common::{unborrow, Unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::interrupt::{Interrupt, InterruptExt, Priority}; | use crate::interrupt::{Interrupt, InterruptExt, Priority}; | ||||||
|  |  | ||||||
| @@ -33,7 +33,7 @@ impl<S> StateStorage<S> { | |||||||
| /// a safe way. | /// a safe way. | ||||||
| pub struct PeripheralMutex<'a, S: PeripheralState> { | pub struct PeripheralMutex<'a, S: PeripheralState> { | ||||||
|     state: *mut S, |     state: *mut S, | ||||||
|     irq: Unborrowed<'a, S::Interrupt>, |     irq: PeripheralRef<'a, S::Interrupt>, | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Whether `irq` can be preempted by the current interrupt. | /// Whether `irq` can be preempted by the current interrupt. | ||||||
| @@ -62,11 +62,11 @@ impl<'a, S: PeripheralState> PeripheralMutex<'a, S> { | |||||||
|     /// |     /// | ||||||
|     /// Registers `on_interrupt` as the `irq`'s handler, and enables it. |     /// Registers `on_interrupt` as the `irq`'s handler, and enables it. | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         irq: impl Unborrow<Target = S::Interrupt> + 'a, |         irq: impl Peripheral<P = S::Interrupt> + 'a, | ||||||
|         storage: &'a mut StateStorage<S>, |         storage: &'a mut StateStorage<S>, | ||||||
|         init: impl FnOnce() -> S, |         init: impl FnOnce() -> S, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         if can_be_preempted(&*irq) { |         if can_be_preempted(&*irq) { | ||||||
|             panic!( |             panic!( | ||||||
|   | |||||||
| @@ -6,10 +6,10 @@ pub(crate) mod fmt; | |||||||
|  |  | ||||||
| pub mod drop; | pub mod drop; | ||||||
| mod macros; | mod macros; | ||||||
|  | mod peripheral; | ||||||
| pub mod ratio; | pub mod ratio; | ||||||
| pub mod ring_buffer; | pub mod ring_buffer; | ||||||
| mod unborrow; | pub use peripheral::{Peripheral, PeripheralRef}; | ||||||
| pub use unborrow::{Unborrow, Unborrowed}; |  | ||||||
|  |  | ||||||
| /// Low power blocking wait loop using WFE/SEV. | /// Low power blocking wait loop using WFE/SEV. | ||||||
| pub fn low_power_wait_until(mut condition: impl FnMut() -> bool) { | pub fn low_power_wait_until(mut condition: impl FnMut() -> bool) { | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ macro_rules! peripherals { | |||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 $(#[$cfg])? |                 $(#[$cfg])? | ||||||
|                 $crate::impl_unborrow!($name); |                 $crate::impl_peripheral!($name); | ||||||
|             )* |             )* | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -71,22 +71,22 @@ macro_rules! peripherals { | |||||||
| } | } | ||||||
|  |  | ||||||
| #[macro_export] | #[macro_export] | ||||||
| macro_rules! unborrow { | macro_rules! into_ref { | ||||||
|     ($($name:ident),*) => { |     ($($name:ident),*) => { | ||||||
|         $( |         $( | ||||||
|             let mut $name = $name.unborrow(); |             let mut $name = $name.into_ref(); | ||||||
|         )* |         )* | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| #[macro_export] | #[macro_export] | ||||||
| macro_rules! impl_unborrow { | macro_rules! impl_peripheral { | ||||||
|     ($type:ident) => { |     ($type:ident) => { | ||||||
|         impl $crate::Unborrow for $type { |         impl $crate::Peripheral for $type { | ||||||
|             type Target = $type; |             type P = $type; | ||||||
|  |  | ||||||
|             #[inline] |             #[inline] | ||||||
|             unsafe fn unborrow_unchecked(&mut self) -> Self::Target { |             unsafe fn clone_unchecked(&mut self) -> Self::P { | ||||||
|                 $type { ..*self } |                 $type { ..*self } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
							
								
								
									
										141
									
								
								embassy-hal-common/src/peripheral.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								embassy-hal-common/src/peripheral.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | |||||||
|  | use core::marker::PhantomData; | ||||||
|  | use core::ops::{Deref, DerefMut}; | ||||||
|  |  | ||||||
|  | /// An exclusive reference to a peripheral. | ||||||
|  | /// | ||||||
|  | /// This is functionally the same as a `&'a mut T`. The reason for having a | ||||||
|  | /// dedicated struct is memory efficiency: | ||||||
|  | /// | ||||||
|  | /// Peripheral singletons are typically either zero-sized (for concrete peripehrals | ||||||
|  | /// like `PA9` or `Spi4`) or very small (for example `AnyPin` which is 1 byte). | ||||||
|  | /// However `&mut T` is always 4 bytes for 32-bit targets, even if T is zero-sized. | ||||||
|  | /// PeripheralRef stores a copy of `T` instead, so it's the same size. | ||||||
|  | /// | ||||||
|  | /// but it is the size of `T` not the size | ||||||
|  | /// of a pointer. This is useful if T is a zero sized type. | ||||||
|  | pub struct PeripheralRef<'a, T> { | ||||||
|  |     inner: T, | ||||||
|  |     _lifetime: PhantomData<&'a mut T>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<'a, T> PeripheralRef<'a, T> { | ||||||
|  |     #[inline] | ||||||
|  |     pub fn new(inner: T) -> Self { | ||||||
|  |         Self { | ||||||
|  |             inner, | ||||||
|  |             _lifetime: PhantomData, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     #[inline] | ||||||
|  |     pub fn map_into<U>(self) -> PeripheralRef<'a, U> | ||||||
|  |     where | ||||||
|  |         T: Into<U>, | ||||||
|  |     { | ||||||
|  |         PeripheralRef { | ||||||
|  |             inner: self.inner.into(), | ||||||
|  |             _lifetime: PhantomData, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     pub unsafe fn into_inner(self) -> T { | ||||||
|  |         self.inner | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<'a, T> Deref for PeripheralRef<'a, T> { | ||||||
|  |     type Target = T; | ||||||
|  |  | ||||||
|  |     #[inline] | ||||||
|  |     fn deref(&self) -> &Self::Target { | ||||||
|  |         &self.inner | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<'a, T> DerefMut for PeripheralRef<'a, T> { | ||||||
|  |     #[inline] | ||||||
|  |     fn deref_mut(&mut self) -> &mut Self::Target { | ||||||
|  |         &mut self.inner | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// Trait for any type that can be used as a peripheral of type `P`. | ||||||
|  | /// | ||||||
|  | /// This is used in driver constructors, to allow passing either owned peripherals (e.g. `TWISPI0`), | ||||||
|  | /// or borrowed peripherals (e.g. `&mut TWISPI0`). | ||||||
|  | /// | ||||||
|  | /// For example, if you have a driver with a constructor like this: | ||||||
|  | /// | ||||||
|  | /// ```ignore | ||||||
|  | /// impl<'d, T: Instance> Twim<'d, T> { | ||||||
|  | ///     pub fn new( | ||||||
|  | ///         twim: impl Peripheral<P = T> + 'd, | ||||||
|  | ///         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|  | ///         sda: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|  | ///         scl: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|  | ///         config: Config, | ||||||
|  | ///     ) -> Self { .. } | ||||||
|  | /// } | ||||||
|  | /// ``` | ||||||
|  | /// | ||||||
|  | /// You may call it with owned peripherals, which yields an instance that can live forever (`'static`): | ||||||
|  | /// | ||||||
|  | /// ```ignore | ||||||
|  | /// let mut twi: Twim<'static, ...> = Twim::new(p.TWISPI0, irq, p.P0_03, p.P0_04, config); | ||||||
|  | /// ``` | ||||||
|  | /// | ||||||
|  | /// Or you may call it with borrowed peripherals, which yields an instance that can only live for as long | ||||||
|  | /// as the borrows last: | ||||||
|  | /// | ||||||
|  | /// ```ignore | ||||||
|  | /// let mut twi: Twim<'_, ...> = Twim::new(&mut p.TWISPI0, &mut irq, &mut p.P0_03, &mut p.P0_04, config); | ||||||
|  | /// ``` | ||||||
|  | /// | ||||||
|  | /// # Implementation details, for HAL authors | ||||||
|  | /// | ||||||
|  | /// When writing a HAL, the intended way to use this trait is to take `impl Peripheral<P = ..>` in | ||||||
|  | /// the HAL's public API (such as driver constructors), calling `.into_ref()` to obtain a `PeripheralRef`, | ||||||
|  | /// and storing that in the driver struct. | ||||||
|  | /// | ||||||
|  | /// `.into_ref()` on an owned `T` yields a `PeripheralRef<'static, T>`. | ||||||
|  | /// `.into_ref()` on an `&'a mut T` yields a `PeripheralRef<'a, T>`. | ||||||
|  | pub trait Peripheral: Sized { | ||||||
|  |     /// Peripheral singleton type | ||||||
|  |     type P; | ||||||
|  |  | ||||||
|  |     /// Unsafely clone (duplicate) a peripheral singleton. | ||||||
|  |     /// | ||||||
|  |     /// # Safety | ||||||
|  |     /// | ||||||
|  |     /// This returns an owned clone of the peripheral. You must manually ensure | ||||||
|  |     /// only one copy of the peripheral is in use at a time. For example, don't | ||||||
|  |     /// create two SPI drivers on `SPI1`, because they will "fight" each other. | ||||||
|  |     /// | ||||||
|  |     /// You should strongly prefer using `into_ref()` instead. It returns a | ||||||
|  |     /// `PeripheralRef`, which allows the borrow checker to enforce this at compile time. | ||||||
|  |     unsafe fn clone_unchecked(&mut self) -> Self::P; | ||||||
|  |  | ||||||
|  |     /// Convert a value into a `PeripheralRef`. | ||||||
|  |     /// | ||||||
|  |     /// When called on an owned `T`, yields a `PeripheralRef<'static, T>`. | ||||||
|  |     /// When called on an `&'a mut T`, yields a `PeripheralRef<'a, T>`. | ||||||
|  |     #[inline] | ||||||
|  |     fn into_ref<'a>(mut self) -> PeripheralRef<'a, Self::P> | ||||||
|  |     where | ||||||
|  |         Self: 'a, | ||||||
|  |     { | ||||||
|  |         PeripheralRef::new(unsafe { self.clone_unchecked() }) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl<'b, T: DerefMut> Peripheral for T | ||||||
|  | where | ||||||
|  |     T::Target: Peripheral, | ||||||
|  | { | ||||||
|  |     type P = <T::Target as Peripheral>::P; | ||||||
|  |  | ||||||
|  |     #[inline] | ||||||
|  |     unsafe fn clone_unchecked(&mut self) -> Self::P { | ||||||
|  |         self.deref_mut().clone_unchecked() | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,82 +0,0 @@ | |||||||
| use core::marker::PhantomData; |  | ||||||
| use core::ops::{Deref, DerefMut}; |  | ||||||
|  |  | ||||||
| /// This is essentially a `&mut T`, but it is the size of `T` not the size |  | ||||||
| /// of a pointer. This is useful if T is a zero sized type. |  | ||||||
| pub struct Unborrowed<'a, T> { |  | ||||||
|     inner: T, |  | ||||||
|     _lifetime: PhantomData<&'a mut T>, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl<'a, T> Unborrowed<'a, T> { |  | ||||||
|     pub fn new(inner: T) -> Self { |  | ||||||
|         Self { |  | ||||||
|             inner, |  | ||||||
|             _lifetime: PhantomData, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     pub fn map_into<U>(self) -> Unborrowed<'a, U> |  | ||||||
|     where |  | ||||||
|         T: Into<U>, |  | ||||||
|     { |  | ||||||
|         Unborrowed { |  | ||||||
|             inner: self.inner.into(), |  | ||||||
|             _lifetime: PhantomData, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     pub unsafe fn into_inner(self) -> T { |  | ||||||
|         self.inner |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl<'a, T> Deref for Unborrowed<'a, T> { |  | ||||||
|     type Target = T; |  | ||||||
|  |  | ||||||
|     fn deref(&self) -> &Self::Target { |  | ||||||
|         &self.inner |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl<'a, T> DerefMut for Unborrowed<'a, T> { |  | ||||||
|     fn deref_mut(&mut self) -> &mut Self::Target { |  | ||||||
|         &mut self.inner |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// Unsafely unborrow an owned singleton out of a `&mut`. |  | ||||||
| /// |  | ||||||
| /// It is intended to be implemented for owned peripheral singletons, such as `USART3` or `AnyPin`. |  | ||||||
| /// Unborrowing an owned `T` yields an `Unborrowed<'static, T>`. |  | ||||||
| /// Unborrowing a `&'a mut T` yields an `Unborrowed<'a, T>`. |  | ||||||
| /// |  | ||||||
| /// This allows writing HAL drivers that either own or borrow their peripherals, but that don't have |  | ||||||
| /// to store pointers in the borrowed case. |  | ||||||
| pub trait Unborrow: Sized { |  | ||||||
|     /// Unborrow result type |  | ||||||
|     type Target; |  | ||||||
|  |  | ||||||
|     unsafe fn unborrow_unchecked(&mut self) -> Self::Target; |  | ||||||
|  |  | ||||||
|     /// Unborrow a value. |  | ||||||
|     #[inline] |  | ||||||
|     fn unborrow<'a>(mut self) -> Unborrowed<'a, Self::Target> |  | ||||||
|     where |  | ||||||
|         Self: 'a, |  | ||||||
|     { |  | ||||||
|         Unborrowed::new(unsafe { self.unborrow_unchecked() }) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl<'b, T: DerefMut> Unborrow for T |  | ||||||
| where |  | ||||||
|     T::Target: Unborrow, |  | ||||||
| { |  | ||||||
|     type Target = <T::Target as Unborrow>::Target; |  | ||||||
|  |  | ||||||
|     #[inline] |  | ||||||
|     unsafe fn unborrow_unchecked(&mut self) -> Self::Target { |  | ||||||
|         self.deref_mut().unborrow_unchecked() |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -3,7 +3,7 @@ use core::future::Future; | |||||||
| use core::mem::MaybeUninit; | use core::mem::MaybeUninit; | ||||||
|  |  | ||||||
| use embassy::channel::signal::Signal; | use embassy::channel::signal::Signal; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use embassy_stm32::dma::NoDma; | use embassy_stm32::dma::NoDma; | ||||||
| use embassy_stm32::gpio::{AnyPin, Output}; | use embassy_stm32::gpio::{AnyPin, Output}; | ||||||
| use embassy_stm32::interrupt::{InterruptExt, SUBGHZ_RADIO}; | use embassy_stm32::interrupt::{InterruptExt, SUBGHZ_RADIO}; | ||||||
| @@ -12,7 +12,7 @@ use embassy_stm32::subghz::{ | |||||||
|     LoRaSyncWord, Ocp, PaConfig, PaSel, PacketType, RampTime, RegMode, RfFreq, SpreadingFactor as SF, StandbyClk, |     LoRaSyncWord, Ocp, PaConfig, PaSel, PacketType, RampTime, RegMode, RfFreq, SpreadingFactor as SF, StandbyClk, | ||||||
|     Status, SubGhz, TcxoMode, TcxoTrim, Timeout, TxParams, |     Status, SubGhz, TcxoMode, TcxoTrim, Timeout, TxParams, | ||||||
| }; | }; | ||||||
| use embassy_stm32::Unborrow; | use embassy_stm32::Peripheral; | ||||||
| use lorawan_device::async_device::radio::{Bandwidth, PhyRxTx, RfConfig, RxQuality, SpreadingFactor, TxConfig}; | use lorawan_device::async_device::radio::{Bandwidth, PhyRxTx, RfConfig, RxQuality, SpreadingFactor, TxConfig}; | ||||||
| use lorawan_device::async_device::Timings; | use lorawan_device::async_device::Timings; | ||||||
|  |  | ||||||
| @@ -46,7 +46,7 @@ impl<'d> SubGhzState<'d> { | |||||||
| /// The radio peripheral keeping the radio state and owning the radio IRQ. | /// The radio peripheral keeping the radio state and owning the radio IRQ. | ||||||
| pub struct SubGhzRadio<'d> { | pub struct SubGhzRadio<'d> { | ||||||
|     state: *mut StateInner<'d>, |     state: *mut StateInner<'d>, | ||||||
|     _irq: Unborrowed<'d, SUBGHZ_RADIO>, |     _irq: PeripheralRef<'d, SUBGHZ_RADIO>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d> SubGhzRadio<'d> { | impl<'d> SubGhzRadio<'d> { | ||||||
| @@ -58,9 +58,9 @@ impl<'d> SubGhzRadio<'d> { | |||||||
|         state: &'d mut SubGhzState<'d>, |         state: &'d mut SubGhzState<'d>, | ||||||
|         radio: SubGhz<'d, NoDma, NoDma>, |         radio: SubGhz<'d, NoDma, NoDma>, | ||||||
|         switch: RadioSwitch<'d>, |         switch: RadioSwitch<'d>, | ||||||
|         irq: impl Unborrow<Target = SUBGHZ_RADIO> + 'd, |         irq: impl Peripheral<P = SUBGHZ_RADIO> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         let mut inner = StateInner { radio, switch }; |         let mut inner = StateInner { radio, switch }; | ||||||
|         inner.radio.reset(); |         inner.radio.reset(); | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ pub fn run(name: syn::Ident) -> Result<TokenStream, TokenStream> { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ::embassy_hal_common::impl_unborrow!(#name_interrupt); |         ::embassy_hal_common::impl_peripheral!(#name_interrupt); | ||||||
|     }; |     }; | ||||||
|     Ok(result) |     Ok(result) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ use core::task::Poll; | |||||||
| use embassy::waitqueue::WakerRegistration; | use embassy::waitqueue::WakerRegistration; | ||||||
| use embassy_cortex_m::peripheral::{PeripheralMutex, PeripheralState, StateStorage}; | use embassy_cortex_m::peripheral::{PeripheralMutex, PeripheralState, StateStorage}; | ||||||
| use embassy_hal_common::ring_buffer::RingBuffer; | use embassy_hal_common::ring_buffer::RingBuffer; | ||||||
| use embassy_hal_common::{low_power_wait_until, unborrow}; | use embassy_hal_common::{into_ref, low_power_wait_until}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
| // Re-export SVD variants to allow user to directly set values | // 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}; | pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity}; | ||||||
| @@ -32,7 +32,7 @@ use crate::interrupt::InterruptExt; | |||||||
| use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task}; | use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task}; | ||||||
| use crate::timer::{Frequency, Instance as TimerInstance, Timer}; | use crate::timer::{Frequency, Instance as TimerInstance, Timer}; | ||||||
| use crate::uarte::{apply_workaround_for_enable_anomaly, Config, Instance as UarteInstance}; | use crate::uarte::{apply_workaround_for_enable_anomaly, Config, Instance as UarteInstance}; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| #[derive(Copy, Clone, Debug, PartialEq)] | #[derive(Copy, Clone, Debug, PartialEq)] | ||||||
| enum RxState { | enum RxState { | ||||||
| @@ -78,20 +78,20 @@ impl<'d, U: UarteInstance, T: TimerInstance> Unpin for BufferedUarte<'d, U, T> { | |||||||
| impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarte<'d, U, T> { | impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarte<'d, U, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         state: &'d mut State<'d, U, T>, |         state: &'d mut State<'d, U, T>, | ||||||
|         _uarte: impl Unborrow<Target = U> + 'd, |         _uarte: impl Peripheral<P = U> + 'd, | ||||||
|         timer: impl Unborrow<Target = T> + 'd, |         timer: impl Peripheral<P = T> + 'd, | ||||||
|         ppi_ch1: impl Unborrow<Target = impl ConfigurableChannel + 'd> + 'd, |         ppi_ch1: impl Peripheral<P = impl ConfigurableChannel + 'd> + 'd, | ||||||
|         ppi_ch2: impl Unborrow<Target = impl ConfigurableChannel + 'd> + 'd, |         ppi_ch2: impl Peripheral<P = impl ConfigurableChannel + 'd> + 'd, | ||||||
|         irq: impl Unborrow<Target = U::Interrupt> + 'd, |         irq: impl Peripheral<P = U::Interrupt> + 'd, | ||||||
|         rxd: impl Unborrow<Target = impl GpioPin> + 'd, |         rxd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         txd: impl Unborrow<Target = impl GpioPin> + 'd, |         txd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         cts: impl Unborrow<Target = impl GpioPin> + 'd, |         cts: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         rts: impl Unborrow<Target = impl GpioPin> + 'd, |         rts: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|         rx_buffer: &'d mut [u8], |         rx_buffer: &'d mut [u8], | ||||||
|         tx_buffer: &'d mut [u8], |         tx_buffer: &'d mut [u8], | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(ppi_ch1, ppi_ch2, irq, rxd, txd, cts, rts); |         into_ref!(ppi_ch1, ppi_ch2, irq, rxd, txd, cts, rts); | ||||||
|  |  | ||||||
|         let r = U::regs(); |         let r = U::regs(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,12 +4,12 @@ use core::convert::Infallible; | |||||||
| use core::hint::unreachable_unchecked; | use core::hint::unreachable_unchecked; | ||||||
|  |  | ||||||
| use cfg_if::cfg_if; | use cfg_if::cfg_if; | ||||||
| use embassy_hal_common::{impl_unborrow, unborrow, Unborrowed}; | use embassy_hal_common::{impl_peripheral, into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use self::sealed::Pin as _; | use self::sealed::Pin as _; | ||||||
| use crate::pac::p0 as gpio; | use crate::pac::p0 as gpio; | ||||||
| use crate::pac::p0::pin_cnf::{DRIVE_A, PULL_A}; | use crate::pac::p0::pin_cnf::{DRIVE_A, PULL_A}; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| /// A GPIO port with up to 32 pins. | /// A GPIO port with up to 32 pins. | ||||||
| #[derive(Debug, Eq, PartialEq)] | #[derive(Debug, Eq, PartialEq)] | ||||||
| @@ -38,7 +38,7 @@ pub struct Input<'d, T: Pin> { | |||||||
|  |  | ||||||
| impl<'d, T: Pin> Input<'d, T> { | impl<'d, T: Pin> Input<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, pull: Pull) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, pull: Pull) -> Self { | ||||||
|         let mut pin = Flex::new(pin); |         let mut pin = Flex::new(pin); | ||||||
|         pin.set_as_input(pull); |         pin.set_as_input(pull); | ||||||
|  |  | ||||||
| @@ -118,7 +118,7 @@ pub struct Output<'d, T: Pin> { | |||||||
|  |  | ||||||
| impl<'d, T: Pin> Output<'d, T> { | impl<'d, T: Pin> Output<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, initial_output: Level, drive: OutputDrive) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, initial_output: Level, drive: OutputDrive) -> Self { | ||||||
|         let mut pin = Flex::new(pin); |         let mut pin = Flex::new(pin); | ||||||
|         match initial_output { |         match initial_output { | ||||||
|             Level::High => pin.set_high(), |             Level::High => pin.set_high(), | ||||||
| @@ -193,7 +193,7 @@ fn convert_pull(pull: Pull) -> PULL_A { | |||||||
| /// set while not in output mode, so the pin's level will be 'remembered' when it is not in output | /// set while not in output mode, so the pin's level will be 'remembered' when it is not in output | ||||||
| /// mode. | /// mode. | ||||||
| pub struct Flex<'d, T: Pin> { | pub struct Flex<'d, T: Pin> { | ||||||
|     pub(crate) pin: Unborrowed<'d, T>, |     pub(crate) pin: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Pin> Flex<'d, T> { | impl<'d, T: Pin> Flex<'d, T> { | ||||||
| @@ -202,8 +202,8 @@ impl<'d, T: Pin> Flex<'d, T> { | |||||||
|     /// The pin remains disconnected. The initial output level is unspecified, but can be changed |     /// The pin remains disconnected. The initial output level is unspecified, but can be changed | ||||||
|     /// before the pin is put into output mode. |     /// before the pin is put into output mode. | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd) -> Self { | ||||||
|         unborrow!(pin); |         into_ref!(pin); | ||||||
|         // Pin will be in disconnected state. |         // Pin will be in disconnected state. | ||||||
|         Self { pin } |         Self { pin } | ||||||
|     } |     } | ||||||
| @@ -374,7 +374,7 @@ pub(crate) mod sealed { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Pin: Unborrow<Target = Self> + sealed::Pin + Sized + 'static { | pub trait Pin: Peripheral<P = Self> + sealed::Pin + Sized + 'static { | ||||||
|     /// Number of the pin within the port (0..31) |     /// Number of the pin within the port (0..31) | ||||||
|     #[inline] |     #[inline] | ||||||
|     fn pin(&self) -> u8 { |     fn pin(&self) -> u8 { | ||||||
| @@ -417,22 +417,22 @@ impl AnyPin { | |||||||
|         Self { pin_port } |         Self { pin_port } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub(crate) fn unborrow_and_degrade<'a>(pin: impl Unborrow<Target = impl Pin + 'a> + 'a) -> Unborrowed<'a, Self> { |     pub(crate) fn into_degraded_ref<'a>(pin: impl Peripheral<P = impl Pin + 'a> + 'a) -> PeripheralRef<'a, Self> { | ||||||
|         Unborrowed::new(AnyPin { |         PeripheralRef::new(AnyPin { | ||||||
|             pin_port: pin.unborrow().pin_port(), |             pin_port: pin.into_ref().pin_port(), | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| macro_rules! unborrow_and_degrade { | macro_rules! into_degraded_ref { | ||||||
|     ($($name:ident),*) => { |     ($($name:ident),*) => { | ||||||
|         $( |         $( | ||||||
|             let $name = $crate::gpio::AnyPin::unborrow_and_degrade($name); |             let $name = $crate::gpio::AnyPin::into_degraded_ref($name); | ||||||
|         )* |         )* | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
| impl_unborrow!(AnyPin); | impl_peripheral!(AnyPin); | ||||||
| impl Pin for AnyPin {} | impl Pin for AnyPin {} | ||||||
| impl sealed::Pin for AnyPin { | impl sealed::Pin for AnyPin { | ||||||
|     #[inline] |     #[inline] | ||||||
| @@ -447,7 +447,7 @@ pub(crate) trait PselBits { | |||||||
|     fn psel_bits(&self) -> u32; |     fn psel_bits(&self) -> u32; | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'a, P: Pin> PselBits for Option<Unborrowed<'a, P>> { | impl<'a, P: Pin> PselBits for Option<PeripheralRef<'a, P>> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     fn psel_bits(&self) -> u32 { |     fn psel_bits(&self) -> u32 { | ||||||
|         match self { |         match self { | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ use core::marker::PhantomData; | |||||||
| use core::task::{Context, Poll}; | use core::task::{Context, Poll}; | ||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::impl_unborrow; | use embassy_hal_common::impl_peripheral; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::Pin as _; | use crate::gpio::sealed::Pin as _; | ||||||
| @@ -414,7 +414,7 @@ pub trait Channel: sealed::Channel + Sized { | |||||||
| pub struct AnyChannel { | pub struct AnyChannel { | ||||||
|     number: u8, |     number: u8, | ||||||
| } | } | ||||||
| impl_unborrow!(AnyChannel); | impl_peripheral!(AnyChannel); | ||||||
| impl sealed::Channel for AnyChannel {} | impl sealed::Channel for AnyChannel {} | ||||||
| impl Channel for AnyChannel { | impl Channel for AnyChannel { | ||||||
|     fn number(&self) -> usize { |     fn number(&self) -> usize { | ||||||
|   | |||||||
| @@ -135,7 +135,7 @@ pub use chip::pac; | |||||||
| pub(crate) use chip::pac; | pub(crate) use chip::pac; | ||||||
| pub use chip::{peripherals, Peripherals}; | pub use chip::{peripherals, Peripherals}; | ||||||
| pub use embassy_cortex_m::executor; | pub use embassy_cortex_m::executor; | ||||||
| pub use embassy_hal_common::{unborrow, Unborrow, Unborrowed}; | pub use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | ||||||
| pub use embassy_macros::cortex_m_interrupt as interrupt; | pub use embassy_macros::cortex_m_interrupt as interrupt; | ||||||
|  |  | ||||||
| pub mod config { | pub mod config { | ||||||
|   | |||||||
| @@ -3,13 +3,13 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
| use core::{ptr, slice}; | use core::{ptr, slice}; | ||||||
|  |  | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| use embedded_storage::nor_flash::{ | use embedded_storage::nor_flash::{ | ||||||
|     ErrorType, MultiwriteNorFlash, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash, |     ErrorType, MultiwriteNorFlash, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| use crate::peripherals::NVMC; | use crate::peripherals::NVMC; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| pub const PAGE_SIZE: usize = 4096; | pub const PAGE_SIZE: usize = 4096; | ||||||
| pub const FLASH_SIZE: usize = crate::chip::FLASH_SIZE; | pub const FLASH_SIZE: usize = crate::chip::FLASH_SIZE; | ||||||
| @@ -35,8 +35,8 @@ pub struct Nvmc<'d> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d> Nvmc<'d> { | impl<'d> Nvmc<'d> { | ||||||
|     pub fn new(_p: impl Unborrow<Target = NVMC> + 'd) -> Self { |     pub fn new(_p: impl Peripheral<P = NVMC> + 'd) -> Self { | ||||||
|         unborrow!(_p); |         into_ref!(_p); | ||||||
|  |  | ||||||
|         Self { _p: PhantomData } |         Self { _p: PhantomData } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
|  |  | ||||||
| use super::{Channel, ConfigurableChannel, Event, Ppi, Task}; | use super::{Channel, ConfigurableChannel, Event, Ppi, Task}; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| const DPPI_ENABLE_BIT: u32 = 0x8000_0000; | const DPPI_ENABLE_BIT: u32 = 0x8000_0000; | ||||||
| const DPPI_CHANNEL_MASK: u32 = 0x0000_00FF; | const DPPI_CHANNEL_MASK: u32 = 0x0000_00FF; | ||||||
| @@ -11,13 +11,13 @@ fn regs() -> &'static pac::dppic::RegisterBlock { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 1> { | impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 1> { | ||||||
|     pub fn new_one_to_one(ch: impl Unborrow<Target = C> + 'd, event: Event, task: Task) -> Self { |     pub fn new_one_to_one(ch: impl Peripheral<P = C> + 'd, event: Event, task: Task) -> Self { | ||||||
|         Ppi::new_many_to_many(ch, [event], [task]) |         Ppi::new_many_to_many(ch, [event], [task]) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 2> { | 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 Peripheral<P = C> + 'd, event: Event, task1: Task, task2: Task) -> Self { | ||||||
|         Ppi::new_many_to_many(ch, [event], [task1, task2]) |         Ppi::new_many_to_many(ch, [event], [task1, task2]) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -26,11 +26,11 @@ impl<'d, C: ConfigurableChannel, const EVENT_COUNT: usize, const TASK_COUNT: usi | |||||||
|     Ppi<'d, C, EVENT_COUNT, TASK_COUNT> |     Ppi<'d, C, EVENT_COUNT, TASK_COUNT> | ||||||
| { | { | ||||||
|     pub fn new_many_to_many( |     pub fn new_many_to_many( | ||||||
|         ch: impl Unborrow<Target = C> + 'd, |         ch: impl Peripheral<P = C> + 'd, | ||||||
|         events: [Event; EVENT_COUNT], |         events: [Event; EVENT_COUNT], | ||||||
|         tasks: [Task; TASK_COUNT], |         tasks: [Task; TASK_COUNT], | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(ch); |         into_ref!(ch); | ||||||
|  |  | ||||||
|         let val = DPPI_ENABLE_BIT | (ch.number() as u32 & DPPI_CHANNEL_MASK); |         let val = DPPI_ENABLE_BIT | (ch.number() as u32 & DPPI_CHANNEL_MASK); | ||||||
|         for task in tasks { |         for task in tasks { | ||||||
|   | |||||||
| @@ -17,9 +17,9 @@ | |||||||
|  |  | ||||||
| use core::ptr::NonNull; | use core::ptr::NonNull; | ||||||
|  |  | ||||||
| use embassy_hal_common::{impl_unborrow, Unborrowed}; | use embassy_hal_common::{impl_peripheral, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::{peripherals, Unborrow}; | use crate::{peripherals, Peripheral}; | ||||||
|  |  | ||||||
| #[cfg(feature = "_dppi")] | #[cfg(feature = "_dppi")] | ||||||
| mod dppi; | mod dppi; | ||||||
| @@ -27,7 +27,7 @@ mod dppi; | |||||||
| mod ppi; | mod ppi; | ||||||
|  |  | ||||||
| pub struct Ppi<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize> { | pub struct Ppi<'d, C: Channel, const EVENT_COUNT: usize, const TASK_COUNT: usize> { | ||||||
|     ch: Unborrowed<'d, C>, |     ch: PeripheralRef<'d, C>, | ||||||
|     #[cfg(feature = "_dppi")] |     #[cfg(feature = "_dppi")] | ||||||
|     events: [Event; EVENT_COUNT], |     events: [Event; EVENT_COUNT], | ||||||
|     #[cfg(feature = "_dppi")] |     #[cfg(feature = "_dppi")] | ||||||
| @@ -87,7 +87,7 @@ pub(crate) mod sealed { | |||||||
|     pub trait Group {} |     pub trait Group {} | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Channel: sealed::Channel + Unborrow<Target = Self> + Sized { | pub trait Channel: sealed::Channel + Peripheral<P = Self> + Sized { | ||||||
|     /// Returns the number of the channel |     /// Returns the number of the channel | ||||||
|     fn number(&self) -> usize; |     fn number(&self) -> usize; | ||||||
| } | } | ||||||
| @@ -117,7 +117,7 @@ pub trait Group: sealed::Group + Sized { | |||||||
| pub struct AnyStaticChannel { | pub struct AnyStaticChannel { | ||||||
|     pub(crate) number: u8, |     pub(crate) number: u8, | ||||||
| } | } | ||||||
| impl_unborrow!(AnyStaticChannel); | impl_peripheral!(AnyStaticChannel); | ||||||
| impl sealed::Channel for AnyStaticChannel {} | impl sealed::Channel for AnyStaticChannel {} | ||||||
| impl Channel for AnyStaticChannel { | impl Channel for AnyStaticChannel { | ||||||
|     fn number(&self) -> usize { |     fn number(&self) -> usize { | ||||||
| @@ -135,7 +135,7 @@ impl StaticChannel for AnyStaticChannel { | |||||||
| pub struct AnyConfigurableChannel { | pub struct AnyConfigurableChannel { | ||||||
|     pub(crate) number: u8, |     pub(crate) number: u8, | ||||||
| } | } | ||||||
| impl_unborrow!(AnyConfigurableChannel); | impl_peripheral!(AnyConfigurableChannel); | ||||||
| impl sealed::Channel for AnyConfigurableChannel {} | impl sealed::Channel for AnyConfigurableChannel {} | ||||||
| impl Channel for AnyConfigurableChannel { | impl Channel for AnyConfigurableChannel { | ||||||
|     fn number(&self) -> usize { |     fn number(&self) -> usize { | ||||||
| @@ -187,7 +187,7 @@ macro_rules! impl_ppi_channel { | |||||||
| pub struct AnyGroup { | pub struct AnyGroup { | ||||||
|     number: u8, |     number: u8, | ||||||
| } | } | ||||||
| impl_unborrow!(AnyGroup); | impl_peripheral!(AnyGroup); | ||||||
| impl sealed::Group for AnyGroup {} | impl sealed::Group for AnyGroup {} | ||||||
| impl Group for AnyGroup { | impl Group for AnyGroup { | ||||||
|     fn number(&self) -> usize { |     fn number(&self) -> usize { | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
|  |  | ||||||
| use super::{Channel, ConfigurableChannel, Event, Ppi, StaticChannel, Task}; | use super::{Channel, ConfigurableChannel, Event, Ppi, StaticChannel, Task}; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| impl Task { | impl Task { | ||||||
|     fn reg_val(&self) -> u32 { |     fn reg_val(&self) -> u32 { | ||||||
| @@ -20,8 +20,8 @@ fn regs() -> &'static pac::ppi::RegisterBlock { | |||||||
|  |  | ||||||
| #[cfg(not(feature = "nrf51"))] // Not for nrf51 because of the fork task | #[cfg(not(feature = "nrf51"))] // Not for nrf51 because of the fork task | ||||||
| impl<'d, C: StaticChannel> Ppi<'d, C, 0, 1> { | impl<'d, C: StaticChannel> Ppi<'d, C, 0, 1> { | ||||||
|     pub fn new_zero_to_one(ch: impl Unborrow<Target = C> + 'd, task: Task) -> Self { |     pub fn new_zero_to_one(ch: impl Peripheral<P = C> + 'd, task: Task) -> Self { | ||||||
|         unborrow!(ch); |         into_ref!(ch); | ||||||
|  |  | ||||||
|         let r = regs(); |         let r = regs(); | ||||||
|         let n = ch.number(); |         let n = ch.number(); | ||||||
| @@ -32,8 +32,8 @@ impl<'d, C: StaticChannel> Ppi<'d, C, 0, 1> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 1> { | impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 1> { | ||||||
|     pub fn new_one_to_one(ch: impl Unborrow<Target = C> + 'd, event: Event, task: Task) -> Self { |     pub fn new_one_to_one(ch: impl Peripheral<P = C> + 'd, event: Event, task: Task) -> Self { | ||||||
|         unborrow!(ch); |         into_ref!(ch); | ||||||
|  |  | ||||||
|         let r = regs(); |         let r = regs(); | ||||||
|         let n = ch.number(); |         let n = ch.number(); | ||||||
| @@ -46,8 +46,8 @@ impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 1> { | |||||||
|  |  | ||||||
| #[cfg(not(feature = "nrf51"))] // Not for nrf51 because of the fork task | #[cfg(not(feature = "nrf51"))] // Not for nrf51 because of the fork task | ||||||
| impl<'d, C: ConfigurableChannel> Ppi<'d, C, 1, 2> { | 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 Peripheral<P = C> + 'd, event: Event, task1: Task, task2: Task) -> Self { | ||||||
|         unborrow!(ch); |         into_ref!(ch); | ||||||
|  |  | ||||||
|         let r = regs(); |         let r = regs(); | ||||||
|         let n = ch.number(); |         let n = ch.number(); | ||||||
|   | |||||||
| @@ -3,34 +3,34 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
| use core::sync::atomic::{compiler_fence, Ordering}; | use core::sync::atomic::{compiler_fence, Ordering}; | ||||||
|  |  | ||||||
| use embassy_hal_common::Unborrowed; | use embassy_hal_common::PeripheralRef; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::Pin as _; | use crate::gpio::sealed::Pin as _; | ||||||
| use crate::gpio::{AnyPin, Pin as GpioPin, PselBits}; | use crate::gpio::{AnyPin, Pin as GpioPin, PselBits}; | ||||||
| use crate::interrupt::Interrupt; | use crate::interrupt::Interrupt; | ||||||
| use crate::ppi::{Event, Task}; | use crate::ppi::{Event, Task}; | ||||||
| use crate::util::slice_in_ram_or; | use crate::util::slice_in_ram_or; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| /// SimplePwm is the traditional pwm interface you're probably used to, allowing | /// SimplePwm is the traditional pwm interface you're probably used to, allowing | ||||||
| /// to simply set a duty cycle across up to four channels. | /// to simply set a duty cycle across up to four channels. | ||||||
| pub struct SimplePwm<'d, T: Instance> { | pub struct SimplePwm<'d, T: Instance> { | ||||||
|     phantom: PhantomData<&'d mut T>, |     phantom: PhantomData<&'d mut T>, | ||||||
|     duty: [u16; 4], |     duty: [u16; 4], | ||||||
|     ch0: Option<Unborrowed<'d, AnyPin>>, |     ch0: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     ch1: Option<Unborrowed<'d, AnyPin>>, |     ch1: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     ch2: Option<Unborrowed<'d, AnyPin>>, |     ch2: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     ch3: Option<Unborrowed<'d, AnyPin>>, |     ch3: Option<PeripheralRef<'d, AnyPin>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| /// SequencePwm allows you to offload the updating of a sequence of duty cycles | /// SequencePwm allows you to offload the updating of a sequence of duty cycles | ||||||
| /// to up to four channels, as well as repeat that sequence n times. | /// to up to four channels, as well as repeat that sequence n times. | ||||||
| pub struct SequencePwm<'d, T: Instance> { | pub struct SequencePwm<'d, T: Instance> { | ||||||
|     phantom: PhantomData<&'d mut T>, |     phantom: PhantomData<&'d mut T>, | ||||||
|     ch0: Option<Unborrowed<'d, AnyPin>>, |     ch0: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     ch1: Option<Unborrowed<'d, AnyPin>>, |     ch1: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     ch2: Option<Unborrowed<'d, AnyPin>>, |     ch2: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     ch3: Option<Unborrowed<'d, AnyPin>>, |     ch3: Option<PeripheralRef<'d, AnyPin>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | ||||||
| @@ -51,59 +51,59 @@ impl<'d, T: Instance> SequencePwm<'d, T> { | |||||||
|     /// Create a new 1-channel PWM |     /// Create a new 1-channel PWM | ||||||
|     #[allow(unused_unsafe)] |     #[allow(unused_unsafe)] | ||||||
|     pub fn new_1ch( |     pub fn new_1ch( | ||||||
|         pwm: impl Unborrow<Target = T> + 'd, |         pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: impl Unborrow<Target = impl GpioPin> + 'd, |         ch0: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Result<Self, Error> { |     ) -> Result<Self, Error> { | ||||||
|         unborrow_and_degrade!(ch0); |         into_degraded_ref!(ch0); | ||||||
|         Self::new_inner(pwm, Some(ch0), None, None, None, config) |         Self::new_inner(pwm, Some(ch0), None, None, None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a new 2-channel PWM |     /// Create a new 2-channel PWM | ||||||
|     #[allow(unused_unsafe)] |     #[allow(unused_unsafe)] | ||||||
|     pub fn new_2ch( |     pub fn new_2ch( | ||||||
|         pwm: impl Unborrow<Target = T> + 'd, |         pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: impl Unborrow<Target = impl GpioPin> + 'd, |         ch0: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl GpioPin> + 'd, |         ch1: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Result<Self, Error> { |     ) -> Result<Self, Error> { | ||||||
|         unborrow_and_degrade!(ch0, ch1); |         into_degraded_ref!(ch0, ch1); | ||||||
|         Self::new_inner(pwm, Some(ch0), Some(ch1), None, None, config) |         Self::new_inner(pwm, Some(ch0), Some(ch1), None, None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a new 3-channel PWM |     /// Create a new 3-channel PWM | ||||||
|     #[allow(unused_unsafe)] |     #[allow(unused_unsafe)] | ||||||
|     pub fn new_3ch( |     pub fn new_3ch( | ||||||
|         pwm: impl Unborrow<Target = T> + 'd, |         pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: impl Unborrow<Target = impl GpioPin> + 'd, |         ch0: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl GpioPin> + 'd, |         ch1: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch2: impl Unborrow<Target = impl GpioPin> + 'd, |         ch2: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Result<Self, Error> { |     ) -> Result<Self, Error> { | ||||||
|         unborrow_and_degrade!(ch0, ch1, ch2); |         into_degraded_ref!(ch0, ch1, ch2); | ||||||
|         Self::new_inner(pwm, Some(ch0), Some(ch1), Some(ch2), None, config) |         Self::new_inner(pwm, Some(ch0), Some(ch1), Some(ch2), None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a new 4-channel PWM |     /// Create a new 4-channel PWM | ||||||
|     #[allow(unused_unsafe)] |     #[allow(unused_unsafe)] | ||||||
|     pub fn new_4ch( |     pub fn new_4ch( | ||||||
|         pwm: impl Unborrow<Target = T> + 'd, |         pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: impl Unborrow<Target = impl GpioPin> + 'd, |         ch0: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl GpioPin> + 'd, |         ch1: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch2: impl Unborrow<Target = impl GpioPin> + 'd, |         ch2: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch3: impl Unborrow<Target = impl GpioPin> + 'd, |         ch3: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Result<Self, Error> { |     ) -> Result<Self, Error> { | ||||||
|         unborrow_and_degrade!(ch0, ch1, ch2, ch3); |         into_degraded_ref!(ch0, ch1, ch2, ch3); | ||||||
|         Self::new_inner(pwm, Some(ch0), Some(ch1), Some(ch2), Some(ch3), config) |         Self::new_inner(pwm, Some(ch0), Some(ch1), Some(ch2), Some(ch3), config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         _pwm: impl Unborrow<Target = T> + 'd, |         _pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: Option<Unborrowed<'d, AnyPin>>, |         ch0: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         ch1: Option<Unborrowed<'d, AnyPin>>, |         ch1: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         ch2: Option<Unborrowed<'d, AnyPin>>, |         ch2: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         ch3: Option<Unborrowed<'d, AnyPin>>, |         ch3: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Result<Self, Error> { |     ) -> Result<Self, Error> { | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
| @@ -559,9 +559,9 @@ pub enum CounterMode { | |||||||
| impl<'d, T: Instance> SimplePwm<'d, T> { | impl<'d, T: Instance> SimplePwm<'d, T> { | ||||||
|     /// Create a new 1-channel PWM |     /// Create a new 1-channel PWM | ||||||
|     #[allow(unused_unsafe)] |     #[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 Peripheral<P = T> + 'd, ch0: impl Peripheral<P = impl GpioPin> + 'd) -> Self { | ||||||
|         unsafe { |         unsafe { | ||||||
|             unborrow_and_degrade!(ch0); |             into_degraded_ref!(ch0); | ||||||
|             Self::new_inner(pwm, Some(ch0), None, None, None) |             Self::new_inner(pwm, Some(ch0), None, None, None) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -569,24 +569,24 @@ impl<'d, T: Instance> SimplePwm<'d, T> { | |||||||
|     /// Create a new 2-channel PWM |     /// Create a new 2-channel PWM | ||||||
|     #[allow(unused_unsafe)] |     #[allow(unused_unsafe)] | ||||||
|     pub fn new_2ch( |     pub fn new_2ch( | ||||||
|         pwm: impl Unborrow<Target = T> + 'd, |         pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: impl Unborrow<Target = impl GpioPin> + 'd, |         ch0: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl GpioPin> + 'd, |         ch1: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(ch0, ch1); |         into_degraded_ref!(ch0, ch1); | ||||||
|         Self::new_inner(pwm, Some(ch0), Some(ch1), None, None) |         Self::new_inner(pwm, Some(ch0), Some(ch1), None, None) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a new 3-channel PWM |     /// Create a new 3-channel PWM | ||||||
|     #[allow(unused_unsafe)] |     #[allow(unused_unsafe)] | ||||||
|     pub fn new_3ch( |     pub fn new_3ch( | ||||||
|         pwm: impl Unborrow<Target = T> + 'd, |         pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: impl Unborrow<Target = impl GpioPin> + 'd, |         ch0: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl GpioPin> + 'd, |         ch1: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch2: impl Unborrow<Target = impl GpioPin> + 'd, |         ch2: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unsafe { |         unsafe { | ||||||
|             unborrow_and_degrade!(ch0, ch1, ch2); |             into_degraded_ref!(ch0, ch1, ch2); | ||||||
|             Self::new_inner(pwm, Some(ch0), Some(ch1), Some(ch2), None) |             Self::new_inner(pwm, Some(ch0), Some(ch1), Some(ch2), None) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -594,24 +594,24 @@ impl<'d, T: Instance> SimplePwm<'d, T> { | |||||||
|     /// Create a new 4-channel PWM |     /// Create a new 4-channel PWM | ||||||
|     #[allow(unused_unsafe)] |     #[allow(unused_unsafe)] | ||||||
|     pub fn new_4ch( |     pub fn new_4ch( | ||||||
|         pwm: impl Unborrow<Target = T> + 'd, |         pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: impl Unborrow<Target = impl GpioPin> + 'd, |         ch0: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl GpioPin> + 'd, |         ch1: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch2: impl Unborrow<Target = impl GpioPin> + 'd, |         ch2: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         ch3: impl Unborrow<Target = impl GpioPin> + 'd, |         ch3: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unsafe { |         unsafe { | ||||||
|             unborrow_and_degrade!(ch0, ch1, ch2, ch3); |             into_degraded_ref!(ch0, ch1, ch2, ch3); | ||||||
|             Self::new_inner(pwm, Some(ch0), Some(ch1), Some(ch2), Some(ch3)) |             Self::new_inner(pwm, Some(ch0), Some(ch1), Some(ch2), Some(ch3)) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         _pwm: impl Unborrow<Target = T> + 'd, |         _pwm: impl Peripheral<P = T> + 'd, | ||||||
|         ch0: Option<Unborrowed<'d, AnyPin>>, |         ch0: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         ch1: Option<Unborrowed<'d, AnyPin>>, |         ch1: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         ch2: Option<Unborrowed<'d, AnyPin>>, |         ch2: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         ch3: Option<Unborrowed<'d, AnyPin>>, |         ch3: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
|  |  | ||||||
| @@ -799,7 +799,7 @@ pub(crate) mod sealed { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Instance: Unborrow<Target = Self> + sealed::Instance + 'static { | pub trait Instance: Peripheral<P = Self> + sealed::Instance + 'static { | ||||||
|     type Interrupt: Interrupt; |     type Interrupt: Interrupt; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,14 +4,14 @@ use core::marker::PhantomData; | |||||||
| use core::task::Poll; | use core::task::Poll; | ||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::Pin as _; | use crate::gpio::sealed::Pin as _; | ||||||
| use crate::gpio::{AnyPin, Pin as GpioPin}; | use crate::gpio::{AnyPin, Pin as GpioPin}; | ||||||
| use crate::interrupt::InterruptExt; | use crate::interrupt::InterruptExt; | ||||||
| use crate::peripherals::QDEC; | use crate::peripherals::QDEC; | ||||||
| use crate::{interrupt, pac, Unborrow}; | use crate::{interrupt, pac, Peripheral}; | ||||||
|  |  | ||||||
| /// Quadrature decoder | /// Quadrature decoder | ||||||
| pub struct Qdec<'d> { | pub struct Qdec<'d> { | ||||||
| @@ -43,37 +43,37 @@ static WAKER: AtomicWaker = AtomicWaker::new(); | |||||||
|  |  | ||||||
| impl<'d> Qdec<'d> { | impl<'d> Qdec<'d> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         qdec: impl Unborrow<Target = QDEC> + 'd, |         qdec: impl Peripheral<P = QDEC> + 'd, | ||||||
|         irq: impl Unborrow<Target = interrupt::QDEC> + 'd, |         irq: impl Peripheral<P = interrupt::QDEC> + 'd, | ||||||
|         a: impl Unborrow<Target = impl GpioPin> + 'd, |         a: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         b: impl Unborrow<Target = impl GpioPin> + 'd, |         b: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(a, b); |         into_degraded_ref!(a, b); | ||||||
|         Self::new_inner(qdec, irq, a, b, None, config) |         Self::new_inner(qdec, irq, a, b, None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_with_led( |     pub fn new_with_led( | ||||||
|         qdec: impl Unborrow<Target = QDEC> + 'd, |         qdec: impl Peripheral<P = QDEC> + 'd, | ||||||
|         irq: impl Unborrow<Target = interrupt::QDEC> + 'd, |         irq: impl Peripheral<P = interrupt::QDEC> + 'd, | ||||||
|         a: impl Unborrow<Target = impl GpioPin> + 'd, |         a: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         b: impl Unborrow<Target = impl GpioPin> + 'd, |         b: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         led: impl Unborrow<Target = impl GpioPin> + 'd, |         led: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(a, b, led); |         into_degraded_ref!(a, b, led); | ||||||
|         Self::new_inner(qdec, irq, a, b, Some(led), config) |         Self::new_inner(qdec, irq, a, b, Some(led), config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         _t: impl Unborrow<Target = QDEC> + 'd, |         _t: impl Peripheral<P = QDEC> + 'd, | ||||||
|         irq: impl Unborrow<Target = interrupt::QDEC> + 'd, |         irq: impl Peripheral<P = interrupt::QDEC> + 'd, | ||||||
|         a: Unborrowed<'d, AnyPin>, |         a: PeripheralRef<'d, AnyPin>, | ||||||
|         b: Unborrowed<'d, AnyPin>, |         b: PeripheralRef<'d, AnyPin>, | ||||||
|         led: Option<Unborrowed<'d, AnyPin>>, |         led: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|         let r = Self::regs(); |         let r = Self::regs(); | ||||||
|  |  | ||||||
|         // Select pins. |         // Select pins. | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ use core::ptr; | |||||||
| use core::task::Poll; | use core::task::Poll; | ||||||
|  |  | ||||||
| use embassy_hal_common::drop::DropBomb; | use embassy_hal_common::drop::DropBomb; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::Pin as _; | use crate::gpio::sealed::Pin as _; | ||||||
| @@ -13,7 +13,7 @@ use crate::interrupt::{Interrupt, InterruptExt}; | |||||||
| pub use crate::pac::qspi::ifconfig0::{ | pub use crate::pac::qspi::ifconfig0::{ | ||||||
|     ADDRMODE_A as AddressMode, PPSIZE_A as WritePageSize, READOC_A as ReadOpcode, WRITEOC_A as WriteOpcode, |     ADDRMODE_A as AddressMode, PPSIZE_A as WritePageSize, READOC_A as ReadOpcode, WRITEOC_A as WriteOpcode, | ||||||
| }; | }; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| // TODO | // TODO | ||||||
| // - config: | // - config: | ||||||
| @@ -62,27 +62,27 @@ pub enum Error { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub struct Qspi<'d, T: Instance, const FLASH_SIZE: usize> { | pub struct Qspi<'d, T: Instance, const FLASH_SIZE: usize> { | ||||||
|     irq: Unborrowed<'d, T::Interrupt>, |     irq: PeripheralRef<'d, T::Interrupt>, | ||||||
|     dpm_enabled: bool, |     dpm_enabled: bool, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance, const FLASH_SIZE: usize> Qspi<'d, T, FLASH_SIZE> { | impl<'d, T: Instance, const FLASH_SIZE: usize> Qspi<'d, T, FLASH_SIZE> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         _qspi: impl Unborrow<Target = T> + 'd, |         _qspi: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         sck: impl Unborrow<Target = impl GpioPin> + 'd, |         sck: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         csn: impl Unborrow<Target = impl GpioPin> + 'd, |         csn: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         io0: impl Unborrow<Target = impl GpioPin> + 'd, |         io0: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         io1: impl Unborrow<Target = impl GpioPin> + 'd, |         io1: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         io2: impl Unborrow<Target = impl GpioPin> + 'd, |         io2: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         io3: impl Unborrow<Target = impl GpioPin> + 'd, |         io3: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Qspi<'d, T, FLASH_SIZE> { |     ) -> Qspi<'d, T, FLASH_SIZE> { | ||||||
|         unborrow!(irq, sck, csn, io0, io1, io2, io3); |         into_ref!(irq, sck, csn, io0, io1, io2, io3); | ||||||
|  |  | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
|  |  | ||||||
|         unborrow_and_degrade!(sck, csn, io0, io1, io2, io3); |         into_degraded_ref!(sck, csn, io0, io1, io2, io3); | ||||||
|  |  | ||||||
|         for pin in [&sck, &csn, &io0, &io1, &io2, &io3] { |         for pin in [&sck, &csn, &io0, &io1, &io2, &io3] { | ||||||
|             pin.set_high(); |             pin.set_high(); | ||||||
| @@ -528,7 +528,7 @@ pub(crate) mod sealed { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Instance: Unborrow<Target = Self> + sealed::Instance + 'static { | pub trait Instance: Peripheral<P = Self> + sealed::Instance + 'static { | ||||||
|     type Interrupt: Interrupt; |     type Interrupt: Interrupt; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,12 +4,12 @@ use core::task::Poll; | |||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::drop::OnDrop; | use embassy_hal_common::drop::OnDrop; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::interrupt::InterruptExt; | use crate::interrupt::InterruptExt; | ||||||
| use crate::peripherals::RNG; | use crate::peripherals::RNG; | ||||||
| use crate::{interrupt, pac, Unborrow}; | use crate::{interrupt, pac, Peripheral}; | ||||||
|  |  | ||||||
| impl RNG { | impl RNG { | ||||||
|     fn regs() -> &'static pac::rng::RegisterBlock { |     fn regs() -> &'static pac::rng::RegisterBlock { | ||||||
| @@ -33,7 +33,7 @@ struct State { | |||||||
| /// | /// | ||||||
| /// It has a non-blocking API, and a blocking api through `rand`. | /// It has a non-blocking API, and a blocking api through `rand`. | ||||||
| pub struct Rng<'d> { | pub struct Rng<'d> { | ||||||
|     irq: Unborrowed<'d, interrupt::RNG>, |     irq: PeripheralRef<'d, interrupt::RNG>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d> Rng<'d> { | impl<'d> Rng<'d> { | ||||||
| @@ -43,8 +43,8 @@ impl<'d> Rng<'d> { | |||||||
|     /// e.g. using `mem::forget`. |     /// e.g. using `mem::forget`. | ||||||
|     /// |     /// | ||||||
|     /// The synchronous API is safe. |     /// 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 Peripheral<P = RNG> + 'd, irq: impl Peripheral<P = interrupt::RNG> + 'd) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         let this = Self { irq }; |         let this = Self { irq }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ use core::sync::atomic::{compiler_fence, Ordering}; | |||||||
| use core::task::Poll; | use core::task::Poll; | ||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::{impl_unborrow, unborrow}; | use embassy_hal_common::{impl_peripheral, into_ref}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
| use pac::{saadc, SAADC}; | use pac::{saadc, SAADC}; | ||||||
| use saadc::ch::config::{GAIN_A, REFSEL_A, RESP_A, TACQ_A}; | use saadc::ch::config::{GAIN_A, REFSEL_A, RESP_A, TACQ_A}; | ||||||
| @@ -17,7 +17,7 @@ use saadc::resolution::VAL_A; | |||||||
| use crate::interrupt::InterruptExt; | use crate::interrupt::InterruptExt; | ||||||
| use crate::ppi::{ConfigurableChannel, Event, Ppi, Task}; | use crate::ppi::{ConfigurableChannel, Event, Ppi, Task}; | ||||||
| use crate::timer::{Frequency, Instance as TimerInstance, Timer}; | use crate::timer::{Frequency, Instance as TimerInstance, Timer}; | ||||||
| use crate::{interrupt, pac, peripherals, Unborrow}; | use crate::{interrupt, pac, peripherals, Peripheral}; | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | ||||||
| #[cfg_attr(feature = "defmt", derive(defmt::Format))] | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | ||||||
| @@ -77,7 +77,7 @@ pub struct ChannelConfig<'d> { | |||||||
| /// internal voltage. | /// internal voltage. | ||||||
| pub struct VddInput; | pub struct VddInput; | ||||||
|  |  | ||||||
| impl_unborrow!(VddInput); | impl_peripheral!(VddInput); | ||||||
|  |  | ||||||
| impl sealed::Input for VddInput { | impl sealed::Input for VddInput { | ||||||
|     #[cfg(not(feature = "_nrf9160"))] |     #[cfg(not(feature = "_nrf9160"))] | ||||||
| @@ -97,7 +97,7 @@ impl Input for VddInput {} | |||||||
| pub struct VddhDiv5Input; | pub struct VddhDiv5Input; | ||||||
|  |  | ||||||
| #[cfg(any(feature = "_nrf5340-app", feature = "nrf52833", feature = "nrf52840"))] | #[cfg(any(feature = "_nrf5340-app", feature = "nrf52833", feature = "nrf52840"))] | ||||||
| impl_unborrow!(VddhDiv5Input); | impl_peripheral!(VddhDiv5Input); | ||||||
|  |  | ||||||
| #[cfg(any(feature = "_nrf5340-app", feature = "nrf52833", feature = "nrf52840"))] | #[cfg(any(feature = "_nrf5340-app", feature = "nrf52833", feature = "nrf52840"))] | ||||||
| impl sealed::Input for VddhDiv5Input { | impl sealed::Input for VddhDiv5Input { | ||||||
| @@ -113,7 +113,7 @@ pub struct AnyInput { | |||||||
|     channel: InputChannel, |     channel: InputChannel, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl_unborrow!(AnyInput); | impl_peripheral!(AnyInput); | ||||||
|  |  | ||||||
| impl sealed::Input for AnyInput { | impl sealed::Input for AnyInput { | ||||||
|     fn channel(&self) -> InputChannel { |     fn channel(&self) -> InputChannel { | ||||||
| @@ -125,8 +125,8 @@ impl Input for AnyInput {} | |||||||
|  |  | ||||||
| impl<'d> ChannelConfig<'d> { | impl<'d> ChannelConfig<'d> { | ||||||
|     /// Default configuration for single ended channel sampling. |     /// Default configuration for single ended channel sampling. | ||||||
|     pub fn single_ended(input: impl Unborrow<Target = impl Input> + 'd) -> Self { |     pub fn single_ended(input: impl Peripheral<P = impl Input> + 'd) -> Self { | ||||||
|         unborrow!(input); |         into_ref!(input); | ||||||
|         Self { |         Self { | ||||||
|             reference: Reference::INTERNAL, |             reference: Reference::INTERNAL, | ||||||
|             gain: Gain::GAIN1_6, |             gain: Gain::GAIN1_6, | ||||||
| @@ -139,10 +139,10 @@ impl<'d> ChannelConfig<'d> { | |||||||
|     } |     } | ||||||
|     /// Default configuration for differential channel sampling. |     /// Default configuration for differential channel sampling. | ||||||
|     pub fn differential( |     pub fn differential( | ||||||
|         p_input: impl Unborrow<Target = impl Input> + 'd, |         p_input: impl Peripheral<P = impl Input> + 'd, | ||||||
|         n_input: impl Unborrow<Target = impl Input> + 'd, |         n_input: impl Peripheral<P = impl Input> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(p_input, n_input); |         into_ref!(p_input, n_input); | ||||||
|         Self { |         Self { | ||||||
|             reference: Reference::INTERNAL, |             reference: Reference::INTERNAL, | ||||||
|             gain: Gain::GAIN1_6, |             gain: Gain::GAIN1_6, | ||||||
| @@ -167,12 +167,12 @@ pub enum SamplerState { | |||||||
|  |  | ||||||
| impl<'d, const N: usize> Saadc<'d, N> { | impl<'d, const N: usize> Saadc<'d, N> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         _saadc: impl Unborrow<Target = peripherals::SAADC> + 'd, |         _saadc: impl Peripheral<P = peripherals::SAADC> + 'd, | ||||||
|         irq: impl Unborrow<Target = interrupt::SAADC> + 'd, |         irq: impl Peripheral<P = interrupt::SAADC> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|         channel_configs: [ChannelConfig; N], |         channel_configs: [ChannelConfig; N], | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         let r = unsafe { &*SAADC::ptr() }; |         let r = unsafe { &*SAADC::ptr() }; | ||||||
|  |  | ||||||
| @@ -674,7 +674,7 @@ pub(crate) mod sealed { | |||||||
| } | } | ||||||
|  |  | ||||||
| /// An input that can be used as either or negative end of a ADC differential in the SAADC periperhal. | /// An input that can be used as either or negative end of a ADC differential in the SAADC periperhal. | ||||||
| pub trait Input: sealed::Input + Unborrow<Target = Self> + Sized { | pub trait Input: sealed::Input + Peripheral<P = Self> + Sized { | ||||||
|     fn degrade_saadc(self) -> AnyInput { |     fn degrade_saadc(self) -> AnyInput { | ||||||
|         AnyInput { |         AnyInput { | ||||||
|             channel: self.channel(), |             channel: self.channel(), | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ use core::sync::atomic::{compiler_fence, Ordering}; | |||||||
| use core::task::Poll; | use core::task::Poll; | ||||||
|  |  | ||||||
| use embassy_embedded_hal::SetConfig; | use embassy_embedded_hal::SetConfig; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| pub use embedded_hal_02::spi::{Mode, Phase, Polarity, MODE_0, MODE_1, MODE_2, MODE_3}; | pub use embedded_hal_02::spi::{Mode, Phase, Polarity, MODE_0, MODE_1, MODE_2, MODE_3}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
| pub use pac::spim0::frequency::FREQUENCY_A as Frequency; | pub use pac::spim0::frequency::FREQUENCY_A as Frequency; | ||||||
| @@ -15,7 +15,7 @@ use crate::gpio::sealed::Pin as _; | |||||||
| use crate::gpio::{self, AnyPin, Pin as GpioPin, PselBits}; | use crate::gpio::{self, AnyPin, Pin as GpioPin, PselBits}; | ||||||
| use crate::interrupt::{Interrupt, InterruptExt}; | use crate::interrupt::{Interrupt, InterruptExt}; | ||||||
| use crate::util::{slice_in_ram_or, slice_ptr_parts, slice_ptr_parts_mut}; | use crate::util::{slice_in_ram_or, slice_ptr_parts, slice_ptr_parts_mut}; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | ||||||
| #[cfg_attr(feature = "defmt", derive(defmt::Format))] | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | ||||||
| @@ -53,48 +53,48 @@ impl Default for Config { | |||||||
|  |  | ||||||
| impl<'d, T: Instance> Spim<'d, T> { | impl<'d, T: Instance> Spim<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         spim: impl Unborrow<Target = T> + 'd, |         spim: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         sck: impl Unborrow<Target = impl GpioPin> + 'd, |         sck: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         miso: impl Unborrow<Target = impl GpioPin> + 'd, |         miso: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         mosi: impl Unborrow<Target = impl GpioPin> + 'd, |         mosi: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(sck, miso, mosi); |         into_degraded_ref!(sck, miso, mosi); | ||||||
|         Self::new_inner(spim, irq, sck, Some(miso), Some(mosi), config) |         Self::new_inner(spim, irq, sck, Some(miso), Some(mosi), config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_txonly( |     pub fn new_txonly( | ||||||
|         spim: impl Unborrow<Target = T> + 'd, |         spim: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         sck: impl Unborrow<Target = impl GpioPin> + 'd, |         sck: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         mosi: impl Unborrow<Target = impl GpioPin> + 'd, |         mosi: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(sck, mosi); |         into_degraded_ref!(sck, mosi); | ||||||
|         Self::new_inner(spim, irq, sck, None, Some(mosi), config) |         Self::new_inner(spim, irq, sck, None, Some(mosi), config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_rxonly( |     pub fn new_rxonly( | ||||||
|         spim: impl Unborrow<Target = T> + 'd, |         spim: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         sck: impl Unborrow<Target = impl GpioPin> + 'd, |         sck: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         miso: impl Unborrow<Target = impl GpioPin> + 'd, |         miso: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(sck, miso); |         into_degraded_ref!(sck, miso); | ||||||
|         Self::new_inner(spim, irq, sck, Some(miso), None, config) |         Self::new_inner(spim, irq, sck, Some(miso), None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         _spim: impl Unborrow<Target = T> + 'd, |         _spim: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         sck: Unborrowed<'d, AnyPin>, |         sck: PeripheralRef<'d, AnyPin>, | ||||||
|         miso: Option<Unborrowed<'d, AnyPin>>, |         miso: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         mosi: Option<Unborrowed<'d, AnyPin>>, |         mosi: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
|  |  | ||||||
| @@ -379,7 +379,7 @@ pub(crate) mod sealed { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Instance: Unborrow<Target = Self> + sealed::Instance + 'static { | pub trait Instance: Peripheral<P = Self> + sealed::Instance + 'static { | ||||||
|     type Interrupt: Interrupt; |     type Interrupt: Interrupt; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,24 +4,24 @@ use core::task::Poll; | |||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::drop::OnDrop; | use embassy_hal_common::drop::OnDrop; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use fixed::types::I30F2; | use fixed::types::I30F2; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::interrupt::InterruptExt; | use crate::interrupt::InterruptExt; | ||||||
| use crate::peripherals::TEMP; | use crate::peripherals::TEMP; | ||||||
| use crate::{interrupt, pac, Unborrow}; | use crate::{interrupt, pac, Peripheral}; | ||||||
|  |  | ||||||
| /// Integrated temperature sensor. | /// Integrated temperature sensor. | ||||||
| pub struct Temp<'d> { | pub struct Temp<'d> { | ||||||
|     _irq: Unborrowed<'d, interrupt::TEMP>, |     _irq: PeripheralRef<'d, interrupt::TEMP>, | ||||||
| } | } | ||||||
|  |  | ||||||
| static WAKER: AtomicWaker = AtomicWaker::new(); | static WAKER: AtomicWaker = AtomicWaker::new(); | ||||||
|  |  | ||||||
| impl<'d> Temp<'d> { | 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 Peripheral<P = TEMP> + 'd, irq: impl Peripheral<P = interrupt::TEMP> + 'd) -> Self { | ||||||
|         unborrow!(_t, irq); |         into_ref!(_t, irq); | ||||||
|  |  | ||||||
|         // Enable interrupt that signals temperature values |         // Enable interrupt that signals temperature values | ||||||
|         irq.disable(); |         irq.disable(); | ||||||
|   | |||||||
| @@ -5,12 +5,12 @@ use core::task::Poll; | |||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::drop::OnDrop; | use embassy_hal_common::drop::OnDrop; | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::interrupt::{Interrupt, InterruptExt}; | use crate::interrupt::{Interrupt, InterruptExt}; | ||||||
| use crate::ppi::{Event, Task}; | use crate::ppi::{Event, Task}; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| pub(crate) mod sealed { | pub(crate) mod sealed { | ||||||
|  |  | ||||||
| @@ -28,7 +28,7 @@ pub(crate) mod sealed { | |||||||
|     pub trait TimerType {} |     pub trait TimerType {} | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Instance: Unborrow<Target = Self> + sealed::Instance + 'static + Send { | pub trait Instance: Peripheral<P = Self> + sealed::Instance + 'static + Send { | ||||||
|     type Interrupt: Interrupt; |     type Interrupt: Interrupt; | ||||||
| } | } | ||||||
| pub trait ExtendedInstance: Instance + sealed::ExtendedInstance {} | pub trait ExtendedInstance: Instance + sealed::ExtendedInstance {} | ||||||
| @@ -99,11 +99,8 @@ pub struct Timer<'d, T: Instance, I: TimerType = NotAwaitable> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance> Timer<'d, T, Awaitable> { | impl<'d, T: Instance> Timer<'d, T, Awaitable> { | ||||||
|     pub fn new_awaitable( |     pub fn new_awaitable(timer: impl Peripheral<P = T> + 'd, irq: impl Peripheral<P = T::Interrupt> + 'd) -> Self { | ||||||
|         timer: impl Unborrow<Target = T> + 'd, |         into_ref!(irq); | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |  | ||||||
|     ) -> Self { |  | ||||||
|         unborrow!(irq); |  | ||||||
|  |  | ||||||
|         irq.set_handler(Self::on_interrupt); |         irq.set_handler(Self::on_interrupt); | ||||||
|         irq.unpend(); |         irq.unpend(); | ||||||
| @@ -117,7 +114,7 @@ impl<'d, T: Instance> Timer<'d, T, NotAwaitable> { | |||||||
|     /// |     /// | ||||||
|     /// This can be useful for triggering tasks via PPI |     /// This can be useful for triggering tasks via PPI | ||||||
|     /// `Uarte` uses this internally. |     /// `Uarte` uses this internally. | ||||||
|     pub fn new(timer: impl Unborrow<Target = T> + 'd) -> Self { |     pub fn new(timer: impl Peripheral<P = T> + 'd) -> Self { | ||||||
|         Self::new_irqless(timer) |         Self::new_irqless(timer) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -126,7 +123,7 @@ impl<'d, T: Instance, I: TimerType> Timer<'d, T, I> { | |||||||
|     /// Create a `Timer` without an interrupt, meaning `Cc::wait` won't work. |     /// Create a `Timer` without an interrupt, meaning `Cc::wait` won't work. | ||||||
|     /// |     /// | ||||||
|     /// This is used by the public constructors. |     /// This is used by the public constructors. | ||||||
|     fn new_irqless(_timer: impl Unborrow<Target = T> + 'd) -> Self { |     fn new_irqless(_timer: impl Peripheral<P = T> + 'd) -> Self { | ||||||
|         let regs = T::regs(); |         let regs = T::regs(); | ||||||
|  |  | ||||||
|         let mut this = Self { phantom: PhantomData }; |         let mut this = Self { phantom: PhantomData }; | ||||||
|   | |||||||
| @@ -16,14 +16,14 @@ use core::task::Poll; | |||||||
| use embassy::time::{Duration, Instant}; | use embassy::time::{Duration, Instant}; | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_embedded_hal::SetConfig; | use embassy_embedded_hal::SetConfig; | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::chip::{EASY_DMA_SIZE, FORCE_COPY_BUFFER_SIZE}; | use crate::chip::{EASY_DMA_SIZE, FORCE_COPY_BUFFER_SIZE}; | ||||||
| use crate::gpio::Pin as GpioPin; | use crate::gpio::Pin as GpioPin; | ||||||
| use crate::interrupt::{Interrupt, InterruptExt}; | use crate::interrupt::{Interrupt, InterruptExt}; | ||||||
| use crate::util::{slice_in_ram, slice_in_ram_or}; | use crate::util::{slice_in_ram, slice_in_ram_or}; | ||||||
| use crate::{gpio, pac, Unborrow}; | use crate::{gpio, pac, Peripheral}; | ||||||
|  |  | ||||||
| #[derive(Clone, Copy)] | #[derive(Clone, Copy)] | ||||||
| pub enum Frequency { | pub enum Frequency { | ||||||
| @@ -80,13 +80,13 @@ pub struct Twim<'d, T: Instance> { | |||||||
|  |  | ||||||
| impl<'d, T: Instance> Twim<'d, T> { | impl<'d, T: Instance> Twim<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         _twim: impl Unborrow<Target = T> + 'd, |         _twim: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         sda: impl Unborrow<Target = impl GpioPin> + 'd, |         sda: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         scl: impl Unborrow<Target = impl GpioPin> + 'd, |         scl: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq, sda, scl); |         into_ref!(irq, sda, scl); | ||||||
|  |  | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
|  |  | ||||||
| @@ -707,7 +707,7 @@ pub(crate) mod sealed { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Instance: Unborrow<Target = Self> + sealed::Instance + 'static { | pub trait Instance: Peripheral<P = Self> + sealed::Instance + 'static { | ||||||
|     type Interrupt: Interrupt; |     type Interrupt: Interrupt; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ use core::sync::atomic::{compiler_fence, Ordering}; | |||||||
| use core::task::Poll; | use core::task::Poll; | ||||||
|  |  | ||||||
| use embassy_hal_common::drop::OnDrop; | use embassy_hal_common::drop::OnDrop; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
| use pac::uarte0::RegisterBlock; | use pac::uarte0::RegisterBlock; | ||||||
| // Re-export SVD variants to allow user to directly set values. | // Re-export SVD variants to allow user to directly set values. | ||||||
| @@ -31,7 +31,7 @@ use crate::interrupt::{Interrupt, InterruptExt}; | |||||||
| use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task}; | use crate::ppi::{AnyConfigurableChannel, ConfigurableChannel, Event, Ppi, Task}; | ||||||
| use crate::timer::{Frequency, Instance as TimerInstance, Timer}; | use crate::timer::{Frequency, Instance as TimerInstance, Timer}; | ||||||
| use crate::util::slice_in_ram_or; | use crate::util::slice_in_ram_or; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| #[derive(Clone)] | #[derive(Clone)] | ||||||
| #[non_exhaustive] | #[non_exhaustive] | ||||||
| @@ -83,40 +83,40 @@ pub struct UarteRx<'d, T: Instance> { | |||||||
| impl<'d, T: Instance> Uarte<'d, T> { | impl<'d, T: Instance> Uarte<'d, T> { | ||||||
|     /// Create a new UARTE without hardware flow control |     /// Create a new UARTE without hardware flow control | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         uarte: impl Unborrow<Target = T> + 'd, |         uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         rxd: impl Unborrow<Target = impl GpioPin> + 'd, |         rxd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         txd: impl Unborrow<Target = impl GpioPin> + 'd, |         txd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(rxd, txd); |         into_degraded_ref!(rxd, txd); | ||||||
|         Self::new_inner(uarte, irq, rxd, txd, None, None, config) |         Self::new_inner(uarte, irq, rxd, txd, None, None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a new UARTE with hardware flow control (RTS/CTS) |     /// Create a new UARTE with hardware flow control (RTS/CTS) | ||||||
|     pub fn new_with_rtscts( |     pub fn new_with_rtscts( | ||||||
|         uarte: impl Unborrow<Target = T> + 'd, |         uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         rxd: impl Unborrow<Target = impl GpioPin> + 'd, |         rxd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         txd: impl Unborrow<Target = impl GpioPin> + 'd, |         txd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         cts: impl Unborrow<Target = impl GpioPin> + 'd, |         cts: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         rts: impl Unborrow<Target = impl GpioPin> + 'd, |         rts: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(rxd, txd, cts, rts); |         into_degraded_ref!(rxd, txd, cts, rts); | ||||||
|         Self::new_inner(uarte, irq, rxd, txd, Some(cts), Some(rts), config) |         Self::new_inner(uarte, irq, rxd, txd, Some(cts), Some(rts), config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         _uarte: impl Unborrow<Target = T> + 'd, |         _uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         rxd: Unborrowed<'d, AnyPin>, |         rxd: PeripheralRef<'d, AnyPin>, | ||||||
|         txd: Unborrowed<'d, AnyPin>, |         txd: PeripheralRef<'d, AnyPin>, | ||||||
|         cts: Option<Unborrowed<'d, AnyPin>>, |         cts: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         rts: Option<Unborrowed<'d, AnyPin>>, |         rts: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
|  |  | ||||||
| @@ -237,35 +237,35 @@ fn configure(r: &RegisterBlock, config: Config, hardware_flow_control: bool) { | |||||||
| impl<'d, T: Instance> UarteTx<'d, T> { | impl<'d, T: Instance> UarteTx<'d, T> { | ||||||
|     /// Create a new tx-only UARTE without hardware flow control |     /// Create a new tx-only UARTE without hardware flow control | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         uarte: impl Unborrow<Target = T> + 'd, |         uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         txd: impl Unborrow<Target = impl GpioPin> + 'd, |         txd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(txd); |         into_degraded_ref!(txd); | ||||||
|         Self::new_inner(uarte, irq, txd, None, config) |         Self::new_inner(uarte, irq, txd, None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a new tx-only UARTE with hardware flow control (RTS/CTS) |     /// Create a new tx-only UARTE with hardware flow control (RTS/CTS) | ||||||
|     pub fn new_with_rtscts( |     pub fn new_with_rtscts( | ||||||
|         uarte: impl Unborrow<Target = T> + 'd, |         uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         txd: impl Unborrow<Target = impl GpioPin> + 'd, |         txd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         cts: impl Unborrow<Target = impl GpioPin> + 'd, |         cts: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(txd, cts); |         into_degraded_ref!(txd, cts); | ||||||
|         Self::new_inner(uarte, irq, txd, Some(cts), config) |         Self::new_inner(uarte, irq, txd, Some(cts), config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         _uarte: impl Unborrow<Target = T> + 'd, |         _uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         txd: Unborrowed<'d, AnyPin>, |         txd: PeripheralRef<'d, AnyPin>, | ||||||
|         cts: Option<Unborrowed<'d, AnyPin>>, |         cts: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
|  |  | ||||||
| @@ -429,35 +429,35 @@ impl<'a, T: Instance> Drop for UarteTx<'a, T> { | |||||||
| impl<'d, T: Instance> UarteRx<'d, T> { | impl<'d, T: Instance> UarteRx<'d, T> { | ||||||
|     /// Create a new rx-only UARTE without hardware flow control |     /// Create a new rx-only UARTE without hardware flow control | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         uarte: impl Unborrow<Target = T> + 'd, |         uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         rxd: impl Unborrow<Target = impl GpioPin> + 'd, |         rxd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(rxd); |         into_degraded_ref!(rxd); | ||||||
|         Self::new_inner(uarte, irq, rxd, None, config) |         Self::new_inner(uarte, irq, rxd, None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a new rx-only UARTE with hardware flow control (RTS/CTS) |     /// Create a new rx-only UARTE with hardware flow control (RTS/CTS) | ||||||
|     pub fn new_with_rtscts( |     pub fn new_with_rtscts( | ||||||
|         uarte: impl Unborrow<Target = T> + 'd, |         uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         rxd: impl Unborrow<Target = impl GpioPin> + 'd, |         rxd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         rts: impl Unborrow<Target = impl GpioPin> + 'd, |         rts: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(rxd, rts); |         into_degraded_ref!(rxd, rts); | ||||||
|         Self::new_inner(uarte, irq, rxd, Some(rts), config) |         Self::new_inner(uarte, irq, rxd, Some(rts), config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         _uarte: impl Unborrow<Target = T> + 'd, |         _uarte: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         rxd: Unborrowed<'d, AnyPin>, |         rxd: PeripheralRef<'d, AnyPin>, | ||||||
|         rts: Option<Unborrowed<'d, AnyPin>>, |         rts: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
|  |  | ||||||
| @@ -668,33 +668,33 @@ pub struct UarteWithIdle<'d, U: Instance, T: TimerInstance> { | |||||||
| impl<'d, U: Instance, T: TimerInstance> UarteWithIdle<'d, U, T> { | impl<'d, U: Instance, T: TimerInstance> UarteWithIdle<'d, U, T> { | ||||||
|     /// Create a new UARTE without hardware flow control |     /// Create a new UARTE without hardware flow control | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         uarte: impl Unborrow<Target = U> + 'd, |         uarte: impl Peripheral<P = U> + 'd, | ||||||
|         timer: impl Unborrow<Target = T> + 'd, |         timer: impl Peripheral<P = T> + 'd, | ||||||
|         ppi_ch1: impl Unborrow<Target = impl ConfigurableChannel + 'd> + 'd, |         ppi_ch1: impl Peripheral<P = impl ConfigurableChannel + 'd> + 'd, | ||||||
|         ppi_ch2: impl Unborrow<Target = impl ConfigurableChannel + 'd> + 'd, |         ppi_ch2: impl Peripheral<P = impl ConfigurableChannel + 'd> + 'd, | ||||||
|         irq: impl Unborrow<Target = U::Interrupt> + 'd, |         irq: impl Peripheral<P = U::Interrupt> + 'd, | ||||||
|         rxd: impl Unborrow<Target = impl GpioPin> + 'd, |         rxd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         txd: impl Unborrow<Target = impl GpioPin> + 'd, |         txd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(rxd, txd); |         into_degraded_ref!(rxd, txd); | ||||||
|         Self::new_inner(uarte, timer, ppi_ch1, ppi_ch2, irq, rxd, txd, None, None, config) |         Self::new_inner(uarte, timer, ppi_ch1, ppi_ch2, irq, rxd, txd, None, None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a new UARTE with hardware flow control (RTS/CTS) |     /// Create a new UARTE with hardware flow control (RTS/CTS) | ||||||
|     pub fn new_with_rtscts( |     pub fn new_with_rtscts( | ||||||
|         uarte: impl Unborrow<Target = U> + 'd, |         uarte: impl Peripheral<P = U> + 'd, | ||||||
|         timer: impl Unborrow<Target = T> + 'd, |         timer: impl Peripheral<P = T> + 'd, | ||||||
|         ppi_ch1: impl Unborrow<Target = impl ConfigurableChannel + 'd> + 'd, |         ppi_ch1: impl Peripheral<P = impl ConfigurableChannel + 'd> + 'd, | ||||||
|         ppi_ch2: impl Unborrow<Target = impl ConfigurableChannel + 'd> + 'd, |         ppi_ch2: impl Peripheral<P = impl ConfigurableChannel + 'd> + 'd, | ||||||
|         irq: impl Unborrow<Target = U::Interrupt> + 'd, |         irq: impl Peripheral<P = U::Interrupt> + 'd, | ||||||
|         rxd: impl Unborrow<Target = impl GpioPin> + 'd, |         rxd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         txd: impl Unborrow<Target = impl GpioPin> + 'd, |         txd: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         cts: impl Unborrow<Target = impl GpioPin> + 'd, |         cts: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         rts: impl Unborrow<Target = impl GpioPin> + 'd, |         rts: impl Peripheral<P = impl GpioPin> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(rxd, txd, cts, rts); |         into_degraded_ref!(rxd, txd, cts, rts); | ||||||
|         Self::new_inner( |         Self::new_inner( | ||||||
|             uarte, |             uarte, | ||||||
|             timer, |             timer, | ||||||
| @@ -710,15 +710,15 @@ impl<'d, U: Instance, T: TimerInstance> UarteWithIdle<'d, U, T> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         uarte: impl Unborrow<Target = U> + 'd, |         uarte: impl Peripheral<P = U> + 'd, | ||||||
|         timer: impl Unborrow<Target = T> + 'd, |         timer: impl Peripheral<P = T> + 'd, | ||||||
|         ppi_ch1: impl Unborrow<Target = impl ConfigurableChannel + 'd> + 'd, |         ppi_ch1: impl Peripheral<P = impl ConfigurableChannel + 'd> + 'd, | ||||||
|         ppi_ch2: impl Unborrow<Target = impl ConfigurableChannel + 'd> + 'd, |         ppi_ch2: impl Peripheral<P = impl ConfigurableChannel + 'd> + 'd, | ||||||
|         irq: impl Unborrow<Target = U::Interrupt> + 'd, |         irq: impl Peripheral<P = U::Interrupt> + 'd, | ||||||
|         rxd: Unborrowed<'d, AnyPin>, |         rxd: PeripheralRef<'d, AnyPin>, | ||||||
|         txd: Unborrowed<'d, AnyPin>, |         txd: PeripheralRef<'d, AnyPin>, | ||||||
|         cts: Option<Unborrowed<'d, AnyPin>>, |         cts: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         rts: Option<Unborrowed<'d, AnyPin>>, |         rts: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         let baudrate = config.baudrate; |         let baudrate = config.baudrate; | ||||||
| @@ -726,7 +726,7 @@ impl<'d, U: Instance, T: TimerInstance> UarteWithIdle<'d, U, T> { | |||||||
|  |  | ||||||
|         let mut timer = Timer::new(timer); |         let mut timer = Timer::new(timer); | ||||||
|  |  | ||||||
|         unborrow!(ppi_ch1, ppi_ch2); |         into_ref!(ppi_ch1, ppi_ch2); | ||||||
|  |  | ||||||
|         let r = U::regs(); |         let r = U::regs(); | ||||||
|  |  | ||||||
| @@ -939,7 +939,7 @@ pub(crate) mod sealed { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Instance: Unborrow<Target = Self> + sealed::Instance + 'static + Send { | pub trait Instance: Peripheral<P = Self> + sealed::Instance + 'static + Send { | ||||||
|     type Interrupt: Interrupt; |     type Interrupt: Interrupt; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ use core::task::Poll; | |||||||
|  |  | ||||||
| use cortex_m::peripheral::NVIC; | use cortex_m::peripheral::NVIC; | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| pub use embassy_usb; | pub use embassy_usb; | ||||||
| use embassy_usb::driver::{self, EndpointError, Event, Unsupported}; | use embassy_usb::driver::{self, EndpointError, Event, Unsupported}; | ||||||
| use embassy_usb::types::{EndpointAddress, EndpointInfo, EndpointType, UsbDirection}; | use embassy_usb::types::{EndpointAddress, EndpointInfo, EndpointType, UsbDirection}; | ||||||
| @@ -17,7 +17,7 @@ use pac::usbd::RegisterBlock; | |||||||
|  |  | ||||||
| use crate::interrupt::{Interrupt, InterruptExt}; | use crate::interrupt::{Interrupt, InterruptExt}; | ||||||
| use crate::util::slice_in_ram; | use crate::util::slice_in_ram; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| const NEW_AW: AtomicWaker = AtomicWaker::new(); | const NEW_AW: AtomicWaker = AtomicWaker::new(); | ||||||
| static BUS_WAKER: AtomicWaker = NEW_AW; | static BUS_WAKER: AtomicWaker = NEW_AW; | ||||||
| @@ -166,12 +166,8 @@ impl UsbSupply for SignalledSupply { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance, P: UsbSupply> Driver<'d, T, P> { | impl<'d, T: Instance, P: UsbSupply> Driver<'d, T, P> { | ||||||
|     pub fn new( |     pub fn new(_usb: impl Peripheral<P = T> + 'd, irq: impl Peripheral<P = T::Interrupt> + 'd, usb_supply: P) -> Self { | ||||||
|         _usb: impl Unborrow<Target = T> + 'd, |         into_ref!(irq); | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |  | ||||||
|         usb_supply: P, |  | ||||||
|     ) -> Self { |  | ||||||
|         unborrow!(irq); |  | ||||||
|         irq.set_handler(Self::on_interrupt); |         irq.set_handler(Self::on_interrupt); | ||||||
|         irq.unpend(); |         irq.unpend(); | ||||||
|         irq.enable(); |         irq.enable(); | ||||||
| @@ -950,7 +946,7 @@ pub(crate) mod sealed { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Instance: Unborrow<Target = Self> + sealed::Instance + 'static + Send { | pub trait Instance: Peripheral<P = Self> + sealed::Instance + 'static + Send { | ||||||
|     type Interrupt: Interrupt; |     type Interrupt: Interrupt; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,11 +5,11 @@ use core::task::{Context, Poll}; | |||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_cortex_m::interrupt::{Interrupt, InterruptExt}; | use embassy_cortex_m::interrupt::{Interrupt, InterruptExt}; | ||||||
| use embassy_hal_common::{impl_unborrow, unborrow, Unborrowed}; | use embassy_hal_common::{impl_peripheral, into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::pac::common::{Reg, RW}; | use crate::pac::common::{Reg, RW}; | ||||||
| use crate::pac::SIO; | use crate::pac::SIO; | ||||||
| use crate::{interrupt, pac, peripherals, Unborrow}; | use crate::{interrupt, pac, peripherals, Peripheral}; | ||||||
|  |  | ||||||
| const PIN_COUNT: usize = 30; | const PIN_COUNT: usize = 30; | ||||||
| const NEW_AW: AtomicWaker = AtomicWaker::new(); | const NEW_AW: AtomicWaker = AtomicWaker::new(); | ||||||
| @@ -61,7 +61,7 @@ pub struct Input<'d, T: Pin> { | |||||||
|  |  | ||||||
| impl<'d, T: Pin> Input<'d, T> { | impl<'d, T: Pin> Input<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, pull: Pull) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, pull: Pull) -> Self { | ||||||
|         let mut pin = Flex::new(pin); |         let mut pin = Flex::new(pin); | ||||||
|         pin.set_as_input(); |         pin.set_as_input(); | ||||||
|         pin.set_pull(pull); |         pin.set_pull(pull); | ||||||
| @@ -177,13 +177,13 @@ unsafe fn IO_IRQ_BANK0() { | |||||||
| } | } | ||||||
|  |  | ||||||
| struct InputFuture<'a, T: Pin> { | struct InputFuture<'a, T: Pin> { | ||||||
|     pin: Unborrowed<'a, T>, |     pin: PeripheralRef<'a, T>, | ||||||
|     level: InterruptTrigger, |     level: InterruptTrigger, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Pin> InputFuture<'d, T> { | impl<'d, T: Pin> InputFuture<'d, T> { | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, level: InterruptTrigger) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, level: InterruptTrigger) -> Self { | ||||||
|         unborrow!(pin); |         into_ref!(pin); | ||||||
|         unsafe { |         unsafe { | ||||||
|             let irq = interrupt::IO_IRQ_BANK0::steal(); |             let irq = interrupt::IO_IRQ_BANK0::steal(); | ||||||
|             irq.disable(); |             irq.disable(); | ||||||
| @@ -290,7 +290,7 @@ pub struct Output<'d, T: Pin> { | |||||||
|  |  | ||||||
| impl<'d, T: Pin> Output<'d, T> { | impl<'d, T: Pin> Output<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, initial_output: Level) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, initial_output: Level) -> Self { | ||||||
|         let mut pin = Flex::new(pin); |         let mut pin = Flex::new(pin); | ||||||
|         match initial_output { |         match initial_output { | ||||||
|             Level::High => pin.set_high(), |             Level::High => pin.set_high(), | ||||||
| @@ -351,7 +351,7 @@ pub struct OutputOpenDrain<'d, T: Pin> { | |||||||
|  |  | ||||||
| impl<'d, T: Pin> OutputOpenDrain<'d, T> { | impl<'d, T: Pin> OutputOpenDrain<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, initial_output: Level) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, initial_output: Level) -> Self { | ||||||
|         let mut pin = Flex::new(pin); |         let mut pin = Flex::new(pin); | ||||||
|         pin.set_low(); |         pin.set_low(); | ||||||
|         match initial_output { |         match initial_output { | ||||||
| @@ -415,13 +415,13 @@ impl<'d, T: Pin> OutputOpenDrain<'d, T> { | |||||||
| /// set while not in output mode, so the pin's level will be 'remembered' when it is not in output | /// set while not in output mode, so the pin's level will be 'remembered' when it is not in output | ||||||
| /// mode. | /// mode. | ||||||
| pub struct Flex<'d, T: Pin> { | pub struct Flex<'d, T: Pin> { | ||||||
|     pin: Unborrowed<'d, T>, |     pin: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Pin> Flex<'d, T> { | impl<'d, T: Pin> Flex<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd) -> Self { | ||||||
|         unborrow!(pin); |         into_ref!(pin); | ||||||
|  |  | ||||||
|         unsafe { |         unsafe { | ||||||
|             pin.pad_ctrl().write(|w| { |             pin.pad_ctrl().write(|w| { | ||||||
| @@ -647,7 +647,7 @@ pub(crate) mod sealed { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Pin: Unborrow<Target = Self> + sealed::Pin { | pub trait Pin: Peripheral<P = Self> + sealed::Pin { | ||||||
|     /// Degrade to a generic pin struct |     /// Degrade to a generic pin struct | ||||||
|     fn degrade(self) -> AnyPin { |     fn degrade(self) -> AnyPin { | ||||||
|         AnyPin { |         AnyPin { | ||||||
| @@ -661,22 +661,22 @@ pub struct AnyPin { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl AnyPin { | impl AnyPin { | ||||||
|     pub(crate) fn unborrow_and_degrade<'a>(pin: impl Unborrow<Target = impl Pin + 'a> + 'a) -> Unborrowed<'a, Self> { |     pub(crate) fn into_degraded_ref<'a>(pin: impl Peripheral<P = impl Pin + 'a> + 'a) -> PeripheralRef<'a, Self> { | ||||||
|         Unborrowed::new(AnyPin { |         PeripheralRef::new(AnyPin { | ||||||
|             pin_bank: pin.unborrow().pin_bank(), |             pin_bank: pin.into_ref().pin_bank(), | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| macro_rules! unborrow_and_degrade { | macro_rules! into_degraded_ref { | ||||||
|     ($($name:ident),*) => { |     ($($name:ident),*) => { | ||||||
|         $( |         $( | ||||||
|             let $name = $crate::gpio::AnyPin::unborrow_and_degrade($name); |             let $name = $crate::gpio::AnyPin::into_degraded_ref($name); | ||||||
|         )* |         )* | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
| impl_unborrow!(AnyPin); | impl_peripheral!(AnyPin); | ||||||
|  |  | ||||||
| impl Pin for AnyPin {} | impl Pin for AnyPin {} | ||||||
| impl sealed::Pin for AnyPin { | impl sealed::Pin for AnyPin { | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ mod reset; | |||||||
| // Reexports | // Reexports | ||||||
|  |  | ||||||
| pub use embassy_cortex_m::executor; | pub use embassy_cortex_m::executor; | ||||||
| pub use embassy_hal_common::{unborrow, Unborrow, Unborrowed}; | pub use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | ||||||
| pub use embassy_macros::cortex_m_interrupt as interrupt; | pub use embassy_macros::cortex_m_interrupt as interrupt; | ||||||
| #[cfg(feature = "unstable-pac")] | #[cfg(feature = "unstable-pac")] | ||||||
| pub use rp2040_pac2 as pac; | pub use rp2040_pac2 as pac; | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| use embassy_embedded_hal::SetConfig; | use embassy_embedded_hal::SetConfig; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| pub use embedded_hal_02::spi::{Phase, Polarity}; | pub use embedded_hal_02::spi::{Phase, Polarity}; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::Pin as _; | use crate::gpio::sealed::Pin as _; | ||||||
| use crate::gpio::{AnyPin, Pin as GpioPin}; | use crate::gpio::{AnyPin, Pin as GpioPin}; | ||||||
| use crate::{pac, peripherals, Unborrow}; | use crate::{pac, peripherals, Peripheral}; | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | ||||||
| #[cfg_attr(feature = "defmt", derive(defmt::Format))] | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | ||||||
| @@ -31,7 +31,7 @@ impl Default for Config { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub struct Spi<'d, T: Instance> { | pub struct Spi<'d, T: Instance> { | ||||||
|     inner: Unborrowed<'d, T>, |     inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| fn div_roundup(a: u32, b: u32) -> u32 { | fn div_roundup(a: u32, b: u32) -> u32 { | ||||||
| @@ -59,45 +59,45 @@ fn calc_prescs(freq: u32) -> (u8, u8) { | |||||||
|  |  | ||||||
| impl<'d, T: Instance> Spi<'d, T> { | impl<'d, T: Instance> Spi<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         inner: impl Unborrow<Target = T> + 'd, |         inner: impl Peripheral<P = T> + 'd, | ||||||
|         clk: impl Unborrow<Target = impl ClkPin<T> + 'd> + 'd, |         clk: impl Peripheral<P = impl ClkPin<T> + 'd> + 'd, | ||||||
|         mosi: impl Unborrow<Target = impl MosiPin<T> + 'd> + 'd, |         mosi: impl Peripheral<P = impl MosiPin<T> + 'd> + 'd, | ||||||
|         miso: impl Unborrow<Target = impl MisoPin<T> + 'd> + 'd, |         miso: impl Peripheral<P = impl MisoPin<T> + 'd> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(clk, mosi, miso); |         into_degraded_ref!(clk, mosi, miso); | ||||||
|         Self::new_inner(inner, Some(clk), Some(mosi), Some(miso), None, config) |         Self::new_inner(inner, Some(clk), Some(mosi), Some(miso), None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_txonly( |     pub fn new_txonly( | ||||||
|         inner: impl Unborrow<Target = T> + 'd, |         inner: impl Peripheral<P = T> + 'd, | ||||||
|         clk: impl Unborrow<Target = impl ClkPin<T> + 'd> + 'd, |         clk: impl Peripheral<P = impl ClkPin<T> + 'd> + 'd, | ||||||
|         mosi: impl Unborrow<Target = impl MosiPin<T> + 'd> + 'd, |         mosi: impl Peripheral<P = impl MosiPin<T> + 'd> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(clk, mosi); |         into_degraded_ref!(clk, mosi); | ||||||
|         Self::new_inner(inner, Some(clk), Some(mosi), None, None, config) |         Self::new_inner(inner, Some(clk), Some(mosi), None, None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_rxonly( |     pub fn new_rxonly( | ||||||
|         inner: impl Unborrow<Target = T> + 'd, |         inner: impl Peripheral<P = T> + 'd, | ||||||
|         clk: impl Unborrow<Target = impl ClkPin<T> + 'd> + 'd, |         clk: impl Peripheral<P = impl ClkPin<T> + 'd> + 'd, | ||||||
|         miso: impl Unborrow<Target = impl MisoPin<T> + 'd> + 'd, |         miso: impl Peripheral<P = impl MisoPin<T> + 'd> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow_and_degrade!(clk, miso); |         into_degraded_ref!(clk, miso); | ||||||
|         Self::new_inner(inner, Some(clk), None, Some(miso), None, config) |         Self::new_inner(inner, Some(clk), None, Some(miso), None, config) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         inner: impl Unborrow<Target = T> + 'd, |         inner: impl Peripheral<P = T> + 'd, | ||||||
|         clk: Option<Unborrowed<'d, AnyPin>>, |         clk: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         mosi: Option<Unborrowed<'d, AnyPin>>, |         mosi: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         miso: Option<Unborrowed<'d, AnyPin>>, |         miso: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         cs: Option<Unborrowed<'d, AnyPin>>, |         cs: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(inner); |         into_ref!(inner); | ||||||
|  |  | ||||||
|         unsafe { |         unsafe { | ||||||
|             let p = inner.regs(); |             let p = inner.regs(); | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use gpio::Pin; | use gpio::Pin; | ||||||
|  |  | ||||||
| use crate::{gpio, pac, peripherals, Unborrow}; | use crate::{gpio, pac, peripherals, Peripheral}; | ||||||
|  |  | ||||||
| #[non_exhaustive] | #[non_exhaustive] | ||||||
| pub struct Config { | pub struct Config { | ||||||
| @@ -21,19 +21,19 @@ impl Default for Config { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub struct Uart<'d, T: Instance> { | pub struct Uart<'d, T: Instance> { | ||||||
|     inner: Unborrowed<'d, T>, |     inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance> Uart<'d, T> { | impl<'d, T: Instance> Uart<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         inner: impl Unborrow<Target = T> + 'd, |         inner: impl Peripheral<P = T> + 'd, | ||||||
|         tx: impl Unborrow<Target = impl TxPin<T>> + 'd, |         tx: impl Peripheral<P = impl TxPin<T>> + 'd, | ||||||
|         rx: impl Unborrow<Target = impl RxPin<T>> + 'd, |         rx: impl Peripheral<P = impl RxPin<T>> + 'd, | ||||||
|         cts: impl Unborrow<Target = impl CtsPin<T>> + 'd, |         cts: impl Peripheral<P = impl CtsPin<T>> + 'd, | ||||||
|         rts: impl Unborrow<Target = impl RtsPin<T>> + 'd, |         rts: impl Peripheral<P = impl RtsPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(inner, tx, rx, cts, rts); |         into_ref!(inner, tx, rx, cts, rts); | ||||||
|  |  | ||||||
|         unsafe { |         unsafe { | ||||||
|             let p = inner.regs(); |             let p = inner.regs(); | ||||||
|   | |||||||
| @@ -1,12 +1,12 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| use embedded_hal_02::blocking::delay::DelayUs; | use embedded_hal_02::blocking::delay::DelayUs; | ||||||
|  |  | ||||||
| use crate::adc::{AdcPin, Instance}; | use crate::adc::{AdcPin, Instance}; | ||||||
| use crate::rcc::get_freqs; | use crate::rcc::get_freqs; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| pub const VDDA_CALIB_MV: u32 = 3300; | pub const VDDA_CALIB_MV: u32 = 3300; | ||||||
| pub const ADC_MAX: u32 = (1 << 12) - 1; | pub const ADC_MAX: u32 = (1 << 12) - 1; | ||||||
| @@ -91,8 +91,8 @@ pub struct Adc<'d, T: Instance> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance> Adc<'d, T> { | impl<'d, T: Instance> Adc<'d, T> { | ||||||
|     pub fn new(_peri: impl Unborrow<Target = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { |     pub fn new(_peri: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { | ||||||
|         unborrow!(_peri); |         into_ref!(_peri); | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         T::reset(); |         T::reset(); | ||||||
|         unsafe { |         unsafe { | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| use embedded_hal_02::blocking::delay::DelayUs; | use embedded_hal_02::blocking::delay::DelayUs; | ||||||
|  |  | ||||||
| use crate::adc::{AdcPin, Instance}; | use crate::adc::{AdcPin, Instance}; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| pub const VDDA_CALIB_MV: u32 = 3000; | pub const VDDA_CALIB_MV: u32 = 3000; | ||||||
|  |  | ||||||
| @@ -159,8 +159,8 @@ impl<'d, T> Adc<'d, T> | |||||||
| where | where | ||||||
|     T: Instance, |     T: Instance, | ||||||
| { | { | ||||||
|     pub fn new(_peri: impl Unborrow<Target = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { |     pub fn new(_peri: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { | ||||||
|         unborrow!(_peri); |         into_ref!(_peri); | ||||||
|         enable(); |         enable(); | ||||||
|  |  | ||||||
|         let presc = unsafe { Prescaler::from_pclk2(crate::rcc::get_freqs().apb2) }; |         let presc = unsafe { Prescaler::from_pclk2(crate::rcc::get_freqs().apb2) }; | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| use embedded_hal_02::blocking::delay::DelayUs; | use embedded_hal_02::blocking::delay::DelayUs; | ||||||
|  |  | ||||||
| use crate::adc::{AdcPin, Instance}; | use crate::adc::{AdcPin, Instance}; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| pub const VDDA_CALIB_MV: u32 = 3000; | pub const VDDA_CALIB_MV: u32 = 3000; | ||||||
|  |  | ||||||
| @@ -208,8 +208,8 @@ pub struct Adc<'d, T: Instance> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance> Adc<'d, T> { | impl<'d, T: Instance> Adc<'d, T> { | ||||||
|     pub fn new(_peri: impl Unborrow<Target = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { |     pub fn new(_peri: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u32>) -> Self { | ||||||
|         unborrow!(_peri); |         into_ref!(_peri); | ||||||
|         enable(); |         enable(); | ||||||
|         unsafe { |         unsafe { | ||||||
|             T::regs().cr().modify(|reg| { |             T::regs().cr().modify(|reg| { | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ use pac::adccommon::vals::Presc; | |||||||
|  |  | ||||||
| use super::{AdcPin, Instance}; | use super::{AdcPin, Instance}; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| pub enum Resolution { | pub enum Resolution { | ||||||
|     SixteenBit, |     SixteenBit, | ||||||
| @@ -322,8 +322,8 @@ pub struct Adc<'d, T: Instance> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance + crate::rcc::RccPeripheral> Adc<'d, T> { | impl<'d, T: Instance + crate::rcc::RccPeripheral> Adc<'d, T> { | ||||||
|     pub fn new(_peri: impl Unborrow<Target = T> + 'd, delay: &mut impl DelayUs<u16>) -> Self { |     pub fn new(_peri: impl Peripheral<P = T> + 'd, delay: &mut impl DelayUs<u16>) -> Self { | ||||||
|         embassy_hal_common::unborrow!(_peri); |         embassy_hal_common::into_ref!(_peri); | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         T::reset(); |         T::reset(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| use core::ops::{Deref, DerefMut}; | use core::ops::{Deref, DerefMut}; | ||||||
|  |  | ||||||
| pub use bxcan; | pub use bxcan; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::AFType; | use crate::gpio::sealed::AFType; | ||||||
| use crate::rcc::RccPeripheral; | use crate::rcc::RccPeripheral; | ||||||
| use crate::{peripherals, Unborrow}; | use crate::{peripherals, Peripheral}; | ||||||
|  |  | ||||||
| pub struct Can<'d, T: Instance> { | pub struct Can<'d, T: Instance> { | ||||||
|     can: bxcan::Can<BxcanInstance<'d, T>>, |     can: bxcan::Can<BxcanInstance<'d, T>>, | ||||||
| @@ -13,11 +13,11 @@ pub struct Can<'d, T: Instance> { | |||||||
|  |  | ||||||
| impl<'d, T: Instance> Can<'d, T> { | impl<'d, T: Instance> Can<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         rx: impl Unborrow<Target = impl RxPin<T>> + 'd, |         rx: impl Peripheral<P = impl RxPin<T>> + 'd, | ||||||
|         tx: impl Unborrow<Target = impl TxPin<T>> + 'd, |         tx: impl Peripheral<P = impl TxPin<T>> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, rx, tx); |         into_ref!(peri, rx, tx); | ||||||
|  |  | ||||||
|         unsafe { |         unsafe { | ||||||
|             rx.set_as_af(rx.af_num(), AFType::Input); |             rx.set_as_af(rx.af_num(), AFType::Input); | ||||||
| @@ -66,7 +66,7 @@ pub(crate) mod sealed { | |||||||
|  |  | ||||||
| pub trait Instance: sealed::Instance + RccPeripheral {} | pub trait Instance: sealed::Instance + RccPeripheral {} | ||||||
|  |  | ||||||
| pub struct BxcanInstance<'a, T>(Unborrowed<'a, T>); | pub struct BxcanInstance<'a, T>(PeripheralRef<'a, T>); | ||||||
|  |  | ||||||
| unsafe impl<'d, T: Instance> bxcan::Instance for BxcanInstance<'d, T> { | unsafe impl<'d, T: Instance> bxcan::Instance for BxcanInstance<'d, T> { | ||||||
|     const REGISTERS: *mut bxcan::RegisterBlock = T::REGISTERS; |     const REGISTERS: *mut bxcan::RegisterBlock = T::REGISTERS; | ||||||
|   | |||||||
| @@ -1,25 +1,25 @@ | |||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::pac::CRC as PAC_CRC; | use crate::pac::CRC as PAC_CRC; | ||||||
| use crate::peripherals::CRC; | use crate::peripherals::CRC; | ||||||
| use crate::rcc::sealed::RccPeripheral; | use crate::rcc::sealed::RccPeripheral; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| pub struct Crc<'d> { | pub struct Crc<'d> { | ||||||
|     _peri: Unborrowed<'d, CRC>, |     _peri: PeripheralRef<'d, CRC>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d> Crc<'d> { | impl<'d> Crc<'d> { | ||||||
|     /// Instantiates the CRC32 peripheral and initializes it to default values. |     /// Instantiates the CRC32 peripheral and initializes it to default values. | ||||||
|     pub fn new(peripheral: impl Unborrow<Target = CRC> + 'd) -> Self { |     pub fn new(peripheral: impl Peripheral<P = CRC> + 'd) -> Self { | ||||||
|         unborrow!(peripheral); |         into_ref!(peripheral); | ||||||
|  |  | ||||||
|         // Note: enable and reset come from RccPeripheral. |         // Note: enable and reset come from RccPeripheral. | ||||||
|         // enable CRC clock in RCC. |         // enable CRC clock in RCC. | ||||||
|         CRC::enable(); |         CRC::enable(); | ||||||
|         // Reset CRC to default values. |         // Reset CRC to default values. | ||||||
|         CRC::reset(); |         CRC::reset(); | ||||||
|         // Unborrow the peripheral |         // Peripheral the peripheral | ||||||
|         let mut instance = Self { _peri: peripheral }; |         let mut instance = Self { _peri: peripheral }; | ||||||
|         instance.reset(); |         instance.reset(); | ||||||
|         instance |         instance | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::pac::crc::vals; | use crate::pac::crc::vals; | ||||||
| use crate::pac::CRC as PAC_CRC; | use crate::pac::CRC as PAC_CRC; | ||||||
| use crate::peripherals::CRC; | use crate::peripherals::CRC; | ||||||
| use crate::rcc::sealed::RccPeripheral; | use crate::rcc::sealed::RccPeripheral; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| pub struct Crc<'d> { | pub struct Crc<'d> { | ||||||
|     _peripheral: Unborrowed<'d, CRC>, |     _peripheral: PeripheralRef<'d, CRC>, | ||||||
|     _config: Config, |     _config: Config, | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -67,13 +67,13 @@ pub enum PolySize { | |||||||
|  |  | ||||||
| impl<'d> Crc<'d> { | impl<'d> Crc<'d> { | ||||||
|     /// Instantiates the CRC32 peripheral and initializes it to default values. |     /// Instantiates the CRC32 peripheral and initializes it to default values. | ||||||
|     pub fn new(peripheral: impl Unborrow<Target = CRC> + 'd, config: Config) -> Self { |     pub fn new(peripheral: impl Peripheral<P = CRC> + 'd, config: Config) -> Self { | ||||||
|         // Note: enable and reset come from RccPeripheral. |         // Note: enable and reset come from RccPeripheral. | ||||||
|         // enable CRC clock in RCC. |         // enable CRC clock in RCC. | ||||||
|         CRC::enable(); |         CRC::enable(); | ||||||
|         // Reset CRC to default values. |         // Reset CRC to default values. | ||||||
|         CRC::reset(); |         CRC::reset(); | ||||||
|         unborrow!(peripheral); |         into_ref!(peripheral); | ||||||
|         let mut instance = Self { |         let mut instance = Self { | ||||||
|             _peripheral: peripheral, |             _peripheral: peripheral, | ||||||
|             _config: config, |             _config: config, | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::dac::{DacPin, Instance}; | use crate::dac::{DacPin, Instance}; | ||||||
| use crate::pac::dac; | use crate::pac::dac; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| #[derive(Debug, Copy, Clone, Eq, PartialEq)] | #[derive(Debug, Copy, Clone, Eq, PartialEq)] | ||||||
| #[cfg_attr(feature = "defmt", derive(defmt::Format))] | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | ||||||
| @@ -88,7 +88,7 @@ pub enum Value { | |||||||
|  |  | ||||||
| pub struct Dac<'d, T: Instance> { | pub struct Dac<'d, T: Instance> { | ||||||
|     channels: u8, |     channels: u8, | ||||||
|     _peri: Unborrowed<'d, T>, |     _peri: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| macro_rules! enable { | macro_rules! enable { | ||||||
| @@ -100,21 +100,21 @@ macro_rules! enable { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance> Dac<'d, T> { | impl<'d, T: Instance> Dac<'d, T> { | ||||||
|     pub fn new_1ch(peri: impl Unborrow<Target = T> + 'd, _ch1: impl Unborrow<Target = impl DacPin<T, 1>> + 'd) -> Self { |     pub fn new_1ch(peri: impl Peripheral<P = T> + 'd, _ch1: impl Peripheral<P = impl DacPin<T, 1>> + 'd) -> Self { | ||||||
|         unborrow!(peri); |         into_ref!(peri); | ||||||
|         Self::new_inner(peri, 1) |         Self::new_inner(peri, 1) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_2ch( |     pub fn new_2ch( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         _ch1: impl Unborrow<Target = impl DacPin<T, 1>> + 'd, |         _ch1: impl Peripheral<P = impl DacPin<T, 1>> + 'd, | ||||||
|         _ch2: impl Unborrow<Target = impl DacPin<T, 2>> + 'd, |         _ch2: impl Peripheral<P = impl DacPin<T, 2>> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri); |         into_ref!(peri); | ||||||
|         Self::new_inner(peri, 2) |         Self::new_inner(peri, 2) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner(peri: Unborrowed<'d, T>, channels: u8) -> Self { |     fn new_inner(peri: PeripheralRef<'d, T>, channels: u8) -> Self { | ||||||
|         unsafe { |         unsafe { | ||||||
|             // Sadly we cannot use `RccPeripheral::enable` since devices are quite inconsistent DAC clock |             // Sadly we cannot use `RccPeripheral::enable` since devices are quite inconsistent DAC clock | ||||||
|             // configuration. |             // configuration. | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| use core::task::Poll; | use core::task::Poll; | ||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::AFType; | use crate::gpio::sealed::AFType; | ||||||
| use crate::gpio::Speed; | use crate::gpio::Speed; | ||||||
| use crate::interrupt::{Interrupt, InterruptExt}; | use crate::interrupt::{Interrupt, InterruptExt}; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| /// The level on the VSync pin when the data is not valid on the parallel interface. | /// The level on the VSync pin when the data is not valid on the parallel interface. | ||||||
| #[derive(Clone, Copy, PartialEq)] | #[derive(Clone, Copy, PartialEq)] | ||||||
| @@ -69,7 +69,7 @@ impl Default for Config { | |||||||
|  |  | ||||||
| macro_rules! config_pins { | macro_rules! config_pins { | ||||||
|     ($($pin:ident),*) => { |     ($($pin:ident),*) => { | ||||||
|         unborrow!($($pin),*); |         into_ref!($($pin),*); | ||||||
|         // NOTE(unsafe) Exclusive access to the registers |         // NOTE(unsafe) Exclusive access to the registers | ||||||
|         critical_section::with(|_| unsafe { |         critical_section::with(|_| unsafe { | ||||||
|             $( |             $( | ||||||
| @@ -81,8 +81,8 @@ macro_rules! config_pins { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub struct Dcmi<'d, T: Instance, Dma: FrameDma<T>> { | pub struct Dcmi<'d, T: Instance, Dma: FrameDma<T>> { | ||||||
|     inner: Unborrowed<'d, T>, |     inner: PeripheralRef<'d, T>, | ||||||
|     dma: Unborrowed<'d, Dma>, |     dma: PeripheralRef<'d, Dma>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T, Dma> Dcmi<'d, T, Dma> | impl<'d, T, Dma> Dcmi<'d, T, Dma> | ||||||
| @@ -91,23 +91,23 @@ where | |||||||
|     Dma: FrameDma<T>, |     Dma: FrameDma<T>, | ||||||
| { | { | ||||||
|     pub fn new_8bit( |     pub fn new_8bit( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         d4: impl Unborrow<Target = impl D4Pin<T>> + 'd, |         d4: impl Peripheral<P = impl D4Pin<T>> + 'd, | ||||||
|         d5: impl Unborrow<Target = impl D5Pin<T>> + 'd, |         d5: impl Peripheral<P = impl D5Pin<T>> + 'd, | ||||||
|         d6: impl Unborrow<Target = impl D6Pin<T>> + 'd, |         d6: impl Peripheral<P = impl D6Pin<T>> + 'd, | ||||||
|         d7: impl Unborrow<Target = impl D7Pin<T>> + 'd, |         d7: impl Peripheral<P = impl D7Pin<T>> + 'd, | ||||||
|         v_sync: impl Unborrow<Target = impl VSyncPin<T>> + 'd, |         v_sync: impl Peripheral<P = impl VSyncPin<T>> + 'd, | ||||||
|         h_sync: impl Unborrow<Target = impl HSyncPin<T>> + 'd, |         h_sync: impl Peripheral<P = impl HSyncPin<T>> + 'd, | ||||||
|         pixclk: impl Unborrow<Target = impl PixClkPin<T>> + 'd, |         pixclk: impl Peripheral<P = impl PixClkPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, dma, irq); |         into_ref!(peri, dma, irq); | ||||||
|         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7); |         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7); | ||||||
|         config_pins!(v_sync, h_sync, pixclk); |         config_pins!(v_sync, h_sync, pixclk); | ||||||
|  |  | ||||||
| @@ -115,25 +115,25 @@ where | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_10bit( |     pub fn new_10bit( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         d4: impl Unborrow<Target = impl D4Pin<T>> + 'd, |         d4: impl Peripheral<P = impl D4Pin<T>> + 'd, | ||||||
|         d5: impl Unborrow<Target = impl D5Pin<T>> + 'd, |         d5: impl Peripheral<P = impl D5Pin<T>> + 'd, | ||||||
|         d6: impl Unborrow<Target = impl D6Pin<T>> + 'd, |         d6: impl Peripheral<P = impl D6Pin<T>> + 'd, | ||||||
|         d7: impl Unborrow<Target = impl D7Pin<T>> + 'd, |         d7: impl Peripheral<P = impl D7Pin<T>> + 'd, | ||||||
|         d8: impl Unborrow<Target = impl D8Pin<T>> + 'd, |         d8: impl Peripheral<P = impl D8Pin<T>> + 'd, | ||||||
|         d9: impl Unborrow<Target = impl D9Pin<T>> + 'd, |         d9: impl Peripheral<P = impl D9Pin<T>> + 'd, | ||||||
|         v_sync: impl Unborrow<Target = impl VSyncPin<T>> + 'd, |         v_sync: impl Peripheral<P = impl VSyncPin<T>> + 'd, | ||||||
|         h_sync: impl Unborrow<Target = impl HSyncPin<T>> + 'd, |         h_sync: impl Peripheral<P = impl HSyncPin<T>> + 'd, | ||||||
|         pixclk: impl Unborrow<Target = impl PixClkPin<T>> + 'd, |         pixclk: impl Peripheral<P = impl PixClkPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, dma, irq); |         into_ref!(peri, dma, irq); | ||||||
|         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9); |         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9); | ||||||
|         config_pins!(v_sync, h_sync, pixclk); |         config_pins!(v_sync, h_sync, pixclk); | ||||||
|  |  | ||||||
| @@ -141,27 +141,27 @@ where | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_12bit( |     pub fn new_12bit( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         d4: impl Unborrow<Target = impl D4Pin<T>> + 'd, |         d4: impl Peripheral<P = impl D4Pin<T>> + 'd, | ||||||
|         d5: impl Unborrow<Target = impl D5Pin<T>> + 'd, |         d5: impl Peripheral<P = impl D5Pin<T>> + 'd, | ||||||
|         d6: impl Unborrow<Target = impl D6Pin<T>> + 'd, |         d6: impl Peripheral<P = impl D6Pin<T>> + 'd, | ||||||
|         d7: impl Unborrow<Target = impl D7Pin<T>> + 'd, |         d7: impl Peripheral<P = impl D7Pin<T>> + 'd, | ||||||
|         d8: impl Unborrow<Target = impl D8Pin<T>> + 'd, |         d8: impl Peripheral<P = impl D8Pin<T>> + 'd, | ||||||
|         d9: impl Unborrow<Target = impl D9Pin<T>> + 'd, |         d9: impl Peripheral<P = impl D9Pin<T>> + 'd, | ||||||
|         d10: impl Unborrow<Target = impl D10Pin<T>> + 'd, |         d10: impl Peripheral<P = impl D10Pin<T>> + 'd, | ||||||
|         d11: impl Unborrow<Target = impl D11Pin<T>> + 'd, |         d11: impl Peripheral<P = impl D11Pin<T>> + 'd, | ||||||
|         v_sync: impl Unborrow<Target = impl VSyncPin<T>> + 'd, |         v_sync: impl Peripheral<P = impl VSyncPin<T>> + 'd, | ||||||
|         h_sync: impl Unborrow<Target = impl HSyncPin<T>> + 'd, |         h_sync: impl Peripheral<P = impl HSyncPin<T>> + 'd, | ||||||
|         pixclk: impl Unborrow<Target = impl PixClkPin<T>> + 'd, |         pixclk: impl Peripheral<P = impl PixClkPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, dma, irq); |         into_ref!(peri, dma, irq); | ||||||
|         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11); |         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11); | ||||||
|         config_pins!(v_sync, h_sync, pixclk); |         config_pins!(v_sync, h_sync, pixclk); | ||||||
|  |  | ||||||
| @@ -169,29 +169,29 @@ where | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_14bit( |     pub fn new_14bit( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         d4: impl Unborrow<Target = impl D4Pin<T>> + 'd, |         d4: impl Peripheral<P = impl D4Pin<T>> + 'd, | ||||||
|         d5: impl Unborrow<Target = impl D5Pin<T>> + 'd, |         d5: impl Peripheral<P = impl D5Pin<T>> + 'd, | ||||||
|         d6: impl Unborrow<Target = impl D6Pin<T>> + 'd, |         d6: impl Peripheral<P = impl D6Pin<T>> + 'd, | ||||||
|         d7: impl Unborrow<Target = impl D7Pin<T>> + 'd, |         d7: impl Peripheral<P = impl D7Pin<T>> + 'd, | ||||||
|         d8: impl Unborrow<Target = impl D8Pin<T>> + 'd, |         d8: impl Peripheral<P = impl D8Pin<T>> + 'd, | ||||||
|         d9: impl Unborrow<Target = impl D9Pin<T>> + 'd, |         d9: impl Peripheral<P = impl D9Pin<T>> + 'd, | ||||||
|         d10: impl Unborrow<Target = impl D10Pin<T>> + 'd, |         d10: impl Peripheral<P = impl D10Pin<T>> + 'd, | ||||||
|         d11: impl Unborrow<Target = impl D11Pin<T>> + 'd, |         d11: impl Peripheral<P = impl D11Pin<T>> + 'd, | ||||||
|         d12: impl Unborrow<Target = impl D12Pin<T>> + 'd, |         d12: impl Peripheral<P = impl D12Pin<T>> + 'd, | ||||||
|         d13: impl Unborrow<Target = impl D13Pin<T>> + 'd, |         d13: impl Peripheral<P = impl D13Pin<T>> + 'd, | ||||||
|         v_sync: impl Unborrow<Target = impl VSyncPin<T>> + 'd, |         v_sync: impl Peripheral<P = impl VSyncPin<T>> + 'd, | ||||||
|         h_sync: impl Unborrow<Target = impl HSyncPin<T>> + 'd, |         h_sync: impl Peripheral<P = impl HSyncPin<T>> + 'd, | ||||||
|         pixclk: impl Unborrow<Target = impl PixClkPin<T>> + 'd, |         pixclk: impl Peripheral<P = impl PixClkPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, dma, irq); |         into_ref!(peri, dma, irq); | ||||||
|         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13); |         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13); | ||||||
|         config_pins!(v_sync, h_sync, pixclk); |         config_pins!(v_sync, h_sync, pixclk); | ||||||
|  |  | ||||||
| @@ -199,21 +199,21 @@ where | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_es_8bit( |     pub fn new_es_8bit( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         d4: impl Unborrow<Target = impl D4Pin<T>> + 'd, |         d4: impl Peripheral<P = impl D4Pin<T>> + 'd, | ||||||
|         d5: impl Unborrow<Target = impl D5Pin<T>> + 'd, |         d5: impl Peripheral<P = impl D5Pin<T>> + 'd, | ||||||
|         d6: impl Unborrow<Target = impl D6Pin<T>> + 'd, |         d6: impl Peripheral<P = impl D6Pin<T>> + 'd, | ||||||
|         d7: impl Unborrow<Target = impl D7Pin<T>> + 'd, |         d7: impl Peripheral<P = impl D7Pin<T>> + 'd, | ||||||
|         pixclk: impl Unborrow<Target = impl PixClkPin<T>> + 'd, |         pixclk: impl Peripheral<P = impl PixClkPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, dma, irq); |         into_ref!(peri, dma, irq); | ||||||
|         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7); |         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7); | ||||||
|         config_pins!(pixclk); |         config_pins!(pixclk); | ||||||
|  |  | ||||||
| @@ -221,23 +221,23 @@ where | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_es_10bit( |     pub fn new_es_10bit( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         d4: impl Unborrow<Target = impl D4Pin<T>> + 'd, |         d4: impl Peripheral<P = impl D4Pin<T>> + 'd, | ||||||
|         d5: impl Unborrow<Target = impl D5Pin<T>> + 'd, |         d5: impl Peripheral<P = impl D5Pin<T>> + 'd, | ||||||
|         d6: impl Unborrow<Target = impl D6Pin<T>> + 'd, |         d6: impl Peripheral<P = impl D6Pin<T>> + 'd, | ||||||
|         d7: impl Unborrow<Target = impl D7Pin<T>> + 'd, |         d7: impl Peripheral<P = impl D7Pin<T>> + 'd, | ||||||
|         d8: impl Unborrow<Target = impl D8Pin<T>> + 'd, |         d8: impl Peripheral<P = impl D8Pin<T>> + 'd, | ||||||
|         d9: impl Unborrow<Target = impl D9Pin<T>> + 'd, |         d9: impl Peripheral<P = impl D9Pin<T>> + 'd, | ||||||
|         pixclk: impl Unborrow<Target = impl PixClkPin<T>> + 'd, |         pixclk: impl Peripheral<P = impl PixClkPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, dma, irq); |         into_ref!(peri, dma, irq); | ||||||
|         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9); |         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9); | ||||||
|         config_pins!(pixclk); |         config_pins!(pixclk); | ||||||
|  |  | ||||||
| @@ -245,25 +245,25 @@ where | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_es_12bit( |     pub fn new_es_12bit( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         d4: impl Unborrow<Target = impl D4Pin<T>> + 'd, |         d4: impl Peripheral<P = impl D4Pin<T>> + 'd, | ||||||
|         d5: impl Unborrow<Target = impl D5Pin<T>> + 'd, |         d5: impl Peripheral<P = impl D5Pin<T>> + 'd, | ||||||
|         d6: impl Unborrow<Target = impl D6Pin<T>> + 'd, |         d6: impl Peripheral<P = impl D6Pin<T>> + 'd, | ||||||
|         d7: impl Unborrow<Target = impl D7Pin<T>> + 'd, |         d7: impl Peripheral<P = impl D7Pin<T>> + 'd, | ||||||
|         d8: impl Unborrow<Target = impl D8Pin<T>> + 'd, |         d8: impl Peripheral<P = impl D8Pin<T>> + 'd, | ||||||
|         d9: impl Unborrow<Target = impl D9Pin<T>> + 'd, |         d9: impl Peripheral<P = impl D9Pin<T>> + 'd, | ||||||
|         d10: impl Unborrow<Target = impl D10Pin<T>> + 'd, |         d10: impl Peripheral<P = impl D10Pin<T>> + 'd, | ||||||
|         d11: impl Unborrow<Target = impl D11Pin<T>> + 'd, |         d11: impl Peripheral<P = impl D11Pin<T>> + 'd, | ||||||
|         pixclk: impl Unborrow<Target = impl PixClkPin<T>> + 'd, |         pixclk: impl Peripheral<P = impl PixClkPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, dma, irq); |         into_ref!(peri, dma, irq); | ||||||
|         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11); |         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11); | ||||||
|         config_pins!(pixclk); |         config_pins!(pixclk); | ||||||
|  |  | ||||||
| @@ -271,27 +271,27 @@ where | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_es_14bit( |     pub fn new_es_14bit( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         d4: impl Unborrow<Target = impl D4Pin<T>> + 'd, |         d4: impl Peripheral<P = impl D4Pin<T>> + 'd, | ||||||
|         d5: impl Unborrow<Target = impl D5Pin<T>> + 'd, |         d5: impl Peripheral<P = impl D5Pin<T>> + 'd, | ||||||
|         d6: impl Unborrow<Target = impl D6Pin<T>> + 'd, |         d6: impl Peripheral<P = impl D6Pin<T>> + 'd, | ||||||
|         d7: impl Unborrow<Target = impl D7Pin<T>> + 'd, |         d7: impl Peripheral<P = impl D7Pin<T>> + 'd, | ||||||
|         d8: impl Unborrow<Target = impl D8Pin<T>> + 'd, |         d8: impl Peripheral<P = impl D8Pin<T>> + 'd, | ||||||
|         d9: impl Unborrow<Target = impl D9Pin<T>> + 'd, |         d9: impl Peripheral<P = impl D9Pin<T>> + 'd, | ||||||
|         d10: impl Unborrow<Target = impl D10Pin<T>> + 'd, |         d10: impl Peripheral<P = impl D10Pin<T>> + 'd, | ||||||
|         d11: impl Unborrow<Target = impl D11Pin<T>> + 'd, |         d11: impl Peripheral<P = impl D11Pin<T>> + 'd, | ||||||
|         d12: impl Unborrow<Target = impl D12Pin<T>> + 'd, |         d12: impl Peripheral<P = impl D12Pin<T>> + 'd, | ||||||
|         d13: impl Unborrow<Target = impl D13Pin<T>> + 'd, |         d13: impl Peripheral<P = impl D13Pin<T>> + 'd, | ||||||
|         pixclk: impl Unborrow<Target = impl PixClkPin<T>> + 'd, |         pixclk: impl Peripheral<P = impl PixClkPin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, dma, irq); |         into_ref!(peri, dma, irq); | ||||||
|         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13); |         config_pins!(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13); | ||||||
|         config_pins!(pixclk); |         config_pins!(pixclk); | ||||||
|  |  | ||||||
| @@ -299,9 +299,9 @@ where | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         peri: Unborrowed<'d, T>, |         peri: PeripheralRef<'d, T>, | ||||||
|         dma: Unborrowed<'d, Dma>, |         dma: PeripheralRef<'d, Dma>, | ||||||
|         irq: Unborrowed<'d, T::Interrupt>, |         irq: PeripheralRef<'d, T::Interrupt>, | ||||||
|         config: Config, |         config: Config, | ||||||
|         use_embedded_synchronization: bool, |         use_embedded_synchronization: bool, | ||||||
|         edm: u8, |         edm: u8, | ||||||
|   | |||||||
| @@ -12,11 +12,11 @@ use core::mem; | |||||||
| use core::pin::Pin; | use core::pin::Pin; | ||||||
| use core::task::{Context, Poll, Waker}; | use core::task::{Context, Poll, Waker}; | ||||||
|  |  | ||||||
| use embassy_hal_common::{impl_unborrow, unborrow}; | use embassy_hal_common::{impl_peripheral, into_ref}; | ||||||
|  |  | ||||||
| #[cfg(dmamux)] | #[cfg(dmamux)] | ||||||
| pub use self::dmamux::*; | pub use self::dmamux::*; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| #[cfg(feature = "unstable-pac")] | #[cfg(feature = "unstable-pac")] | ||||||
| pub mod low_level { | pub mod low_level { | ||||||
| @@ -206,19 +206,19 @@ impl Default for TransferOptions { | |||||||
| } | } | ||||||
|  |  | ||||||
| mod transfers { | mod transfers { | ||||||
|     use embassy_hal_common::Unborrowed; |     use embassy_hal_common::PeripheralRef; | ||||||
|  |  | ||||||
|     use super::*; |     use super::*; | ||||||
|  |  | ||||||
|     #[allow(unused)] |     #[allow(unused)] | ||||||
|     pub fn read<'a, W: Word>( |     pub fn read<'a, W: Word>( | ||||||
|         channel: impl Unborrow<Target = impl Channel> + 'a, |         channel: impl Peripheral<P = impl Channel> + 'a, | ||||||
|         request: Request, |         request: Request, | ||||||
|         reg_addr: *mut W, |         reg_addr: *mut W, | ||||||
|         buf: &'a mut [W], |         buf: &'a mut [W], | ||||||
|     ) -> impl Future<Output = ()> + 'a { |     ) -> impl Future<Output = ()> + 'a { | ||||||
|         assert!(buf.len() > 0 && buf.len() <= 0xFFFF); |         assert!(buf.len() > 0 && buf.len() <= 0xFFFF); | ||||||
|         unborrow!(channel); |         into_ref!(channel); | ||||||
|  |  | ||||||
|         unsafe { channel.start_read::<W>(request, reg_addr, buf, Default::default()) }; |         unsafe { channel.start_read::<W>(request, reg_addr, buf, Default::default()) }; | ||||||
|  |  | ||||||
| @@ -227,13 +227,13 @@ mod transfers { | |||||||
|  |  | ||||||
|     #[allow(unused)] |     #[allow(unused)] | ||||||
|     pub fn write<'a, W: Word>( |     pub fn write<'a, W: Word>( | ||||||
|         channel: impl Unborrow<Target = impl Channel> + 'a, |         channel: impl Peripheral<P = impl Channel> + 'a, | ||||||
|         request: Request, |         request: Request, | ||||||
|         buf: &'a [W], |         buf: &'a [W], | ||||||
|         reg_addr: *mut W, |         reg_addr: *mut W, | ||||||
|     ) -> impl Future<Output = ()> + 'a { |     ) -> impl Future<Output = ()> + 'a { | ||||||
|         assert!(buf.len() > 0 && buf.len() <= 0xFFFF); |         assert!(buf.len() > 0 && buf.len() <= 0xFFFF); | ||||||
|         unborrow!(channel); |         into_ref!(channel); | ||||||
|  |  | ||||||
|         unsafe { channel.start_write::<W>(request, buf, reg_addr, Default::default()) }; |         unsafe { channel.start_write::<W>(request, buf, reg_addr, Default::default()) }; | ||||||
|  |  | ||||||
| @@ -242,13 +242,13 @@ mod transfers { | |||||||
|  |  | ||||||
|     #[allow(unused)] |     #[allow(unused)] | ||||||
|     pub fn write_repeated<'a, W: Word>( |     pub fn write_repeated<'a, W: Word>( | ||||||
|         channel: impl Unborrow<Target = impl Channel> + 'a, |         channel: impl Peripheral<P = impl Channel> + 'a, | ||||||
|         request: Request, |         request: Request, | ||||||
|         repeated: W, |         repeated: W, | ||||||
|         count: usize, |         count: usize, | ||||||
|         reg_addr: *mut W, |         reg_addr: *mut W, | ||||||
|     ) -> impl Future<Output = ()> + 'a { |     ) -> impl Future<Output = ()> + 'a { | ||||||
|         unborrow!(channel); |         into_ref!(channel); | ||||||
|  |  | ||||||
|         unsafe { channel.start_write_repeated::<W>(request, repeated, count, reg_addr, Default::default()) }; |         unsafe { channel.start_write_repeated::<W>(request, repeated, count, reg_addr, Default::default()) }; | ||||||
|  |  | ||||||
| @@ -256,12 +256,12 @@ mod transfers { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub(crate) struct Transfer<'a, C: Channel> { |     pub(crate) struct Transfer<'a, C: Channel> { | ||||||
|         channel: Unborrowed<'a, C>, |         channel: PeripheralRef<'a, C>, | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     impl<'a, C: Channel> Transfer<'a, C> { |     impl<'a, C: Channel> Transfer<'a, C> { | ||||||
|         pub(crate) fn new(channel: impl Unborrow<Target = C> + 'a) -> Self { |         pub(crate) fn new(channel: impl Peripheral<P = C> + 'a) -> Self { | ||||||
|             unborrow!(channel); |             into_ref!(channel); | ||||||
|             Self { channel } |             Self { channel } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -287,11 +287,11 @@ mod transfers { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| pub trait Channel: sealed::Channel + Unborrow<Target = Self> + 'static {} | pub trait Channel: sealed::Channel + Peripheral<P = Self> + 'static {} | ||||||
|  |  | ||||||
| pub struct NoDma; | pub struct NoDma; | ||||||
|  |  | ||||||
| impl_unborrow!(NoDma); | impl_peripheral!(NoDma); | ||||||
|  |  | ||||||
| // safety: must be called only once at startup | // safety: must be called only once at startup | ||||||
| pub(crate) unsafe fn init() { | pub(crate) unsafe fn init() { | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ use core::task::Waker; | |||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_cortex_m::peripheral::{PeripheralMutex, PeripheralState, StateStorage}; | use embassy_cortex_m::peripheral::{PeripheralMutex, PeripheralState, StateStorage}; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use embassy_net::{Device, DeviceCapabilities, LinkState, PacketBuf, MTU}; | use embassy_net::{Device, DeviceCapabilities, LinkState, PacketBuf, MTU}; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::{AFType, Pin as __GpioPin}; | use crate::gpio::sealed::{AFType, Pin as __GpioPin}; | ||||||
| @@ -16,7 +16,7 @@ use crate::pac::AFIO; | |||||||
| #[cfg(any(eth_v1b, eth_v1c))] | #[cfg(any(eth_v1b, eth_v1c))] | ||||||
| use crate::pac::SYSCFG; | use crate::pac::SYSCFG; | ||||||
| use crate::pac::{ETH, RCC}; | use crate::pac::{ETH, RCC}; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| mod descriptors; | mod descriptors; | ||||||
| mod rx_desc; | mod rx_desc; | ||||||
| @@ -36,7 +36,7 @@ impl<'d, T: Instance, const TX: usize, const RX: usize> State<'d, T, TX, RX> { | |||||||
|  |  | ||||||
| pub struct Ethernet<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> { | pub struct Ethernet<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> { | ||||||
|     state: PeripheralMutex<'d, Inner<'d, T, TX, RX>>, |     state: PeripheralMutex<'d, Inner<'d, T, TX, RX>>, | ||||||
|     pins: [Unborrowed<'d, AnyPin>; 9], |     pins: [PeripheralRef<'d, AnyPin>; 9], | ||||||
|     _phy: P, |     _phy: P, | ||||||
|     clock_range: Cr, |     clock_range: Cr, | ||||||
|     phy_addr: u8, |     phy_addr: u8, | ||||||
| @@ -86,22 +86,22 @@ impl<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> Ethernet<'d, T, | |||||||
|     /// safety: the returned instance is not leak-safe |     /// safety: the returned instance is not leak-safe | ||||||
|     pub unsafe fn new( |     pub unsafe fn new( | ||||||
|         state: &'d mut State<'d, T, TX, RX>, |         state: &'d mut State<'d, T, TX, RX>, | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         interrupt: impl Unborrow<Target = crate::interrupt::ETH> + 'd, |         interrupt: impl Peripheral<P = crate::interrupt::ETH> + 'd, | ||||||
|         ref_clk: impl Unborrow<Target = impl RefClkPin<T>> + 'd, |         ref_clk: impl Peripheral<P = impl RefClkPin<T>> + 'd, | ||||||
|         mdio: impl Unborrow<Target = impl MDIOPin<T>> + 'd, |         mdio: impl Peripheral<P = impl MDIOPin<T>> + 'd, | ||||||
|         mdc: impl Unborrow<Target = impl MDCPin<T>> + 'd, |         mdc: impl Peripheral<P = impl MDCPin<T>> + 'd, | ||||||
|         crs: impl Unborrow<Target = impl CRSPin<T>> + 'd, |         crs: impl Peripheral<P = impl CRSPin<T>> + 'd, | ||||||
|         rx_d0: impl Unborrow<Target = impl RXD0Pin<T>> + 'd, |         rx_d0: impl Peripheral<P = impl RXD0Pin<T>> + 'd, | ||||||
|         rx_d1: impl Unborrow<Target = impl RXD1Pin<T>> + 'd, |         rx_d1: impl Peripheral<P = impl RXD1Pin<T>> + 'd, | ||||||
|         tx_d0: impl Unborrow<Target = impl TXD0Pin<T>> + 'd, |         tx_d0: impl Peripheral<P = impl TXD0Pin<T>> + 'd, | ||||||
|         tx_d1: impl Unborrow<Target = impl TXD1Pin<T>> + 'd, |         tx_d1: impl Peripheral<P = impl TXD1Pin<T>> + 'd, | ||||||
|         tx_en: impl Unborrow<Target = impl TXEnPin<T>> + 'd, |         tx_en: impl Peripheral<P = impl TXEnPin<T>> + 'd, | ||||||
|         phy: P, |         phy: P, | ||||||
|         mac_addr: [u8; 6], |         mac_addr: [u8; 6], | ||||||
|         phy_addr: u8, |         phy_addr: u8, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(interrupt, ref_clk, mdio, mdc, crs, rx_d0, rx_d1, tx_d0, tx_d1, tx_en); |         into_ref!(interrupt, ref_clk, mdio, mdc, crs, rx_d0, rx_d1, tx_d0, tx_d1, tx_en); | ||||||
|  |  | ||||||
|         // Enable the necessary Clocks |         // Enable the necessary Clocks | ||||||
|         // NOTE(unsafe) We have exclusive access to the registers |         // NOTE(unsafe) We have exclusive access to the registers | ||||||
| @@ -370,7 +370,7 @@ struct Inner<'d, T: Instance, const TX: usize, const RX: usize> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance, const TX: usize, const RX: usize> Inner<'d, T, TX, RX> { | impl<'d, T: Instance, const TX: usize, const RX: usize> Inner<'d, T, TX, RX> { | ||||||
|     pub fn new(_peri: impl Unborrow<Target = T> + 'd) -> Self { |     pub fn new(_peri: impl Peripheral<P = T> + 'd) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             _peri: PhantomData, |             _peri: PhantomData, | ||||||
|             desc_ring: DescriptorRing::new(), |             desc_ring: DescriptorRing::new(), | ||||||
|   | |||||||
| @@ -4,13 +4,13 @@ use core::task::Waker; | |||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_cortex_m::peripheral::{PeripheralMutex, PeripheralState, StateStorage}; | use embassy_cortex_m::peripheral::{PeripheralMutex, PeripheralState, StateStorage}; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use embassy_net::{Device, DeviceCapabilities, LinkState, PacketBuf, MTU}; | use embassy_net::{Device, DeviceCapabilities, LinkState, PacketBuf, MTU}; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::{AFType, Pin as _}; | use crate::gpio::sealed::{AFType, Pin as _}; | ||||||
| use crate::gpio::{AnyPin, Speed}; | use crate::gpio::{AnyPin, Speed}; | ||||||
| use crate::pac::{ETH, RCC, SYSCFG}; | use crate::pac::{ETH, RCC, SYSCFG}; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| mod descriptors; | mod descriptors; | ||||||
| use descriptors::DescriptorRing; | use descriptors::DescriptorRing; | ||||||
| @@ -25,7 +25,7 @@ impl<'d, T: Instance, const TX: usize, const RX: usize> State<'d, T, TX, RX> { | |||||||
| } | } | ||||||
| pub struct Ethernet<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> { | pub struct Ethernet<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> { | ||||||
|     state: PeripheralMutex<'d, Inner<'d, T, TX, RX>>, |     state: PeripheralMutex<'d, Inner<'d, T, TX, RX>>, | ||||||
|     pins: [Unborrowed<'d, AnyPin>; 9], |     pins: [PeripheralRef<'d, AnyPin>; 9], | ||||||
|     _phy: P, |     _phy: P, | ||||||
|     clock_range: u8, |     clock_range: u8, | ||||||
|     phy_addr: u8, |     phy_addr: u8, | ||||||
| @@ -48,22 +48,22 @@ impl<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> Ethernet<'d, T, | |||||||
|     /// safety: the returned instance is not leak-safe |     /// safety: the returned instance is not leak-safe | ||||||
|     pub unsafe fn new( |     pub unsafe fn new( | ||||||
|         state: &'d mut State<'d, T, TX, RX>, |         state: &'d mut State<'d, T, TX, RX>, | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         interrupt: impl Unborrow<Target = crate::interrupt::ETH> + 'd, |         interrupt: impl Peripheral<P = crate::interrupt::ETH> + 'd, | ||||||
|         ref_clk: impl Unborrow<Target = impl RefClkPin<T>> + 'd, |         ref_clk: impl Peripheral<P = impl RefClkPin<T>> + 'd, | ||||||
|         mdio: impl Unborrow<Target = impl MDIOPin<T>> + 'd, |         mdio: impl Peripheral<P = impl MDIOPin<T>> + 'd, | ||||||
|         mdc: impl Unborrow<Target = impl MDCPin<T>> + 'd, |         mdc: impl Peripheral<P = impl MDCPin<T>> + 'd, | ||||||
|         crs: impl Unborrow<Target = impl CRSPin<T>> + 'd, |         crs: impl Peripheral<P = impl CRSPin<T>> + 'd, | ||||||
|         rx_d0: impl Unborrow<Target = impl RXD0Pin<T>> + 'd, |         rx_d0: impl Peripheral<P = impl RXD0Pin<T>> + 'd, | ||||||
|         rx_d1: impl Unborrow<Target = impl RXD1Pin<T>> + 'd, |         rx_d1: impl Peripheral<P = impl RXD1Pin<T>> + 'd, | ||||||
|         tx_d0: impl Unborrow<Target = impl TXD0Pin<T>> + 'd, |         tx_d0: impl Peripheral<P = impl TXD0Pin<T>> + 'd, | ||||||
|         tx_d1: impl Unborrow<Target = impl TXD1Pin<T>> + 'd, |         tx_d1: impl Peripheral<P = impl TXD1Pin<T>> + 'd, | ||||||
|         tx_en: impl Unborrow<Target = impl TXEnPin<T>> + 'd, |         tx_en: impl Peripheral<P = impl TXEnPin<T>> + 'd, | ||||||
|         phy: P, |         phy: P, | ||||||
|         mac_addr: [u8; 6], |         mac_addr: [u8; 6], | ||||||
|         phy_addr: u8, |         phy_addr: u8, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(interrupt, ref_clk, mdio, mdc, crs, rx_d0, rx_d1, tx_d0, tx_d1, tx_en); |         into_ref!(interrupt, ref_clk, mdio, mdc, crs, rx_d0, rx_d1, tx_d0, tx_d1, tx_en); | ||||||
|  |  | ||||||
|         // Enable the necessary Clocks |         // Enable the necessary Clocks | ||||||
|         // NOTE(unsafe) We have exclusive access to the registers |         // NOTE(unsafe) We have exclusive access to the registers | ||||||
| @@ -316,7 +316,7 @@ struct Inner<'d, T: Instance, const TX: usize, const RX: usize> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance, const TX: usize, const RX: usize> Inner<'d, T, TX, RX> { | impl<'d, T: Instance, const TX: usize, const RX: usize> Inner<'d, T, TX, RX> { | ||||||
|     pub fn new(_peri: impl Unborrow<Target = T> + 'd) -> Self { |     pub fn new(_peri: impl Peripheral<P = T> + 'd) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             _peri: PhantomData, |             _peri: PhantomData, | ||||||
|             desc_ring: DescriptorRing::new(), |             desc_ring: DescriptorRing::new(), | ||||||
|   | |||||||
| @@ -4,12 +4,12 @@ use core::pin::Pin; | |||||||
| use core::task::{Context, Poll}; | use core::task::{Context, Poll}; | ||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::impl_unborrow; | use embassy_hal_common::impl_peripheral; | ||||||
|  |  | ||||||
| use crate::gpio::{AnyPin, Input, Pin as GpioPin}; | use crate::gpio::{AnyPin, Input, Pin as GpioPin}; | ||||||
| use crate::pac::exti::regs::Lines; | use crate::pac::exti::regs::Lines; | ||||||
| use crate::pac::EXTI; | use crate::pac::EXTI; | ||||||
| use crate::{interrupt, pac, peripherals, Unborrow}; | use crate::{interrupt, pac, peripherals, Peripheral}; | ||||||
|  |  | ||||||
| const EXTI_COUNT: usize = 16; | const EXTI_COUNT: usize = 16; | ||||||
| const NEW_AW: AtomicWaker = AtomicWaker::new(); | const NEW_AW: AtomicWaker = AtomicWaker::new(); | ||||||
| @@ -86,7 +86,7 @@ pub struct ExtiInput<'d, T: GpioPin> { | |||||||
| impl<'d, T: GpioPin> Unpin for ExtiInput<'d, T> {} | impl<'d, T: GpioPin> Unpin for ExtiInput<'d, T> {} | ||||||
|  |  | ||||||
| impl<'d, T: GpioPin> ExtiInput<'d, T> { | impl<'d, T: GpioPin> ExtiInput<'d, T> { | ||||||
|     pub fn new(pin: Input<'d, T>, _ch: impl Unborrow<Target = T::ExtiChannel> + 'd) -> Self { |     pub fn new(pin: Input<'d, T>, _ch: impl Peripheral<P = T::ExtiChannel> + 'd) -> Self { | ||||||
|         Self { pin } |         Self { pin } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -320,7 +320,7 @@ pub trait Channel: sealed::Channel + Sized { | |||||||
| pub struct AnyChannel { | pub struct AnyChannel { | ||||||
|     number: u8, |     number: u8, | ||||||
| } | } | ||||||
| impl_unborrow!(AnyChannel); | impl_peripheral!(AnyChannel); | ||||||
| impl sealed::Channel for AnyChannel {} | impl sealed::Channel for AnyChannel {} | ||||||
| impl Channel for AnyChannel { | impl Channel for AnyChannel { | ||||||
|     fn number(&self) -> usize { |     fn number(&self) -> usize { | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash}; | use embedded_storage::nor_flash::{ErrorType, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash}; | ||||||
|  |  | ||||||
| pub use crate::pac::{ERASE_SIZE, ERASE_VALUE, FLASH_BASE, FLASH_SIZE, WRITE_SIZE}; | pub use crate::pac::{ERASE_SIZE, ERASE_VALUE, FLASH_BASE, FLASH_SIZE, WRITE_SIZE}; | ||||||
| use crate::peripherals::FLASH; | use crate::peripherals::FLASH; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
| const FLASH_END: usize = FLASH_BASE + FLASH_SIZE; | const FLASH_END: usize = FLASH_BASE + FLASH_SIZE; | ||||||
|  |  | ||||||
| #[cfg_attr(any(flash_wl, flash_wb, flash_l0, flash_l1, flash_l4), path = "l.rs")] | #[cfg_attr(any(flash_wl, flash_wb, flash_l0, flash_l1, flash_l4), path = "l.rs")] | ||||||
| @@ -14,16 +14,16 @@ const FLASH_END: usize = FLASH_BASE + FLASH_SIZE; | |||||||
| mod family; | mod family; | ||||||
|  |  | ||||||
| pub struct Flash<'d> { | pub struct Flash<'d> { | ||||||
|     _inner: Unborrowed<'d, FLASH>, |     _inner: PeripheralRef<'d, FLASH>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d> Flash<'d> { | impl<'d> Flash<'d> { | ||||||
|     pub fn new(p: impl Unborrow<Target = FLASH> + 'd) -> Self { |     pub fn new(p: impl Peripheral<P = FLASH> + 'd) -> Self { | ||||||
|         unborrow!(p); |         into_ref!(p); | ||||||
|         Self { _inner: p } |         Self { _inner: p } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn unlock(p: impl Unborrow<Target = FLASH> + 'd) -> Self { |     pub fn unlock(p: impl Peripheral<P = FLASH> + 'd) -> Self { | ||||||
|         let flash = Self::new(p); |         let flash = Self::new(p); | ||||||
|  |  | ||||||
|         unsafe { family::unlock() }; |         unsafe { family::unlock() }; | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::AFType; | use crate::gpio::sealed::AFType; | ||||||
| use crate::gpio::{Pull, Speed}; | use crate::gpio::{Pull, Speed}; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| mod pins; | mod pins; | ||||||
| pub use pins::*; | pub use pins::*; | ||||||
| @@ -39,7 +39,7 @@ where | |||||||
|  |  | ||||||
| macro_rules! config_pins { | macro_rules! config_pins { | ||||||
|     ($($pin:ident),*) => { |     ($($pin:ident),*) => { | ||||||
|         unborrow!($($pin),*); |         into_ref!($($pin),*); | ||||||
|         $( |         $( | ||||||
|             $pin.set_as_af_pull($pin.af_num(), AFType::OutputPushPull, Pull::Up); |             $pin.set_as_af_pull($pin.af_num(), AFType::OutputPushPull, Pull::Up); | ||||||
|             $pin.set_speed(Speed::VeryHigh); |             $pin.set_speed(Speed::VeryHigh); | ||||||
| @@ -57,12 +57,12 @@ macro_rules! fmc_sdram_constructor { | |||||||
|         ctrl: [$(($ctrl_pin_name:ident: $ctrl_signal:ident)),*] |         ctrl: [$(($ctrl_pin_name:ident: $ctrl_signal:ident)),*] | ||||||
|     )) => { |     )) => { | ||||||
|         pub fn $name<CHIP: stm32_fmc::SdramChip>( |         pub fn $name<CHIP: stm32_fmc::SdramChip>( | ||||||
|             _instance: impl Unborrow<Target = T> + 'd, |             _instance: impl Peripheral<P = T> + 'd, | ||||||
|             $($addr_pin_name: impl Unborrow<Target = impl $addr_signal<T>> + 'd),*, |             $($addr_pin_name: impl Peripheral<P = impl $addr_signal<T>> + 'd),*, | ||||||
|             $($ba_pin_name: impl Unborrow<Target = impl $ba_signal<T>> + 'd),*, |             $($ba_pin_name: impl Peripheral<P = impl $ba_signal<T>> + 'd),*, | ||||||
|             $($d_pin_name: impl Unborrow<Target = impl $d_signal<T>> + 'd),*, |             $($d_pin_name: impl Peripheral<P = impl $d_signal<T>> + 'd),*, | ||||||
|             $($nbl_pin_name: impl Unborrow<Target = impl $nbl_signal<T>> + 'd),*, |             $($nbl_pin_name: impl Peripheral<P = impl $nbl_signal<T>> + 'd),*, | ||||||
|             $($ctrl_pin_name: impl Unborrow<Target = impl $ctrl_signal<T>> + 'd),*, |             $($ctrl_pin_name: impl Peripheral<P = impl $ctrl_signal<T>> + 'd),*, | ||||||
|             chip: CHIP |             chip: CHIP | ||||||
|         ) -> stm32_fmc::Sdram<Fmc<'d, T>, CHIP> { |         ) -> stm32_fmc::Sdram<Fmc<'d, T>, CHIP> { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| #![macro_use] | #![macro_use] | ||||||
| use core::convert::Infallible; | use core::convert::Infallible; | ||||||
|  |  | ||||||
| use embassy_hal_common::{impl_unborrow, unborrow, Unborrowed}; | use embassy_hal_common::{impl_peripheral, into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::pac::gpio::{self, vals}; | use crate::pac::gpio::{self, vals}; | ||||||
| use crate::{pac, peripherals, Unborrow}; | use crate::{pac, peripherals, Peripheral}; | ||||||
|  |  | ||||||
| /// GPIO flexible pin. | /// GPIO flexible pin. | ||||||
| /// | /// | ||||||
| @@ -12,7 +12,7 @@ use crate::{pac, peripherals, Unborrow}; | |||||||
| /// set while not in output mode, so the pin's level will be 'remembered' when it is not in output | /// set while not in output mode, so the pin's level will be 'remembered' when it is not in output | ||||||
| /// mode. | /// mode. | ||||||
| pub struct Flex<'d, T: Pin> { | pub struct Flex<'d, T: Pin> { | ||||||
|     pub(crate) pin: Unborrowed<'d, T>, |     pub(crate) pin: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Pin> Flex<'d, T> { | impl<'d, T: Pin> Flex<'d, T> { | ||||||
| @@ -22,8 +22,8 @@ impl<'d, T: Pin> Flex<'d, T> { | |||||||
|     /// before the pin is put into output mode. |     /// before the pin is put into output mode. | ||||||
|     /// |     /// | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd) -> Self { | ||||||
|         unborrow!(pin); |         into_ref!(pin); | ||||||
|         // Pin will be in disconnected state. |         // Pin will be in disconnected state. | ||||||
|         Self { pin } |         Self { pin } | ||||||
|     } |     } | ||||||
| @@ -280,7 +280,7 @@ pub struct Input<'d, T: Pin> { | |||||||
|  |  | ||||||
| impl<'d, T: Pin> Input<'d, T> { | impl<'d, T: Pin> Input<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, pull: Pull) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, pull: Pull) -> Self { | ||||||
|         let mut pin = Flex::new(pin); |         let mut pin = Flex::new(pin); | ||||||
|         pin.set_as_input(pull); |         pin.set_as_input(pull); | ||||||
|         Self { pin } |         Self { pin } | ||||||
| @@ -335,7 +335,7 @@ pub struct Output<'d, T: Pin> { | |||||||
|  |  | ||||||
| impl<'d, T: Pin> Output<'d, T> { | impl<'d, T: Pin> Output<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, initial_output: Level, speed: Speed) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, initial_output: Level, speed: Speed) -> Self { | ||||||
|         let mut pin = Flex::new(pin); |         let mut pin = Flex::new(pin); | ||||||
|         match initial_output { |         match initial_output { | ||||||
|             Level::High => pin.set_high(), |             Level::High => pin.set_high(), | ||||||
| @@ -395,7 +395,7 @@ pub struct OutputOpenDrain<'d, T: Pin> { | |||||||
|  |  | ||||||
| impl<'d, T: Pin> OutputOpenDrain<'d, T> { | impl<'d, T: Pin> OutputOpenDrain<'d, T> { | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn new(pin: impl Unborrow<Target = T> + 'd, initial_output: Level, speed: Speed, pull: Pull) -> Self { |     pub fn new(pin: impl Peripheral<P = T> + 'd, initial_output: Level, speed: Speed, pull: Pull) -> Self { | ||||||
|         let mut pin = Flex::new(pin); |         let mut pin = Flex::new(pin); | ||||||
|  |  | ||||||
|         match initial_output { |         match initial_output { | ||||||
| @@ -668,7 +668,7 @@ impl AnyPin { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| impl_unborrow!(AnyPin); | impl_peripheral!(AnyPin); | ||||||
| impl Pin for AnyPin { | impl Pin for AnyPin { | ||||||
|     #[cfg(feature = "exti")] |     #[cfg(feature = "exti")] | ||||||
|     type ExtiChannel = crate::exti::AnyChannel; |     type ExtiChannel = crate::exti::AnyChannel; | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_embedded_hal::SetConfig; | use embassy_embedded_hal::SetConfig; | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::AFType; | use crate::gpio::sealed::AFType; | ||||||
| use crate::i2c::{Error, Instance, SclPin, SdaPin}; | use crate::i2c::{Error, Instance, SclPin, SdaPin}; | ||||||
| use crate::pac::i2c; | use crate::pac::i2c; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| pub struct State {} | pub struct State {} | ||||||
|  |  | ||||||
| @@ -23,12 +23,12 @@ pub struct I2c<'d, T: Instance> { | |||||||
|  |  | ||||||
| impl<'d, T: Instance> I2c<'d, T> { | impl<'d, T: Instance> I2c<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         _peri: impl Unborrow<Target = T> + 'd, |         _peri: impl Peripheral<P = T> + 'd, | ||||||
|         scl: impl Unborrow<Target = impl SclPin<T>> + 'd, |         scl: impl Peripheral<P = impl SclPin<T>> + 'd, | ||||||
|         sda: impl Unborrow<Target = impl SdaPin<T>> + 'd, |         sda: impl Peripheral<P = impl SdaPin<T>> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(scl, sda); |         into_ref!(scl, sda); | ||||||
|  |  | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         T::reset(); |         T::reset(); | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ use atomic_polyfill::{AtomicUsize, Ordering}; | |||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_embedded_hal::SetConfig; | use embassy_embedded_hal::SetConfig; | ||||||
| use embassy_hal_common::drop::OnDrop; | use embassy_hal_common::drop::OnDrop; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
|  |  | ||||||
| use crate::dma::NoDma; | use crate::dma::NoDma; | ||||||
| @@ -14,7 +14,7 @@ use crate::i2c::{Error, Instance, SclPin, SdaPin}; | |||||||
| use crate::interrupt::InterruptExt; | use crate::interrupt::InterruptExt; | ||||||
| use crate::pac::i2c; | use crate::pac::i2c; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| pub struct State { | pub struct State { | ||||||
|     waker: AtomicWaker, |     waker: AtomicWaker, | ||||||
| @@ -31,23 +31,23 @@ impl State { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub struct I2c<'d, T: Instance, TXDMA = NoDma, RXDMA = NoDma> { | pub struct I2c<'d, T: Instance, TXDMA = NoDma, RXDMA = NoDma> { | ||||||
|     _peri: Unborrowed<'d, T>, |     _peri: PeripheralRef<'d, T>, | ||||||
|     tx_dma: Unborrowed<'d, TXDMA>, |     tx_dma: PeripheralRef<'d, TXDMA>, | ||||||
|     #[allow(dead_code)] |     #[allow(dead_code)] | ||||||
|     rx_dma: Unborrowed<'d, RXDMA>, |     rx_dma: PeripheralRef<'d, RXDMA>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> { | impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         scl: impl Unborrow<Target = impl SclPin<T>> + 'd, |         scl: impl Peripheral<P = impl SclPin<T>> + 'd, | ||||||
|         sda: impl Unborrow<Target = impl SdaPin<T>> + 'd, |         sda: impl Peripheral<P = impl SdaPin<T>> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         tx_dma: impl Unborrow<Target = TXDMA> + 'd, |         tx_dma: impl Peripheral<P = TXDMA> + 'd, | ||||||
|         rx_dma: impl Unborrow<Target = RXDMA> + 'd, |         rx_dma: impl Peripheral<P = RXDMA> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, irq, scl, sda, tx_dma, rx_dma); |         into_ref!(peri, irq, scl, sda, tx_dma, rx_dma); | ||||||
|  |  | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         T::reset(); |         T::reset(); | ||||||
|   | |||||||
| @@ -75,7 +75,7 @@ pub(crate) mod _generated { | |||||||
| // Reexports | // Reexports | ||||||
| pub use _generated::{peripherals, Peripherals}; | pub use _generated::{peripherals, Peripherals}; | ||||||
| pub use embassy_cortex_m::executor; | pub use embassy_cortex_m::executor; | ||||||
| pub use embassy_hal_common::{unborrow, Unborrow, Unborrowed}; | pub use embassy_hal_common::{into_ref, Peripheral, PeripheralRef}; | ||||||
| pub use embassy_macros::cortex_m_interrupt as interrupt; | pub use embassy_macros::cortex_m_interrupt as interrupt; | ||||||
| #[cfg(feature = "unstable-pac")] | #[cfg(feature = "unstable-pac")] | ||||||
| pub use stm32_metapac as pac; | pub use stm32_metapac as pac; | ||||||
|   | |||||||
| @@ -1,18 +1,18 @@ | |||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use super::*; | use super::*; | ||||||
| #[allow(unused_imports)] | #[allow(unused_imports)] | ||||||
| use crate::gpio::sealed::{AFType, Pin}; | use crate::gpio::sealed::{AFType, Pin}; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::Unborrow; | use crate::Peripheral; | ||||||
|  |  | ||||||
| pub struct SimplePwm<'d, T> { | pub struct SimplePwm<'d, T> { | ||||||
|     inner: Unborrowed<'d, T>, |     inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| macro_rules! config_pins { | macro_rules! config_pins { | ||||||
|     ($($pin:ident),*) => { |     ($($pin:ident),*) => { | ||||||
|         unborrow!($($pin),*); |         into_ref!($($pin),*); | ||||||
|         // NOTE(unsafe) Exclusive access to the registers |         // NOTE(unsafe) Exclusive access to the registers | ||||||
|         critical_section::with(|_| unsafe { |         critical_section::with(|_| unsafe { | ||||||
|             $( |             $( | ||||||
| @@ -27,8 +27,8 @@ macro_rules! config_pins { | |||||||
|  |  | ||||||
| impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> { | impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> { | ||||||
|     pub fn new_1ch( |     pub fn new_1ch( | ||||||
|         tim: impl Unborrow<Target = T> + 'd, |         tim: impl Peripheral<P = T> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl Channel1Pin<T>> + 'd, |         ch1: impl Peripheral<P = impl Channel1Pin<T>> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         Self::new_inner(tim, freq, move || { |         Self::new_inner(tim, freq, move || { | ||||||
| @@ -37,9 +37,9 @@ impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_2ch( |     pub fn new_2ch( | ||||||
|         tim: impl Unborrow<Target = T> + 'd, |         tim: impl Peripheral<P = T> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl Channel1Pin<T>> + 'd, |         ch1: impl Peripheral<P = impl Channel1Pin<T>> + 'd, | ||||||
|         ch2: impl Unborrow<Target = impl Channel2Pin<T>> + 'd, |         ch2: impl Peripheral<P = impl Channel2Pin<T>> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         Self::new_inner(tim, freq, move || { |         Self::new_inner(tim, freq, move || { | ||||||
| @@ -48,10 +48,10 @@ impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_3ch( |     pub fn new_3ch( | ||||||
|         tim: impl Unborrow<Target = T> + 'd, |         tim: impl Peripheral<P = T> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl Channel1Pin<T>> + 'd, |         ch1: impl Peripheral<P = impl Channel1Pin<T>> + 'd, | ||||||
|         ch2: impl Unborrow<Target = impl Channel2Pin<T>> + 'd, |         ch2: impl Peripheral<P = impl Channel2Pin<T>> + 'd, | ||||||
|         ch3: impl Unborrow<Target = impl Channel3Pin<T>> + 'd, |         ch3: impl Peripheral<P = impl Channel3Pin<T>> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         Self::new_inner(tim, freq, move || { |         Self::new_inner(tim, freq, move || { | ||||||
| @@ -60,11 +60,11 @@ impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_4ch( |     pub fn new_4ch( | ||||||
|         tim: impl Unborrow<Target = T> + 'd, |         tim: impl Peripheral<P = T> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl Channel1Pin<T>> + 'd, |         ch1: impl Peripheral<P = impl Channel1Pin<T>> + 'd, | ||||||
|         ch2: impl Unborrow<Target = impl Channel2Pin<T>> + 'd, |         ch2: impl Peripheral<P = impl Channel2Pin<T>> + 'd, | ||||||
|         ch3: impl Unborrow<Target = impl Channel3Pin<T>> + 'd, |         ch3: impl Peripheral<P = impl Channel3Pin<T>> + 'd, | ||||||
|         ch4: impl Unborrow<Target = impl Channel4Pin<T>> + 'd, |         ch4: impl Peripheral<P = impl Channel4Pin<T>> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         Self::new_inner(tim, freq, move || { |         Self::new_inner(tim, freq, move || { | ||||||
| @@ -72,8 +72,8 @@ impl<'d, T: CaptureCompare16bitInstance> SimplePwm<'d, T> { | |||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner(tim: impl Unborrow<Target = T> + 'd, freq: Hertz, configure_pins: impl FnOnce()) -> Self { |     fn new_inner(tim: impl Peripheral<P = T> + 'd, freq: Hertz, configure_pins: impl FnOnce()) -> Self { | ||||||
|         unborrow!(tim); |         into_ref!(tim); | ||||||
|  |  | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         <T as crate::rcc::sealed::RccPeripheral>::reset(); |         <T as crate::rcc::sealed::RccPeripheral>::reset(); | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| pub use pll::PllConfig; | pub use pll::PllConfig; | ||||||
| use stm32_metapac::rcc::vals::{Mco1, Mco2}; | use stm32_metapac::rcc::vals::{Mco1, Mco2}; | ||||||
|  |  | ||||||
| @@ -10,7 +10,7 @@ use crate::pac::rcc::vals::{Adcsel, Ckpersel, Dppre, Hpre, Hsidiv, Pllsrc, Sw, T | |||||||
| use crate::pac::{PWR, RCC, SYSCFG}; | use crate::pac::{PWR, RCC, SYSCFG}; | ||||||
| use crate::rcc::{set_freqs, Clocks}; | use crate::rcc::{set_freqs, Clocks}; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::{peripherals, Unborrow}; | use crate::{peripherals, Peripheral}; | ||||||
|  |  | ||||||
| /// HSI speed | /// HSI speed | ||||||
| pub const HSI_FREQ: Hertz = Hertz(64_000_000); | pub const HSI_FREQ: Hertz = Hertz(64_000_000); | ||||||
| @@ -385,12 +385,12 @@ pub struct Mco<'d, T: McoInstance> { | |||||||
|  |  | ||||||
| impl<'d, T: McoInstance> Mco<'d, T> { | impl<'d, T: McoInstance> Mco<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         _peri: impl Unborrow<Target = T> + 'd, |         _peri: impl Peripheral<P = T> + 'd, | ||||||
|         pin: impl Unborrow<Target = impl McoPin<T>> + 'd, |         pin: impl Peripheral<P = impl McoPin<T>> + 'd, | ||||||
|         source: impl McoSource<Raw = T::Source>, |         source: impl McoSource<Raw = T::Source>, | ||||||
|         prescaler: McoClock, |         prescaler: McoClock, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(pin); |         into_ref!(pin); | ||||||
|  |  | ||||||
|         critical_section::with(|_| unsafe { |         critical_section::with(|_| unsafe { | ||||||
|             T::apply_clock_settings(source.into_raw(), prescaler.into_raw()); |             T::apply_clock_settings(source.into_raw(), prescaler.into_raw()); | ||||||
|   | |||||||
| @@ -3,11 +3,11 @@ | |||||||
| use core::task::Poll; | use core::task::Poll; | ||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
| use rand_core::{CryptoRng, RngCore}; | use rand_core::{CryptoRng, RngCore}; | ||||||
|  |  | ||||||
| use crate::{pac, peripherals, Unborrow}; | use crate::{pac, peripherals, Peripheral}; | ||||||
|  |  | ||||||
| pub(crate) static RNG_WAKER: AtomicWaker = AtomicWaker::new(); | pub(crate) static RNG_WAKER: AtomicWaker = AtomicWaker::new(); | ||||||
|  |  | ||||||
| @@ -18,14 +18,14 @@ pub enum Error { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub struct Rng<'d, T: Instance> { | pub struct Rng<'d, T: Instance> { | ||||||
|     _inner: Unborrowed<'d, T>, |     _inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance> Rng<'d, T> { | impl<'d, T: Instance> Rng<'d, T> { | ||||||
|     pub fn new(inner: impl Unborrow<Target = T> + 'd) -> Self { |     pub fn new(inner: impl Peripheral<P = T> + 'd) -> Self { | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         T::reset(); |         T::reset(); | ||||||
|         unborrow!(inner); |         into_ref!(inner); | ||||||
|         let mut random = Self { _inner: inner }; |         let mut random = Self { _inner: inner }; | ||||||
|         random.reset(); |         random.reset(); | ||||||
|         random |         random | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ use core::task::Poll; | |||||||
|  |  | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::drop::OnDrop; | use embassy_hal_common::drop::OnDrop; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
| use sdio_host::{BusWidth, CardCapacity, CardStatus, CurrentState, SDStatus, CID, CSD, OCR, SCR}; | use sdio_host::{BusWidth, CardCapacity, CardStatus, CurrentState, SDStatus, CID, CSD, OCR, SCR}; | ||||||
|  |  | ||||||
| @@ -16,7 +16,7 @@ use crate::interrupt::{Interrupt, InterruptExt}; | |||||||
| use crate::pac::sdmmc::Sdmmc as RegBlock; | use crate::pac::sdmmc::Sdmmc as RegBlock; | ||||||
| use crate::rcc::RccPeripheral; | use crate::rcc::RccPeripheral; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::{peripherals, Unborrow}; | use crate::{peripherals, Peripheral}; | ||||||
|  |  | ||||||
| /// The signalling scheme used on the SDMMC bus | /// The signalling scheme used on the SDMMC bus | ||||||
| #[non_exhaustive] | #[non_exhaustive] | ||||||
| @@ -176,16 +176,16 @@ impl Default for Config { | |||||||
|  |  | ||||||
| /// Sdmmc device | /// Sdmmc device | ||||||
| pub struct Sdmmc<'d, T: Instance, Dma = NoDma> { | pub struct Sdmmc<'d, T: Instance, Dma = NoDma> { | ||||||
|     _peri: Unborrowed<'d, T>, |     _peri: PeripheralRef<'d, T>, | ||||||
|     irq: Unborrowed<'d, T::Interrupt>, |     irq: PeripheralRef<'d, T::Interrupt>, | ||||||
|     dma: Unborrowed<'d, Dma>, |     dma: PeripheralRef<'d, Dma>, | ||||||
|  |  | ||||||
|     clk: Unborrowed<'d, AnyPin>, |     clk: PeripheralRef<'d, AnyPin>, | ||||||
|     cmd: Unborrowed<'d, AnyPin>, |     cmd: PeripheralRef<'d, AnyPin>, | ||||||
|     d0: Unborrowed<'d, AnyPin>, |     d0: PeripheralRef<'d, AnyPin>, | ||||||
|     d1: Option<Unborrowed<'d, AnyPin>>, |     d1: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     d2: Option<Unborrowed<'d, AnyPin>>, |     d2: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     d3: Option<Unborrowed<'d, AnyPin>>, |     d3: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|  |  | ||||||
|     config: Config, |     config: Config, | ||||||
|     /// Current clock to card |     /// Current clock to card | ||||||
| @@ -199,15 +199,15 @@ pub struct Sdmmc<'d, T: Instance, Dma = NoDma> { | |||||||
| #[cfg(sdmmc_v1)] | #[cfg(sdmmc_v1)] | ||||||
| impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> { | impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> { | ||||||
|     pub fn new_1bit( |     pub fn new_1bit( | ||||||
|         sdmmc: impl Unborrow<Target = T> + 'd, |         sdmmc: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         clk: impl Unborrow<Target = impl CkPin<T>> + 'd, |         clk: impl Peripheral<P = impl CkPin<T>> + 'd, | ||||||
|         cmd: impl Unborrow<Target = impl CmdPin<T>> + 'd, |         cmd: impl Peripheral<P = impl CmdPin<T>> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(clk, cmd, d0); |         into_ref!(clk, cmd, d0); | ||||||
|  |  | ||||||
|         critical_section::with(|_| unsafe { |         critical_section::with(|_| unsafe { | ||||||
|             clk.set_as_af_pull(clk.af_num(), AFType::OutputPushPull, Pull::None); |             clk.set_as_af_pull(clk.af_num(), AFType::OutputPushPull, Pull::None); | ||||||
| @@ -234,18 +234,18 @@ impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_4bit( |     pub fn new_4bit( | ||||||
|         sdmmc: impl Unborrow<Target = T> + 'd, |         sdmmc: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         clk: impl Unborrow<Target = impl CkPin<T>> + 'd, |         clk: impl Peripheral<P = impl CkPin<T>> + 'd, | ||||||
|         cmd: impl Unborrow<Target = impl CmdPin<T>> + 'd, |         cmd: impl Peripheral<P = impl CmdPin<T>> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(clk, cmd, d0, d1, d2, d3); |         into_ref!(clk, cmd, d0, d1, d2, d3); | ||||||
|  |  | ||||||
|         critical_section::with(|_| unsafe { |         critical_section::with(|_| unsafe { | ||||||
|             clk.set_as_af_pull(clk.af_num(), AFType::OutputPushPull, Pull::None); |             clk.set_as_af_pull(clk.af_num(), AFType::OutputPushPull, Pull::None); | ||||||
| @@ -278,18 +278,18 @@ impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         sdmmc: impl Unborrow<Target = T> + 'd, |         sdmmc: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         dma: impl Unborrow<Target = Dma> + 'd, |         dma: impl Peripheral<P = Dma> + 'd, | ||||||
|         clk: Unborrowed<'d, AnyPin>, |         clk: PeripheralRef<'d, AnyPin>, | ||||||
|         cmd: Unborrowed<'d, AnyPin>, |         cmd: PeripheralRef<'d, AnyPin>, | ||||||
|         d0: Unborrowed<'d, AnyPin>, |         d0: PeripheralRef<'d, AnyPin>, | ||||||
|         d1: Option<Unborrowed<'d, AnyPin>>, |         d1: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         d2: Option<Unborrowed<'d, AnyPin>>, |         d2: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         d3: Option<Unborrowed<'d, AnyPin>>, |         d3: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(sdmmc, irq, dma); |         into_ref!(sdmmc, irq, dma); | ||||||
|  |  | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         T::reset(); |         T::reset(); | ||||||
| @@ -324,14 +324,14 @@ impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> { | |||||||
| #[cfg(sdmmc_v2)] | #[cfg(sdmmc_v2)] | ||||||
| impl<'d, T: Instance> Sdmmc<'d, T, NoDma> { | impl<'d, T: Instance> Sdmmc<'d, T, NoDma> { | ||||||
|     pub fn new_1bit( |     pub fn new_1bit( | ||||||
|         sdmmc: impl Unborrow<Target = T> + 'd, |         sdmmc: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         clk: impl Unborrow<Target = impl CkPin<T>> + 'd, |         clk: impl Peripheral<P = impl CkPin<T>> + 'd, | ||||||
|         cmd: impl Unborrow<Target = impl CmdPin<T>> + 'd, |         cmd: impl Peripheral<P = impl CmdPin<T>> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(clk, cmd, d0); |         into_ref!(clk, cmd, d0); | ||||||
|  |  | ||||||
|         critical_section::with(|_| unsafe { |         critical_section::with(|_| unsafe { | ||||||
|             clk.set_as_af_pull(clk.af_num(), AFType::OutputPushPull, Pull::None); |             clk.set_as_af_pull(clk.af_num(), AFType::OutputPushPull, Pull::None); | ||||||
| @@ -357,17 +357,17 @@ impl<'d, T: Instance> Sdmmc<'d, T, NoDma> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_4bit( |     pub fn new_4bit( | ||||||
|         sdmmc: impl Unborrow<Target = T> + 'd, |         sdmmc: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         clk: impl Unborrow<Target = impl CkPin<T>> + 'd, |         clk: impl Peripheral<P = impl CkPin<T>> + 'd, | ||||||
|         cmd: impl Unborrow<Target = impl CmdPin<T>> + 'd, |         cmd: impl Peripheral<P = impl CmdPin<T>> + 'd, | ||||||
|         d0: impl Unborrow<Target = impl D0Pin<T>> + 'd, |         d0: impl Peripheral<P = impl D0Pin<T>> + 'd, | ||||||
|         d1: impl Unborrow<Target = impl D1Pin<T>> + 'd, |         d1: impl Peripheral<P = impl D1Pin<T>> + 'd, | ||||||
|         d2: impl Unborrow<Target = impl D2Pin<T>> + 'd, |         d2: impl Peripheral<P = impl D2Pin<T>> + 'd, | ||||||
|         d3: impl Unborrow<Target = impl D3Pin<T>> + 'd, |         d3: impl Peripheral<P = impl D3Pin<T>> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(clk, cmd, d0, d1, d2, d3); |         into_ref!(clk, cmd, d0, d1, d2, d3); | ||||||
|  |  | ||||||
|         critical_section::with(|_| unsafe { |         critical_section::with(|_| unsafe { | ||||||
|             clk.set_as_af_pull(clk.af_num(), AFType::OutputPushPull, Pull::None); |             clk.set_as_af_pull(clk.af_num(), AFType::OutputPushPull, Pull::None); | ||||||
| @@ -399,17 +399,17 @@ impl<'d, T: Instance> Sdmmc<'d, T, NoDma> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         sdmmc: impl Unborrow<Target = T> + 'd, |         sdmmc: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         clk: Unborrowed<'d, AnyPin>, |         clk: PeripheralRef<'d, AnyPin>, | ||||||
|         cmd: Unborrowed<'d, AnyPin>, |         cmd: PeripheralRef<'d, AnyPin>, | ||||||
|         d0: Unborrowed<'d, AnyPin>, |         d0: PeripheralRef<'d, AnyPin>, | ||||||
|         d1: Option<Unborrowed<'d, AnyPin>>, |         d1: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         d2: Option<Unborrowed<'d, AnyPin>>, |         d2: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         d3: Option<Unborrowed<'d, AnyPin>>, |         d3: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(sdmmc, irq); |         into_ref!(sdmmc, irq); | ||||||
|  |  | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         T::reset(); |         T::reset(); | ||||||
| @@ -424,7 +424,7 @@ impl<'d, T: Instance> Sdmmc<'d, T, NoDma> { | |||||||
|         Self { |         Self { | ||||||
|             _peri: sdmmc, |             _peri: sdmmc, | ||||||
|             irq, |             irq, | ||||||
|             dma: NoDma.unborrow(), |             dma: NoDma.into_ref(), | ||||||
|  |  | ||||||
|             clk, |             clk, | ||||||
|             cmd, |             cmd, | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| use core::ptr; | use core::ptr; | ||||||
|  |  | ||||||
| use embassy_embedded_hal::SetConfig; | use embassy_embedded_hal::SetConfig; | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
| pub use embedded_hal_02::spi::{Mode, Phase, Polarity, MODE_0, MODE_1, MODE_2, MODE_3}; | pub use embedded_hal_02::spi::{Mode, Phase, Polarity, MODE_0, MODE_1, MODE_2, MODE_3}; | ||||||
| use futures::future::join; | use futures::future::join; | ||||||
|  |  | ||||||
| @@ -14,7 +14,7 @@ use crate::gpio::AnyPin; | |||||||
| use crate::pac::spi::{regs, vals, Spi as Regs}; | use crate::pac::spi::{regs, vals, Spi as Regs}; | ||||||
| use crate::rcc::RccPeripheral; | use crate::rcc::RccPeripheral; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::{peripherals, Unborrow}; | use crate::{peripherals, Peripheral}; | ||||||
|  |  | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| #[cfg_attr(feature = "defmt", derive(defmt::Format))] | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | ||||||
| @@ -72,27 +72,27 @@ impl Config { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub struct Spi<'d, T: Instance, Tx, Rx> { | pub struct Spi<'d, T: Instance, Tx, Rx> { | ||||||
|     _peri: Unborrowed<'d, T>, |     _peri: PeripheralRef<'d, T>, | ||||||
|     sck: Option<Unborrowed<'d, AnyPin>>, |     sck: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     mosi: Option<Unborrowed<'d, AnyPin>>, |     mosi: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     miso: Option<Unborrowed<'d, AnyPin>>, |     miso: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|     txdma: Unborrowed<'d, Tx>, |     txdma: PeripheralRef<'d, Tx>, | ||||||
|     rxdma: Unborrowed<'d, Rx>, |     rxdma: PeripheralRef<'d, Rx>, | ||||||
|     current_word_size: WordSize, |     current_word_size: WordSize, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         sck: impl Unborrow<Target = impl SckPin<T>> + 'd, |         sck: impl Peripheral<P = impl SckPin<T>> + 'd, | ||||||
|         mosi: impl Unborrow<Target = impl MosiPin<T>> + 'd, |         mosi: impl Peripheral<P = impl MosiPin<T>> + 'd, | ||||||
|         miso: impl Unborrow<Target = impl MisoPin<T>> + 'd, |         miso: impl Peripheral<P = impl MisoPin<T>> + 'd, | ||||||
|         txdma: impl Unborrow<Target = Tx> + 'd, |         txdma: impl Peripheral<P = Tx> + 'd, | ||||||
|         rxdma: impl Unborrow<Target = Rx> + 'd, |         rxdma: impl Peripheral<P = Rx> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, sck, mosi, miso); |         into_ref!(peri, sck, mosi, miso); | ||||||
|         unsafe { |         unsafe { | ||||||
|             sck.set_as_af(sck.af_num(), AFType::OutputPushPull); |             sck.set_as_af(sck.af_num(), AFType::OutputPushPull); | ||||||
|             #[cfg(any(spi_v2, spi_v3, spi_v4))] |             #[cfg(any(spi_v2, spi_v3, spi_v4))] | ||||||
| @@ -118,15 +118,15 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_rxonly( |     pub fn new_rxonly( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         sck: impl Unborrow<Target = impl SckPin<T>> + 'd, |         sck: impl Peripheral<P = impl SckPin<T>> + 'd, | ||||||
|         miso: impl Unborrow<Target = impl MisoPin<T>> + 'd, |         miso: impl Peripheral<P = impl MisoPin<T>> + 'd, | ||||||
|         txdma: impl Unborrow<Target = Tx> + 'd, // TODO remove |         txdma: impl Peripheral<P = Tx> + 'd, // TODO remove | ||||||
|         rxdma: impl Unborrow<Target = Rx> + 'd, |         rxdma: impl Peripheral<P = Rx> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(sck, miso); |         into_ref!(sck, miso); | ||||||
|         unsafe { |         unsafe { | ||||||
|             sck.set_as_af(sck.af_num(), AFType::OutputPushPull); |             sck.set_as_af(sck.af_num(), AFType::OutputPushPull); | ||||||
|             #[cfg(any(spi_v2, spi_v3, spi_v4))] |             #[cfg(any(spi_v2, spi_v3, spi_v4))] | ||||||
| @@ -149,15 +149,15 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn new_txonly( |     pub fn new_txonly( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         sck: impl Unborrow<Target = impl SckPin<T>> + 'd, |         sck: impl Peripheral<P = impl SckPin<T>> + 'd, | ||||||
|         mosi: impl Unborrow<Target = impl MosiPin<T>> + 'd, |         mosi: impl Peripheral<P = impl MosiPin<T>> + 'd, | ||||||
|         txdma: impl Unborrow<Target = Tx> + 'd, |         txdma: impl Peripheral<P = Tx> + 'd, | ||||||
|         rxdma: impl Unborrow<Target = Rx> + 'd, // TODO remove |         rxdma: impl Peripheral<P = Rx> + 'd, // TODO remove | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(sck, mosi); |         into_ref!(sck, mosi); | ||||||
|         unsafe { |         unsafe { | ||||||
|             sck.set_as_af(sck.af_num(), AFType::OutputPushPull); |             sck.set_as_af(sck.af_num(), AFType::OutputPushPull); | ||||||
|             #[cfg(any(spi_v2, spi_v3, spi_v4))] |             #[cfg(any(spi_v2, spi_v3, spi_v4))] | ||||||
| @@ -180,16 +180,16 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn new_inner( |     fn new_inner( | ||||||
|         peri: impl Unborrow<Target = T> + 'd, |         peri: impl Peripheral<P = T> + 'd, | ||||||
|         sck: Option<Unborrowed<'d, AnyPin>>, |         sck: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         mosi: Option<Unborrowed<'d, AnyPin>>, |         mosi: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         miso: Option<Unborrowed<'d, AnyPin>>, |         miso: Option<PeripheralRef<'d, AnyPin>>, | ||||||
|         txdma: impl Unborrow<Target = Tx> + 'd, |         txdma: impl Peripheral<P = Tx> + 'd, | ||||||
|         rxdma: impl Unborrow<Target = Rx> + 'd, |         rxdma: impl Peripheral<P = Rx> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(peri, txdma, rxdma); |         into_ref!(peri, txdma, rxdma); | ||||||
|  |  | ||||||
|         let pclk = T::frequency(); |         let pclk = T::frequency(); | ||||||
|         let br = compute_baud_rate(pclk, freq.into()); |         let br = compute_baud_rate(pclk, freq.into()); | ||||||
| @@ -994,7 +994,7 @@ pub trait Word: Copy + 'static + sealed::Word + Default + crate::dma::Word {} | |||||||
| impl Word for u8 {} | impl Word for u8 {} | ||||||
| impl Word for u16 {} | impl Word for u16 {} | ||||||
|  |  | ||||||
| pub trait Instance: Unborrow<Target = Self> + sealed::Instance + RccPeripheral {} | pub trait Instance: Peripheral<P = Self> + sealed::Instance + RccPeripheral {} | ||||||
| pin_trait!(SckPin, Instance); | pin_trait!(SckPin, Instance); | ||||||
| pin_trait!(MosiPin, Instance); | pin_trait!(MosiPin, Instance); | ||||||
| pin_trait!(MisoPin, Instance); | pin_trait!(MisoPin, Instance); | ||||||
|   | |||||||
| @@ -83,7 +83,7 @@ use crate::peripherals::SUBGHZSPI; | |||||||
| use crate::rcc::sealed::RccPeripheral; | use crate::rcc::sealed::RccPeripheral; | ||||||
| use crate::spi::{BitOrder, Config as SpiConfig, MisoPin, MosiPin, SckPin, Spi, MODE_0}; | use crate::spi::{BitOrder, Config as SpiConfig, MisoPin, MosiPin, SckPin, Spi, MODE_0}; | ||||||
| use crate::time::Hertz; | use crate::time::Hertz; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| /// Passthrough for SPI errors (for now) | /// Passthrough for SPI errors (for now) | ||||||
| pub type Error = crate::spi::Error; | pub type Error = crate::spi::Error; | ||||||
| @@ -211,12 +211,12 @@ impl<'d, Tx, Rx> SubGhz<'d, Tx, Rx> { | |||||||
|     /// This will reset the radio and the SPI bus, and enable the peripheral |     /// This will reset the radio and the SPI bus, and enable the peripheral | ||||||
|     /// clock. |     /// clock. | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         peri: impl Unborrow<Target = SUBGHZSPI> + 'd, |         peri: impl Peripheral<P = SUBGHZSPI> + 'd, | ||||||
|         sck: impl Unborrow<Target = impl SckPin<SUBGHZSPI>> + 'd, |         sck: impl Peripheral<P = impl SckPin<SUBGHZSPI>> + 'd, | ||||||
|         mosi: impl Unborrow<Target = impl MosiPin<SUBGHZSPI>> + 'd, |         mosi: impl Peripheral<P = impl MosiPin<SUBGHZSPI>> + 'd, | ||||||
|         miso: impl Unborrow<Target = impl MisoPin<SUBGHZSPI>> + 'd, |         miso: impl Peripheral<P = impl MisoPin<SUBGHZSPI>> + 'd, | ||||||
|         txdma: impl Unborrow<Target = Tx> + 'd, |         txdma: impl Peripheral<P = Tx> + 'd, | ||||||
|         rxdma: impl Unborrow<Target = Rx> + 'd, |         rxdma: impl Peripheral<P = Rx> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         Self::pulse_radio_reset(); |         Self::pulse_radio_reset(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -39,11 +39,11 @@ impl<'d, T: Instance> BufferedUart<'d, T> { | |||||||
|     pub fn new( |     pub fn new( | ||||||
|         state: &'d mut State<'d, T>, |         state: &'d mut State<'d, T>, | ||||||
|         _uart: Uart<'d, T, NoDma, NoDma>, |         _uart: Uart<'d, T, NoDma, NoDma>, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         tx_buffer: &'d mut [u8], |         tx_buffer: &'d mut [u8], | ||||||
|         rx_buffer: &'d mut [u8], |         rx_buffer: &'d mut [u8], | ||||||
|     ) -> BufferedUart<'d, T> { |     ) -> BufferedUart<'d, T> { | ||||||
|         unborrow!(irq); |         into_ref!(irq); | ||||||
|  |  | ||||||
|         let r = T::regs(); |         let r = T::regs(); | ||||||
|         unsafe { |         unsafe { | ||||||
|   | |||||||
| @@ -2,14 +2,14 @@ | |||||||
|  |  | ||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_hal_common::{unborrow, Unborrowed}; | use embassy_hal_common::{into_ref, PeripheralRef}; | ||||||
|  |  | ||||||
| use crate::dma::NoDma; | use crate::dma::NoDma; | ||||||
| use crate::gpio::sealed::AFType; | use crate::gpio::sealed::AFType; | ||||||
| use crate::interrupt::Interrupt; | use crate::interrupt::Interrupt; | ||||||
| use crate::pac::usart::{regs, vals}; | use crate::pac::usart::{regs, vals}; | ||||||
| use crate::rcc::RccPeripheral; | use crate::rcc::RccPeripheral; | ||||||
| use crate::{peripherals, Unborrow}; | use crate::{peripherals, Peripheral}; | ||||||
|  |  | ||||||
| #[derive(Clone, Copy, PartialEq, Eq, Debug)] | #[derive(Clone, Copy, PartialEq, Eq, Debug)] | ||||||
| pub enum DataBits { | pub enum DataBits { | ||||||
| @@ -78,16 +78,16 @@ pub struct Uart<'d, T: Instance, TxDma = NoDma, RxDma = NoDma> { | |||||||
|  |  | ||||||
| pub struct UartTx<'d, T: Instance, TxDma = NoDma> { | pub struct UartTx<'d, T: Instance, TxDma = NoDma> { | ||||||
|     phantom: PhantomData<&'d mut T>, |     phantom: PhantomData<&'d mut T>, | ||||||
|     tx_dma: Unborrowed<'d, TxDma>, |     tx_dma: PeripheralRef<'d, TxDma>, | ||||||
| } | } | ||||||
|  |  | ||||||
| pub struct UartRx<'d, T: Instance, RxDma = NoDma> { | pub struct UartRx<'d, T: Instance, RxDma = NoDma> { | ||||||
|     phantom: PhantomData<&'d mut T>, |     phantom: PhantomData<&'d mut T>, | ||||||
|     rx_dma: Unborrowed<'d, RxDma>, |     rx_dma: PeripheralRef<'d, RxDma>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance, TxDma> UartTx<'d, T, TxDma> { | impl<'d, T: Instance, TxDma> UartTx<'d, T, TxDma> { | ||||||
|     fn new(tx_dma: Unborrowed<'d, TxDma>) -> Self { |     fn new(tx_dma: PeripheralRef<'d, TxDma>) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             tx_dma, |             tx_dma, | ||||||
|             phantom: PhantomData, |             phantom: PhantomData, | ||||||
| @@ -133,7 +133,7 @@ impl<'d, T: Instance, TxDma> UartTx<'d, T, TxDma> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: Instance, RxDma> UartRx<'d, T, RxDma> { | impl<'d, T: Instance, RxDma> UartRx<'d, T, RxDma> { | ||||||
|     fn new(rx_dma: Unborrowed<'d, RxDma>) -> Self { |     fn new(rx_dma: PeripheralRef<'d, RxDma>) -> Self { | ||||||
|         Self { |         Self { | ||||||
|             rx_dma, |             rx_dma, | ||||||
|             phantom: PhantomData, |             phantom: PhantomData, | ||||||
| @@ -189,14 +189,14 @@ impl<'d, T: Instance, RxDma> UartRx<'d, T, RxDma> { | |||||||
|  |  | ||||||
| impl<'d, T: Instance, TxDma, RxDma> Uart<'d, T, TxDma, RxDma> { | impl<'d, T: Instance, TxDma, RxDma> Uart<'d, T, TxDma, RxDma> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         _inner: impl Unborrow<Target = T> + 'd, |         _inner: impl Peripheral<P = T> + 'd, | ||||||
|         rx: impl Unborrow<Target = impl RxPin<T>> + 'd, |         rx: impl Peripheral<P = impl RxPin<T>> + 'd, | ||||||
|         tx: impl Unborrow<Target = impl TxPin<T>> + 'd, |         tx: impl Peripheral<P = impl TxPin<T>> + 'd, | ||||||
|         tx_dma: impl Unborrow<Target = TxDma> + 'd, |         tx_dma: impl Peripheral<P = TxDma> + 'd, | ||||||
|         rx_dma: impl Unborrow<Target = RxDma> + 'd, |         rx_dma: impl Peripheral<P = RxDma> + 'd, | ||||||
|         config: Config, |         config: Config, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(_inner, rx, tx, tx_dma, rx_dma); |         into_ref!(_inner, rx, tx, tx_dma, rx_dma); | ||||||
|  |  | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         T::reset(); |         T::reset(); | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ use core::task::Poll; | |||||||
| use atomic_polyfill::{AtomicBool, AtomicU8}; | use atomic_polyfill::{AtomicBool, AtomicU8}; | ||||||
| use embassy::time::{block_for, Duration}; | use embassy::time::{block_for, Duration}; | ||||||
| use embassy::waitqueue::AtomicWaker; | use embassy::waitqueue::AtomicWaker; | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
| use embassy_usb::driver::{self, EndpointAllocError, EndpointError, Event, Unsupported}; | use embassy_usb::driver::{self, EndpointAllocError, EndpointError, Event, Unsupported}; | ||||||
| use embassy_usb::types::{EndpointAddress, EndpointInfo, EndpointType, UsbDirection}; | use embassy_usb::types::{EndpointAddress, EndpointInfo, EndpointType, UsbDirection}; | ||||||
| use futures::future::poll_fn; | use futures::future::poll_fn; | ||||||
| @@ -20,7 +20,7 @@ use crate::gpio::sealed::AFType; | |||||||
| use crate::interrupt::InterruptExt; | use crate::interrupt::InterruptExt; | ||||||
| use crate::pac::usb::regs; | use crate::pac::usb::regs; | ||||||
| use crate::rcc::sealed::RccPeripheral; | use crate::rcc::sealed::RccPeripheral; | ||||||
| use crate::{pac, Unborrow}; | use crate::{pac, Peripheral}; | ||||||
|  |  | ||||||
| const EP_COUNT: usize = 8; | const EP_COUNT: usize = 8; | ||||||
|  |  | ||||||
| @@ -125,12 +125,12 @@ pub struct Driver<'d, T: Instance> { | |||||||
|  |  | ||||||
| impl<'d, T: Instance> Driver<'d, T> { | impl<'d, T: Instance> Driver<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         _usb: impl Unborrow<Target = T> + 'd, |         _usb: impl Peripheral<P = T> + 'd, | ||||||
|         irq: impl Unborrow<Target = T::Interrupt> + 'd, |         irq: impl Peripheral<P = T::Interrupt> + 'd, | ||||||
|         dp: impl Unborrow<Target = impl DpPin<T>> + 'd, |         dp: impl Peripheral<P = impl DpPin<T>> + 'd, | ||||||
|         dm: impl Unborrow<Target = impl DmPin<T>> + 'd, |         dm: impl Peripheral<P = impl DmPin<T>> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(irq, dp, dm); |         into_ref!(irq, dp, dm); | ||||||
|         irq.set_handler(Self::on_interrupt); |         irq.set_handler(Self::on_interrupt); | ||||||
|         irq.unpend(); |         irq.unpend(); | ||||||
|         irq.enable(); |         irq.enable(); | ||||||
|   | |||||||
| @@ -1,14 +1,14 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_hal_common::unborrow; | use embassy_hal_common::into_ref; | ||||||
|  |  | ||||||
| use crate::gpio::sealed::AFType; | use crate::gpio::sealed::AFType; | ||||||
| use crate::rcc::RccPeripheral; | use crate::rcc::RccPeripheral; | ||||||
| use crate::{peripherals, Unborrow}; | use crate::{peripherals, Peripheral}; | ||||||
|  |  | ||||||
| macro_rules! config_ulpi_pins { | macro_rules! config_ulpi_pins { | ||||||
|     ($($pin:ident),*) => { |     ($($pin:ident),*) => { | ||||||
|         unborrow!($($pin),*); |         into_ref!($($pin),*); | ||||||
|         // NOTE(unsafe) Exclusive access to the registers |         // NOTE(unsafe) Exclusive access to the registers | ||||||
|         critical_section::with(|_| unsafe { |         critical_section::with(|_| unsafe { | ||||||
|             $( |             $( | ||||||
| @@ -43,11 +43,11 @@ pub struct UsbOtg<'d, T: Instance> { | |||||||
| impl<'d, T: Instance> UsbOtg<'d, T> { | impl<'d, T: Instance> UsbOtg<'d, T> { | ||||||
|     /// Initializes USB OTG peripheral with internal Full-Speed PHY |     /// Initializes USB OTG peripheral with internal Full-Speed PHY | ||||||
|     pub fn new_fs( |     pub fn new_fs( | ||||||
|         _peri: impl Unborrow<Target = T> + 'd, |         _peri: impl Peripheral<P = T> + 'd, | ||||||
|         dp: impl Unborrow<Target = impl DpPin<T>> + 'd, |         dp: impl Peripheral<P = impl DpPin<T>> + 'd, | ||||||
|         dm: impl Unborrow<Target = impl DmPin<T>> + 'd, |         dm: impl Peripheral<P = impl DmPin<T>> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(dp, dm); |         into_ref!(dp, dm); | ||||||
|  |  | ||||||
|         unsafe { |         unsafe { | ||||||
|             dp.set_as_af(dp.af_num(), AFType::OutputPushPull); |             dp.set_as_af(dp.af_num(), AFType::OutputPushPull); | ||||||
| @@ -62,19 +62,19 @@ impl<'d, T: Instance> UsbOtg<'d, T> { | |||||||
|  |  | ||||||
|     /// Initializes USB OTG peripheral with external High-Speed PHY |     /// Initializes USB OTG peripheral with external High-Speed PHY | ||||||
|     pub fn new_hs_ulpi( |     pub fn new_hs_ulpi( | ||||||
|         _peri: impl Unborrow<Target = T> + 'd, |         _peri: impl Peripheral<P = T> + 'd, | ||||||
|         ulpi_clk: impl Unborrow<Target = impl UlpiClkPin<T>> + 'd, |         ulpi_clk: impl Peripheral<P = impl UlpiClkPin<T>> + 'd, | ||||||
|         ulpi_dir: impl Unborrow<Target = impl UlpiDirPin<T>> + 'd, |         ulpi_dir: impl Peripheral<P = impl UlpiDirPin<T>> + 'd, | ||||||
|         ulpi_nxt: impl Unborrow<Target = impl UlpiNxtPin<T>> + 'd, |         ulpi_nxt: impl Peripheral<P = impl UlpiNxtPin<T>> + 'd, | ||||||
|         ulpi_stp: impl Unborrow<Target = impl UlpiStpPin<T>> + 'd, |         ulpi_stp: impl Peripheral<P = impl UlpiStpPin<T>> + 'd, | ||||||
|         ulpi_d0: impl Unborrow<Target = impl UlpiD0Pin<T>> + 'd, |         ulpi_d0: impl Peripheral<P = impl UlpiD0Pin<T>> + 'd, | ||||||
|         ulpi_d1: impl Unborrow<Target = impl UlpiD1Pin<T>> + 'd, |         ulpi_d1: impl Peripheral<P = impl UlpiD1Pin<T>> + 'd, | ||||||
|         ulpi_d2: impl Unborrow<Target = impl UlpiD2Pin<T>> + 'd, |         ulpi_d2: impl Peripheral<P = impl UlpiD2Pin<T>> + 'd, | ||||||
|         ulpi_d3: impl Unborrow<Target = impl UlpiD3Pin<T>> + 'd, |         ulpi_d3: impl Peripheral<P = impl UlpiD3Pin<T>> + 'd, | ||||||
|         ulpi_d4: impl Unborrow<Target = impl UlpiD4Pin<T>> + 'd, |         ulpi_d4: impl Peripheral<P = impl UlpiD4Pin<T>> + 'd, | ||||||
|         ulpi_d5: impl Unborrow<Target = impl UlpiD5Pin<T>> + 'd, |         ulpi_d5: impl Peripheral<P = impl UlpiD5Pin<T>> + 'd, | ||||||
|         ulpi_d6: impl Unborrow<Target = impl UlpiD6Pin<T>> + 'd, |         ulpi_d6: impl Peripheral<P = impl UlpiD6Pin<T>> + 'd, | ||||||
|         ulpi_d7: impl Unborrow<Target = impl UlpiD7Pin<T>> + 'd, |         ulpi_d7: impl Peripheral<P = impl UlpiD7Pin<T>> + 'd, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         config_ulpi_pins!( |         config_ulpi_pins!( | ||||||
|             ulpi_clk, ulpi_dir, ulpi_nxt, ulpi_stp, ulpi_d0, ulpi_d1, ulpi_d2, ulpi_d3, ulpi_d4, ulpi_d5, ulpi_d6, |             ulpi_clk, ulpi_dir, ulpi_nxt, ulpi_stp, ulpi_d0, ulpi_d1, ulpi_d2, ulpi_d3, ulpi_d4, ulpi_d5, ulpi_d6, | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| use core::marker::PhantomData; | use core::marker::PhantomData; | ||||||
|  |  | ||||||
| use embassy_hal_common::{unborrow, Unborrow}; | use embassy_hal_common::{into_ref, Peripheral}; | ||||||
| use stm32_metapac::iwdg::vals::{Key, Pr}; | use stm32_metapac::iwdg::vals::{Key, Pr}; | ||||||
|  |  | ||||||
| use crate::rcc::LSI_FREQ; | use crate::rcc::LSI_FREQ; | ||||||
| @@ -27,8 +27,8 @@ impl<'d, T: Instance> IndependentWatchdog<'d, T> { | |||||||
|     /// |     /// | ||||||
|     /// [Self] has to be started with [Self::unleash()]. |     /// [Self] has to be started with [Self::unleash()]. | ||||||
|     /// Once timer expires, MCU will be reset. To prevent this, timer must be reloaded by repeatedly calling [Self::pet()] within timeout interval. |     /// Once timer expires, MCU will be reset. To prevent this, timer must be reloaded by repeatedly calling [Self::pet()] within timeout interval. | ||||||
|     pub fn new(_instance: impl Unborrow<Target = T> + 'd, timeout_us: u32) -> Self { |     pub fn new(_instance: impl Peripheral<P = T> + 'd, timeout_us: u32) -> Self { | ||||||
|         unborrow!(_instance); |         into_ref!(_instance); | ||||||
|  |  | ||||||
|         // Find lowest prescaler value, which makes watchdog period longer or equal to timeout. |         // Find lowest prescaler value, which makes watchdog period longer or equal to timeout. | ||||||
|         // This iterates from 4 (2^2) to 256 (2^8). |         // This iterates from 4 (2^2) to 256 (2^8). | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ use embassy_stm32::gpio::low_level::AFType; | |||||||
| use embassy_stm32::gpio::Speed; | use embassy_stm32::gpio::Speed; | ||||||
| use embassy_stm32::pwm::*; | use embassy_stm32::pwm::*; | ||||||
| use embassy_stm32::time::{khz, mhz, Hertz}; | use embassy_stm32::time::{khz, mhz, Hertz}; | ||||||
| use embassy_stm32::{unborrow, Config, Peripherals, Unborrow, Unborrowed}; | use embassy_stm32::{into_ref, Config, Peripheral, PeripheralRef, Peripherals}; | ||||||
| use {defmt_rtt as _, panic_probe as _}; | use {defmt_rtt as _, panic_probe as _}; | ||||||
|  |  | ||||||
| pub fn config() -> Config { | pub fn config() -> Config { | ||||||
| @@ -47,19 +47,19 @@ async fn main(_spawner: Spawner, p: Peripherals) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| pub struct SimplePwm32<'d, T: CaptureCompare32bitInstance> { | pub struct SimplePwm32<'d, T: CaptureCompare32bitInstance> { | ||||||
|     inner: Unborrowed<'d, T>, |     inner: PeripheralRef<'d, T>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl<'d, T: CaptureCompare32bitInstance> SimplePwm32<'d, T> { | impl<'d, T: CaptureCompare32bitInstance> SimplePwm32<'d, T> { | ||||||
|     pub fn new( |     pub fn new( | ||||||
|         tim: impl Unborrow<Target = T> + 'd, |         tim: impl Peripheral<P = T> + 'd, | ||||||
|         ch1: impl Unborrow<Target = impl Channel1Pin<T>> + 'd, |         ch1: impl Peripheral<P = impl Channel1Pin<T>> + 'd, | ||||||
|         ch2: impl Unborrow<Target = impl Channel2Pin<T>> + 'd, |         ch2: impl Peripheral<P = impl Channel2Pin<T>> + 'd, | ||||||
|         ch3: impl Unborrow<Target = impl Channel3Pin<T>> + 'd, |         ch3: impl Peripheral<P = impl Channel3Pin<T>> + 'd, | ||||||
|         ch4: impl Unborrow<Target = impl Channel4Pin<T>> + 'd, |         ch4: impl Peripheral<P = impl Channel4Pin<T>> + 'd, | ||||||
|         freq: Hertz, |         freq: Hertz, | ||||||
|     ) -> Self { |     ) -> Self { | ||||||
|         unborrow!(tim, ch1, ch2, ch3, ch4); |         into_ref!(tim, ch1, ch2, ch3, ch4); | ||||||
|  |  | ||||||
|         T::enable(); |         T::enable(); | ||||||
|         <T as embassy_stm32::rcc::low_level::RccPeripheral>::reset(); |         <T as embassy_stm32::rcc::low_level::RccPeripheral>::reset(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user