aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2025-09-05 16:56:35 +0200
committerGitHub <[email protected]>2025-09-05 16:56:35 +0200
commitbd9bb7b9e8ff734e8374b1b39afec2923b4338e6 (patch)
tree2f12f6e4e37c86ee80347511f0d156c06314e632
parent6438068c162298e1820875f31f61bae6a7e994d5 (diff)
parentcac396425228464602ab9ee0816f4f9f07d53d77 (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.md2
-rw-r--r--embassy-usb-synopsys-otg/src/lib.rs30
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