diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-09-27 21:13:53 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2025-09-28 21:05:37 +0200 |
| commit | 65a80f698e9087f09689a616a9f383c32b59ede8 (patch) | |
| tree | 730154ac4023b63988c4db7bd603ab2e142e7fd7 /embassy-nrf | |
| parent | 00db482c2b701b6e8f7013ba63d6e1efe3b5c62d (diff) | |
nrf/ipc: erase instance generics
Diffstat (limited to 'embassy-nrf')
| -rw-r--r-- | embassy-nrf/src/ipc.rs | 132 |
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] |
| 137 | pub struct Ipc<'d, T: Instance> { | 137 | pub 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 | ||
| 172 | impl<'d, T: Instance> Ipc<'d, T> { | 172 | impl<'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 |
| 206 | pub struct Event<'d, T: Instance> { | 207 | pub 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 | ||
| 211 | impl<'d, T: Instance> Event<'d, T> { | 214 | impl<'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)] | 312 | pub struct EventTrigger<'d> { |
| 305 | pub 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 | ||
| 310 | impl<T: Instance> EventTrigger<'_, T> { | 318 | impl 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. |
