aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-09-27 21:13:53 +0200
committerDario Nieuwenhuis <[email protected]>2025-09-28 21:05:37 +0200
commit65a80f698e9087f09689a616a9f383c32b59ede8 (patch)
tree730154ac4023b63988c4db7bd603ab2e142e7fd7
parent00db482c2b701b6e8f7013ba63d6e1efe3b5c62d (diff)
nrf/ipc: erase instance generics
-rw-r--r--embassy-nrf/src/ipc.rs132
1 files changed, 70 insertions, 62 deletions
diff --git a/embassy-nrf/src/ipc.rs b/embassy-nrf/src/ipc.rs
index a8a08c911..a40c36c99 100644
--- a/embassy-nrf/src/ipc.rs
+++ b/embassy-nrf/src/ipc.rs
@@ -134,97 +134,99 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl
134 134
135/// IPC driver 135/// IPC driver
136#[non_exhaustive] 136#[non_exhaustive]
137pub struct Ipc<'d, T: Instance> { 137pub struct Ipc<'d> {
138 /// Event 0 138 /// Event 0
139 pub event0: Event<'d, T>, 139 pub event0: Event<'d>,
140 /// Event 1 140 /// Event 1
141 pub event1: Event<'d, T>, 141 pub event1: Event<'d>,
142 /// Event 2 142 /// Event 2
143 pub event2: Event<'d, T>, 143 pub event2: Event<'d>,
144 /// Event 3 144 /// Event 3
145 pub event3: Event<'d, T>, 145 pub event3: Event<'d>,
146 /// Event 4 146 /// Event 4
147 pub event4: Event<'d, T>, 147 pub event4: Event<'d>,
148 /// Event 5 148 /// Event 5
149 pub event5: Event<'d, T>, 149 pub event5: Event<'d>,
150 /// Event 6 150 /// Event 6
151 pub event6: Event<'d, T>, 151 pub event6: Event<'d>,
152 /// Event 7 152 /// Event 7
153 pub event7: Event<'d, T>, 153 pub event7: Event<'d>,
154 /// Event 8 154 /// Event 8
155 pub event8: Event<'d, T>, 155 pub event8: Event<'d>,
156 /// Event 9 156 /// Event 9
157 pub event9: Event<'d, T>, 157 pub event9: Event<'d>,
158 /// Event 10 158 /// Event 10
159 pub event10: Event<'d, T>, 159 pub event10: Event<'d>,
160 /// Event 11 160 /// Event 11
161 pub event11: Event<'d, T>, 161 pub event11: Event<'d>,
162 /// Event 12 162 /// Event 12
163 pub event12: Event<'d, T>, 163 pub event12: Event<'d>,
164 /// Event 13 164 /// Event 13
165 pub event13: Event<'d, T>, 165 pub event13: Event<'d>,
166 /// Event 14 166 /// Event 14
167 pub event14: Event<'d, T>, 167 pub event14: Event<'d>,
168 /// Event 15 168 /// Event 15
169 pub event15: Event<'d, T>, 169 pub event15: Event<'d>,
170} 170}
171 171
172impl<'d, T: Instance> Ipc<'d, T> { 172impl<'d> Ipc<'d> {
173 /// Create a new IPC driver. 173 /// Create a new IPC driver.
174 pub fn new( 174 pub fn new<T: Instance>(
175 _p: Peri<'d, T>, 175 _p: Peri<'d, T>,
176 _irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd, 176 _irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd,
177 ) -> Self { 177 ) -> Self {
178 T::Interrupt::unpend(); 178 T::Interrupt::unpend();
179 unsafe { T::Interrupt::enable() }; 179 unsafe { T::Interrupt::enable() };
180 180
181 let _phantom = PhantomData; 181 let r = T::regs();
182 let state = T::state();
182 #[rustfmt::skip] 183 #[rustfmt::skip]
183 let r = Self { // attributes on expressions are experimental 184 let result = Self { // attributes on expressions are experimental
184 event0: Event { number: EventNumber::Event0, _phantom }, 185 event0: Event { number: EventNumber::Event0, r, state, _phantom: PhantomData },
185 event1: Event { number: EventNumber::Event1, _phantom }, 186 event1: Event { number: EventNumber::Event1, r, state, _phantom: PhantomData },
186 event2: Event { number: EventNumber::Event2, _phantom }, 187 event2: Event { number: EventNumber::Event2, r, state, _phantom: PhantomData },
187 event3: Event { number: EventNumber::Event3, _phantom }, 188 event3: Event { number: EventNumber::Event3, r, state, _phantom: PhantomData },
188 event4: Event { number: EventNumber::Event4, _phantom }, 189 event4: Event { number: EventNumber::Event4, r, state, _phantom: PhantomData },
189 event5: Event { number: EventNumber::Event5, _phantom }, 190 event5: Event { number: EventNumber::Event5, r, state, _phantom: PhantomData },
190 event6: Event { number: EventNumber::Event6, _phantom }, 191 event6: Event { number: EventNumber::Event6, r, state, _phantom: PhantomData },
191 event7: Event { number: EventNumber::Event7, _phantom }, 192 event7: Event { number: EventNumber::Event7, r, state, _phantom: PhantomData },
192 event8: Event { number: EventNumber::Event8, _phantom }, 193 event8: Event { number: EventNumber::Event8, r, state, _phantom: PhantomData },
193 event9: Event { number: EventNumber::Event9, _phantom }, 194 event9: Event { number: EventNumber::Event9, r, state, _phantom: PhantomData },
194 event10: Event { number: EventNumber::Event10, _phantom }, 195 event10: Event { number: EventNumber::Event10, r, state, _phantom: PhantomData },
195 event11: Event { number: EventNumber::Event11, _phantom }, 196 event11: Event { number: EventNumber::Event11, r, state, _phantom: PhantomData },
196 event12: Event { number: EventNumber::Event12, _phantom }, 197 event12: Event { number: EventNumber::Event12, r, state, _phantom: PhantomData },
197 event13: Event { number: EventNumber::Event13, _phantom }, 198 event13: Event { number: EventNumber::Event13, r, state, _phantom: PhantomData },
198 event14: Event { number: EventNumber::Event14, _phantom }, 199 event14: Event { number: EventNumber::Event14, r, state, _phantom: PhantomData },
199 event15: Event { number: EventNumber::Event15, _phantom }, 200 event15: Event { number: EventNumber::Event15, r, state, _phantom: PhantomData },
200 }; 201 };
201 r 202 result
202 } 203 }
203} 204}
204 205
205/// IPC event 206/// IPC event
206pub struct Event<'d, T: Instance> { 207pub struct Event<'d> {
207 number: EventNumber, 208 number: EventNumber,
208 _phantom: PhantomData<&'d T>, 209 r: pac::ipc::Ipc,
210 state: &'static State,
211 _phantom: PhantomData<&'d ()>,
209} 212}
210 213
211impl<'d, T: Instance> Event<'d, T> { 214impl<'d> Event<'d> {
212 /// Trigger the event. 215 /// Trigger the event.
213 pub fn trigger(&self) { 216 pub fn trigger(&self) {
214 let nr = self.number; 217 let nr = self.number;
215 T::regs().tasks_send(nr as usize).write_value(1); 218 self.r.tasks_send(nr as usize).write_value(1);
216 } 219 }
217 220
218 /// Wait for the event to be triggered. 221 /// Wait for the event to be triggered.
219 pub async fn wait(&mut self) { 222 pub async fn wait(&mut self) {
220 let regs = T::regs();
221 let nr = self.number as usize; 223 let nr = self.number as usize;
222 regs.intenset().write(|w| w.0 = 1 << nr); 224 self.r.intenset().write(|w| w.0 = 1 << nr);
223 poll_fn(|cx| { 225 poll_fn(|cx| {
224 T::state().wakers[nr].register(cx.waker()); 226 self.state.wakers[nr].register(cx.waker());
225 227
226 if regs.events_receive(nr).read() == 1 { 228 if self.r.events_receive(nr).read() == 1 {
227 regs.events_receive(nr).write_value(0x00); 229 self.r.events_receive(nr).write_value(0x00);
228 Poll::Ready(()) 230 Poll::Ready(())
229 } else { 231 } else {
230 Poll::Pending 232 Poll::Pending
@@ -239,16 +241,17 @@ impl<'d, T: Instance> Event<'d, T> {
239 } 241 }
240 242
241 /// Create a handle that can trigger the event. 243 /// Create a handle that can trigger the event.
242 pub fn trigger_handle(&self) -> EventTrigger<'d, T> { 244 pub fn trigger_handle(&self) -> EventTrigger<'d> {
243 EventTrigger { 245 EventTrigger {
244 number: self.number, 246 number: self.number,
247 r: self.r,
245 _phantom: PhantomData, 248 _phantom: PhantomData,
246 } 249 }
247 } 250 }
248 251
249 /// Configure the channels the event will broadcast to 252 /// Configure the channels the event will broadcast to
250 pub fn configure_trigger<I: IntoIterator<Item = IpcChannel>>(&mut self, channels: I) { 253 pub fn configure_trigger<I: IntoIterator<Item = IpcChannel>>(&mut self, channels: I) {
251 T::regs().send_cnf(self.number as usize).write(|w| { 254 self.r.send_cnf(self.number as usize).write(|w| {
252 for channel in channels { 255 for channel in channels {
253 w.0 |= channel.mask(); 256 w.0 |= channel.mask();
254 } 257 }
@@ -257,7 +260,7 @@ impl<'d, T: Instance> Event<'d, T> {
257 260
258 /// Configure the channels the event will listen on 261 /// Configure the channels the event will listen on
259 pub fn configure_wait<I: IntoIterator<Item = IpcChannel>>(&mut self, channels: I) { 262 pub fn configure_wait<I: IntoIterator<Item = IpcChannel>>(&mut self, channels: I) {
260 T::regs().receive_cnf(self.number as usize).write(|w| { 263 self.r.receive_cnf(self.number as usize).write(|w| {
261 for channel in channels { 264 for channel in channels {
262 w.0 |= channel.mask(); 265 w.0 |= channel.mask();
263 } 266 }
@@ -267,22 +270,25 @@ impl<'d, T: Instance> Event<'d, T> {
267 /// Get the task for the IPC event to use with PPI. 270 /// Get the task for the IPC event to use with PPI.
268 pub fn task(&self) -> ppi::Task<'d> { 271 pub fn task(&self) -> ppi::Task<'d> {
269 let nr = self.number as usize; 272 let nr = self.number as usize;
270 let regs = T::regs(); 273 ppi::Task::from_reg(self.r.tasks_send(nr))
271 ppi::Task::from_reg(regs.tasks_send(nr))
272 } 274 }
273 275
274 /// Get the event for the IPC event to use with PPI. 276 /// Get the event for the IPC event to use with PPI.
275 pub fn event(&self) -> ppi::Event<'d> { 277 pub fn event(&self) -> ppi::Event<'d> {
276 let nr = self.number as usize; 278 let nr = self.number as usize;
277 let regs = T::regs(); 279 ppi::Event::from_reg(self.r.events_receive(nr))
278 ppi::Event::from_reg(regs.events_receive(nr))
279 } 280 }
280 281
281 /// Reborrow into a "child" Event. 282 /// Reborrow into a "child" Event.
282 /// 283 ///
283 /// `self` will stay borrowed until the child Event is dropped. 284 /// `self` will stay borrowed until the child Event is dropped.
284 pub fn reborrow(&mut self) -> Event<'_, T> { 285 pub fn reborrow(&mut self) -> Event<'_> {
285 Self { ..*self } 286 Event {
287 number: self.number,
288 r: self.r,
289 state: self.state,
290 _phantom: PhantomData,
291 }
286 } 292 }
287 293
288 /// Steal an IPC event by number. 294 /// Steal an IPC event by number.
@@ -290,9 +296,11 @@ impl<'d, T: Instance> Event<'d, T> {
290 /// # Safety 296 /// # Safety
291 /// 297 ///
292 /// The event number must not be in use by another [`Event`]. 298 /// The event number must not be in use by another [`Event`].
293 pub unsafe fn steal(number: EventNumber) -> Self { 299 pub unsafe fn steal<T: Instance>(number: EventNumber) -> Self {
294 Self { 300 Self {
295 number, 301 number,
302 r: T::regs(),
303 state: T::state(),
296 _phantom: PhantomData, 304 _phantom: PhantomData,
297 } 305 }
298 } 306 }
@@ -301,17 +309,17 @@ impl<'d, T: Instance> Event<'d, T> {
301/// A handle that can trigger an IPC event. 309/// A handle that can trigger an IPC event.
302/// 310///
303/// This `struct` is returned by [`Event::trigger_handle`]. 311/// This `struct` is returned by [`Event::trigger_handle`].
304#[derive(Debug, Copy, Clone)] 312pub struct EventTrigger<'d> {
305pub struct EventTrigger<'d, T: Instance> {
306 number: EventNumber, 313 number: EventNumber,
307 _phantom: PhantomData<&'d T>, 314 r: pac::ipc::Ipc,
315 _phantom: PhantomData<&'d ()>,
308} 316}
309 317
310impl<T: Instance> EventTrigger<'_, T> { 318impl EventTrigger<'_> {
311 /// Trigger the event. 319 /// Trigger the event.
312 pub fn trigger(&self) { 320 pub fn trigger(&self) {
313 let nr = self.number; 321 let nr = self.number;
314 T::regs().tasks_send(nr as usize).write_value(1); 322 self.r.tasks_send(nr as usize).write_value(1);
315 } 323 }
316 324
317 /// Returns the [`EventNumber`] of the event. 325 /// Returns the [`EventNumber`] of the event.