Skip to main content

crab_usb/backend/ty/ep/
iso.rs

1use 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}