Skip to main content

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