diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-09-05 16:56:35 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-09-05 16:56:35 +0200 |
| commit | bd9bb7b9e8ff734e8374b1b39afec2923b4338e6 (patch) | |
| tree | 2f12f6e4e37c86ee80347511f0d156c06314e632 | |
| parent | 6438068c162298e1820875f31f61bae6a7e994d5 (diff) | |
| parent | cac396425228464602ab9ee0816f4f9f07d53d77 (diff) | |
Merge pull request #4566 from mkj/pr/otg-rx
otg: Use chunks_exact for more efficient rx copy
| -rw-r--r-- | embassy-usb-synopsys-otg/CHANGELOG.md | 2 | ||||
| -rw-r--r-- | embassy-usb-synopsys-otg/src/lib.rs | 30 |
2 files changed, 18 insertions, 14 deletions
diff --git a/embassy-usb-synopsys-otg/CHANGELOG.md b/embassy-usb-synopsys-otg/CHANGELOG.md index 9ca90f5e9..45353d907 100644 --- a/embassy-usb-synopsys-otg/CHANGELOG.md +++ b/embassy-usb-synopsys-otg/CHANGELOG.md | |||
| @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 10 | 10 | ||
| 11 | ## 0.3.1 - 2025-08-26 | 11 | ## 0.3.1 - 2025-08-26 |
| 12 | 12 | ||
| 13 | - Improve receive performance, more efficient copy from FIFO | ||
| 14 | |||
| 13 | ## 0.3.0 - 2025-07-22 | 15 | ## 0.3.0 - 2025-07-22 |
| 14 | 16 | ||
| 15 | - Bump `embassy-usb-driver` to v0.2.0 | 17 | - Bump `embassy-usb-driver` to v0.2.0 |
diff --git a/embassy-usb-synopsys-otg/src/lib.rs b/embassy-usb-synopsys-otg/src/lib.rs index 9d74c046d..6b4a87bdf 100644 --- a/embassy-usb-synopsys-otg/src/lib.rs +++ b/embassy-usb-synopsys-otg/src/lib.rs | |||
| @@ -76,10 +76,16 @@ pub unsafe fn on_interrupt<const MAX_EP_COUNT: usize>(r: Otg, state: &State<MAX_ | |||
| 76 | let buf = | 76 | let buf = |
| 77 | unsafe { core::slice::from_raw_parts_mut(*state.ep_states[ep_num].out_buffer.get(), len) }; | 77 | unsafe { core::slice::from_raw_parts_mut(*state.ep_states[ep_num].out_buffer.get(), len) }; |
| 78 | 78 | ||
| 79 | for chunk in buf.chunks_mut(4) { | 79 | let mut chunks = buf.chunks_exact_mut(4); |
| 80 | for chunk in &mut chunks { | ||
| 80 | // RX FIFO is shared so always read from fifo(0) | 81 | // RX FIFO is shared so always read from fifo(0) |
| 81 | let data = r.fifo(0).read().0; | 82 | let data = r.fifo(0).read().0; |
| 82 | chunk.copy_from_slice(&data.to_ne_bytes()[0..chunk.len()]); | 83 | chunk.copy_from_slice(&data.to_ne_bytes()); |
| 84 | } | ||
| 85 | let rem = chunks.into_remainder(); | ||
| 86 | if !rem.is_empty() { | ||
| 87 | let data = r.fifo(0).read().0; | ||
| 88 | rem.copy_from_slice(&data.to_ne_bytes()[0..rem.len()]); | ||
| 83 | } | 89 | } |
| 84 | 90 | ||
| 85 | state.ep_states[ep_num].out_size.store(len as u16, Ordering::Release); | 91 | state.ep_states[ep_num].out_size.store(len as u16, Ordering::Release); |
| @@ -1229,23 +1235,19 @@ impl<'d> embassy_usb_driver::EndpointIn for Endpoint<'d, In> { | |||
| 1229 | }); | 1235 | }); |
| 1230 | 1236 | ||
| 1231 | // Write data to FIFO | 1237 | // Write data to FIFO |
| 1232 | let chunks = buf.chunks_exact(4); | ||
| 1233 | // Stash the last partial chunk | ||
| 1234 | let rem = chunks.remainder(); | ||
| 1235 | let last_chunk = (!rem.is_empty()).then(|| { | ||
| 1236 | let mut tmp = [0u8; 4]; | ||
| 1237 | tmp[0..rem.len()].copy_from_slice(rem); | ||
| 1238 | u32::from_ne_bytes(tmp) | ||
| 1239 | }); | ||
| 1240 | |||
| 1241 | let fifo = self.regs.fifo(index); | 1238 | let fifo = self.regs.fifo(index); |
| 1242 | for chunk in chunks { | 1239 | let mut chunks = buf.chunks_exact(4); |
| 1240 | for chunk in &mut chunks { | ||
| 1243 | let val = u32::from_ne_bytes(chunk.try_into().unwrap()); | 1241 | let val = u32::from_ne_bytes(chunk.try_into().unwrap()); |
| 1244 | fifo.write_value(regs::Fifo(val)); | 1242 | fifo.write_value(regs::Fifo(val)); |
| 1245 | } | 1243 | } |
| 1246 | // Write any last chunk | 1244 | // Write any last chunk |
| 1247 | if let Some(val) = last_chunk { | 1245 | let rem = chunks.remainder(); |
| 1248 | fifo.write_value(regs::Fifo(val)); | 1246 | if !rem.is_empty() { |
| 1247 | let mut tmp = [0u8; 4]; | ||
| 1248 | tmp[0..rem.len()].copy_from_slice(rem); | ||
| 1249 | let tmp = u32::from_ne_bytes(tmp); | ||
| 1250 | fifo.write_value(regs::Fifo(tmp)); | ||
| 1249 | } | 1251 | } |
| 1250 | }); | 1252 | }); |
| 1251 | 1253 | ||
