crab_usb/backend/ty/ep/
int.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 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 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}