rp: add usb device support.

This commit is contained in:
Dario Nieuwenhuis
2022-08-24 23:46:07 +02:00
parent f11aa9720b
commit a730e2cd0f
6 changed files with 1259 additions and 1 deletions

View File

@ -10,6 +10,8 @@ pub mod interrupt;
pub mod spi;
pub mod timer;
pub mod uart;
#[cfg(feature = "nightly")]
pub mod usb;
mod clocks;
mod reset;
@ -80,6 +82,8 @@ embassy_hal_common::peripherals! {
DMA_CH9,
DMA_CH10,
DMA_CH11,
USB,
}
#[link_section = ".boot2"]
@ -109,3 +113,36 @@ pub fn init(_config: config::Config) -> Peripherals {
peripherals
}
/// Extension trait for PAC regs, adding atomic xor/bitset/bitclear writes.
trait RegExt<T: Copy> {
unsafe fn write_xor<R>(&self, f: impl FnOnce(&mut T) -> R) -> R;
unsafe fn write_set<R>(&self, f: impl FnOnce(&mut T) -> R) -> R;
unsafe fn write_clear<R>(&self, f: impl FnOnce(&mut T) -> R) -> R;
}
impl<T: Default + Copy, A: pac::common::Write> RegExt<T> for pac::common::Reg<T, A> {
unsafe fn write_xor<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
let mut val = Default::default();
let res = f(&mut val);
let ptr = (self.ptr() as *mut u8).add(0x1000) as *mut T;
ptr.write_volatile(val);
res
}
unsafe fn write_set<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
let mut val = Default::default();
let res = f(&mut val);
let ptr = (self.ptr() as *mut u8).add(0x2000) as *mut T;
ptr.write_volatile(val);
res
}
unsafe fn write_clear<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
let mut val = Default::default();
let res = f(&mut val);
let ptr = (self.ptr() as *mut u8).add(0x3000) as *mut T;
ptr.write_volatile(val);
res
}
}