Skip to main content

crab_usb/backend/ty/ep/
bulk.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 EndpointBulkIn {
10    pub(crate) raw: EndpointBase,
11}
12
13impl EndpointBulkIn {
14    pub async fn submit_and_wait(&mut self, buff: &mut [u8]) -> Result<usize, TransferError> {
15        let t = self.submit(buff)?.await?;
16        let n = t.transfer_len;
17        Ok(n)
18    }
19
20    pub fn submit(&mut self, buff: &mut [u8]) -> Result<TransferHandle<'_>, TransferError> {
21        let buff = if buff.is_empty() {
22            None
23        } else {
24            Some((NonNull::new(buff.as_mut_ptr()).unwrap(), buff.len()))
25        };
26
27        let transfer = self
28            .raw
29            .new_transfer(TransferKind::Bulk, Direction::In, buff);
30
31        self.raw.submit(transfer)
32    }
33}
34
35impl From<EndpointBase> for EndpointBulkIn {
36    fn from(raw: EndpointBase) -> Self {
37        Self { raw }
38    }
39}
40
41pub struct EndpointBulkOut {
42    pub(crate) raw: EndpointBase,
43}
44
45impl EndpointBulkOut {
46    pub async fn submit_and_wait(&mut self, buff: &[u8]) -> Result<usize, TransferError> {
47        let t = self.submit(buff)?.await?;
48        let n = t.transfer_len;
49        Ok(n)
50    }
51
52    pub fn submit(&mut self, buff: &[u8]) -> Result<TransferHandle<'_>, TransferError> {
53        let buff = if buff.is_empty() {
54            None
55        } else {
56            Some((NonNull::new(buff.as_ptr() as *mut u8).unwrap(), buff.len()))
57        };
58        let transfer = self
59            .raw
60            .new_transfer(TransferKind::Bulk, Direction::Out, buff);
61
62        self.raw.submit(transfer)
63    }
64}
65
66impl From<EndpointBase> for EndpointBulkOut {
67    fn from(raw: EndpointBase) -> Self {
68        Self { raw }
69    }
70}