aboutsummaryrefslogtreecommitdiff
path: root/embassy-rp/src/lib.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-08-30 19:15:44 +0200
committerGitHub <[email protected]>2022-08-30 19:15:44 +0200
commite4d4166da24937b5aa64bd34c3179e77ffa4e6a0 (patch)
treeaf8971d29cced692ce77f6acc6db807df2c2198f /embassy-rp/src/lib.rs
parent7542505cf903930520773f5b6b5ff239b78a8f9c (diff)
parenta730e2cd0f4f282a78cc5d9897c584ec4f5a44a3 (diff)
Merge pull request #927 from embassy-rs/rp-usb
rp: add usb device support.
Diffstat (limited to 'embassy-rp/src/lib.rs')
-rw-r--r--embassy-rp/src/lib.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/embassy-rp/src/lib.rs b/embassy-rp/src/lib.rs
index 6db77b8cd..aebbbf567 100644
--- a/embassy-rp/src/lib.rs
+++ b/embassy-rp/src/lib.rs
@@ -10,6 +10,8 @@ pub mod interrupt;
10pub mod spi; 10pub mod spi;
11pub mod timer; 11pub mod timer;
12pub mod uart; 12pub mod uart;
13#[cfg(feature = "nightly")]
14pub mod usb;
13 15
14mod clocks; 16mod clocks;
15mod reset; 17mod reset;
@@ -80,6 +82,8 @@ embassy_hal_common::peripherals! {
80 DMA_CH9, 82 DMA_CH9,
81 DMA_CH10, 83 DMA_CH10,
82 DMA_CH11, 84 DMA_CH11,
85
86 USB,
83} 87}
84 88
85#[link_section = ".boot2"] 89#[link_section = ".boot2"]
@@ -110,3 +114,36 @@ pub fn init(_config: config::Config) -> Peripherals {
110 114
111 peripherals 115 peripherals
112} 116}
117
118/// Extension trait for PAC regs, adding atomic xor/bitset/bitclear writes.
119trait RegExt<T: Copy> {
120 unsafe fn write_xor<R>(&self, f: impl FnOnce(&mut T) -> R) -> R;
121 unsafe fn write_set<R>(&self, f: impl FnOnce(&mut T) -> R) -> R;
122 unsafe fn write_clear<R>(&self, f: impl FnOnce(&mut T) -> R) -> R;
123}
124
125impl<T: Default + Copy, A: pac::common::Write> RegExt<T> for pac::common::Reg<T, A> {
126 unsafe fn write_xor<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
127 let mut val = Default::default();
128 let res = f(&mut val);
129 let ptr = (self.ptr() as *mut u8).add(0x1000) as *mut T;
130 ptr.write_volatile(val);
131 res
132 }
133
134 unsafe fn write_set<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
135 let mut val = Default::default();
136 let res = f(&mut val);
137 let ptr = (self.ptr() as *mut u8).add(0x2000) as *mut T;
138 ptr.write_volatile(val);
139 res
140 }
141
142 unsafe fn write_clear<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
143 let mut val = Default::default();
144 let res = f(&mut val);
145 let ptr = (self.ptr() as *mut u8).add(0x3000) as *mut T;
146 ptr.write_volatile(val);
147 res
148 }
149}