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