aboutsummaryrefslogtreecommitdiff
path: root/embassy-usb/src/class
diff options
context:
space:
mode:
authorIsaikin Roman <[email protected]>2023-08-20 07:42:54 +0200
committerIsaikin Roman <[email protected]>2023-08-20 07:42:54 +0200
commit17e9a8ebe13a254417d323b0f634d18eb81caa3d (patch)
tree1fb7218d8f68ef97937eee75e8cfe79bb3d04b99 /embassy-usb/src/class
parent6babd5752e439b234151104d8d20bae32e41d714 (diff)
Fix hardcoded buffer length in USB NCM causing broken link on USB 2.0.
Diffstat (limited to 'embassy-usb/src/class')
-rw-r--r--embassy-usb/src/class/cdc_ncm/mod.rs21
1 files changed, 13 insertions, 8 deletions
diff --git a/embassy-usb/src/class/cdc_ncm/mod.rs b/embassy-usb/src/class/cdc_ncm/mod.rs
index fcfa0bfcd..830e9b768 100644
--- a/embassy-usb/src/class/cdc_ncm/mod.rs
+++ b/embassy-usb/src/class/cdc_ncm/mod.rs
@@ -248,6 +248,8 @@ pub struct CdcNcmClass<'d, D: Driver<'d>> {
248 write_ep: D::EndpointIn, 248 write_ep: D::EndpointIn,
249 249
250 _control: &'d ControlShared, 250 _control: &'d ControlShared,
251
252 max_packet_size: usize,
251} 253}
252 254
253impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> { 255impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> {
@@ -338,6 +340,7 @@ impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> {
338 read_ep, 340 read_ep,
339 write_ep, 341 write_ep,
340 _control: &state.shared, 342 _control: &state.shared,
343 max_packet_size: max_packet_size as usize,
341 } 344 }
342 } 345 }
343 346
@@ -349,6 +352,7 @@ impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> {
349 Sender { 352 Sender {
350 write_ep: self.write_ep, 353 write_ep: self.write_ep,
351 seq: 0, 354 seq: 0,
355 max_packet_size: self.max_packet_size,
352 }, 356 },
353 Receiver { 357 Receiver {
354 data_if: self.data_if, 358 data_if: self.data_if,
@@ -365,6 +369,7 @@ impl<'d, D: Driver<'d>> CdcNcmClass<'d, D> {
365pub struct Sender<'d, D: Driver<'d>> { 369pub struct Sender<'d, D: Driver<'d>> {
366 write_ep: D::EndpointIn, 370 write_ep: D::EndpointIn,
367 seq: u16, 371 seq: u16,
372 max_packet_size: usize,
368} 373}
369 374
370impl<'d, D: Driver<'d>> Sender<'d, D> { 375impl<'d, D: Driver<'d>> Sender<'d, D> {
@@ -375,8 +380,8 @@ impl<'d, D: Driver<'d>> Sender<'d, D> {
375 let seq = self.seq; 380 let seq = self.seq;
376 self.seq = self.seq.wrapping_add(1); 381 self.seq = self.seq.wrapping_add(1);
377 382
378 const MAX_PACKET_SIZE: usize = 64; // TODO unhardcode
379 const OUT_HEADER_LEN: usize = 28; 383 const OUT_HEADER_LEN: usize = 28;
384 const ABS_MAX_PACKET_SIZE: usize = 512;
380 385
381 let header = NtbOutHeader { 386 let header = NtbOutHeader {
382 nth_sig: SIG_NTH, 387 nth_sig: SIG_NTH,
@@ -395,27 +400,27 @@ impl<'d, D: Driver<'d>> Sender<'d, D> {
395 }; 400 };
396 401
397 // Build first packet on a buffer, send next packets straight from `data`. 402 // Build first packet on a buffer, send next packets straight from `data`.
398 let mut buf = [0; MAX_PACKET_SIZE]; 403 let mut buf = [0; ABS_MAX_PACKET_SIZE];
399 let n = byteify(&mut buf, header); 404 let n = byteify(&mut buf, header);
400 assert_eq!(n.len(), OUT_HEADER_LEN); 405 assert_eq!(n.len(), OUT_HEADER_LEN);
401 406
402 if OUT_HEADER_LEN + data.len() < MAX_PACKET_SIZE { 407 if OUT_HEADER_LEN + data.len() < self.max_packet_size {
403 // First packet is not full, just send it. 408 // First packet is not full, just send it.
404 // No need to send ZLP because it's short for sure. 409 // No need to send ZLP because it's short for sure.
405 buf[OUT_HEADER_LEN..][..data.len()].copy_from_slice(data); 410 buf[OUT_HEADER_LEN..][..data.len()].copy_from_slice(data);
406 self.write_ep.write(&buf[..OUT_HEADER_LEN + data.len()]).await?; 411 self.write_ep.write(&buf[..OUT_HEADER_LEN + data.len()]).await?;
407 } else { 412 } else {
408 let (d1, d2) = data.split_at(MAX_PACKET_SIZE - OUT_HEADER_LEN); 413 let (d1, d2) = data.split_at(self.max_packet_size - OUT_HEADER_LEN);
409 414
410 buf[OUT_HEADER_LEN..].copy_from_slice(d1); 415 buf[OUT_HEADER_LEN..self.max_packet_size].copy_from_slice(d1);
411 self.write_ep.write(&buf).await?; 416 self.write_ep.write(&buf[..self.max_packet_size]).await?;
412 417
413 for chunk in d2.chunks(MAX_PACKET_SIZE) { 418 for chunk in d2.chunks(self.max_packet_size) {
414 self.write_ep.write(&chunk).await?; 419 self.write_ep.write(&chunk).await?;
415 } 420 }
416 421
417 // Send ZLP if needed. 422 // Send ZLP if needed.
418 if d2.len() % MAX_PACKET_SIZE == 0 { 423 if d2.len() % self.max_packet_size == 0 {
419 self.write_ep.write(&[]).await?; 424 self.write_ep.write(&[]).await?;
420 } 425 }
421 } 426 }