crab_usb/backend/ty/ep/
iso.rs1use core::ptr::NonNull;
2
3use usb_if::{err::TransferError, transfer::Direction};
4
5use crate::backend::ty::{ep::TransferHandle, transfer::TransferKind};
6
7use super::EndpointBase;
8
9pub struct EndpointIsoIn {
10 pub(crate) raw: EndpointBase,
11}
12
13impl EndpointIsoIn {
14 pub async fn submit_and_wait(
15 &mut self,
16 packets: &mut [u8],
17 num_packets: usize,
18 ) -> Result<usize, TransferError> {
19 let t = self.submit(packets, num_packets)?.await?;
20 let n = t.transfer_len;
21 Ok(n)
22 }
23
24 pub fn submit(
25 &mut self,
26 packets: &mut [u8],
27 num_packets: usize,
28 ) -> Result<TransferHandle<'_>, TransferError> {
29 let buff = if packets.is_empty() {
30 None
31 } else {
32 Some((NonNull::new(packets.as_mut_ptr()).unwrap(), packets.len()))
33 };
34
35 let transfer = self.raw.new_transfer(
36 TransferKind::Isochronous {
37 num_pkgs: num_packets,
38 },
39 Direction::In,
40 buff,
41 );
42
43 self.raw.submit(transfer)
44 }
45}
46
47impl From<EndpointBase> for EndpointIsoIn {
48 fn from(raw: EndpointBase) -> Self {
49 Self { raw }
50 }
51}
52
53pub struct EndpointIsoOut {
54 pub(crate) raw: EndpointBase,
55}
56
57impl EndpointIsoOut {
58 pub async fn submit_and_wait(
59 &mut self,
60 packets: &[u8],
61 num_packets: usize,
62 ) -> Result<usize, TransferError> {
63 let t = self.submit(packets, num_packets)?.await?;
64 let n = t.transfer_len;
65 Ok(n)
66 }
67
68 pub fn submit(
69 &mut self,
70 packets: &[u8],
71 num_packets: usize,
72 ) -> Result<TransferHandle<'_>, TransferError> {
73 let buff = if packets.is_empty() {
74 None
75 } else {
76 Some((
77 NonNull::new(packets.as_ptr() as *mut u8).unwrap(),
78 packets.len(),
79 ))
80 };
81 let transfer = self.raw.new_transfer(
82 TransferKind::Isochronous {
83 num_pkgs: num_packets,
84 },
85 Direction::Out,
86 buff,
87 );
88 self.raw.submit(transfer)
89 }
90}
91
92impl From<EndpointBase> for EndpointIsoOut {
93 fn from(raw: EndpointBase) -> Self {
94 Self { raw }
95 }
96}