crab_usb/backend/ty/
mod.rs1#[cfg(any(kmod, umod))]
2use alloc::{boxed::Box, collections::BTreeMap, vec::Vec};
3use core::{any::Any, fmt::Debug};
4
5use futures::future::BoxFuture;
6use usb_if::descriptor::{ConfigurationDescriptor, DeviceDescriptor};
7
8use crate::{backend::ty::ep::EndpointHandle, err::USBError};
9
10pub mod ep;
11#[cfg(any(kmod, umod))]
12pub mod transfer;
13
14#[derive(Debug, Clone)]
15pub enum Event {
16 Nothing,
17 PortChange { port: u8 },
18 TransferActivity { count: usize },
19 Stopped,
20}
21
22pub(crate) trait EventHandlerOp: Send + Any + Sync + 'static {
23 fn handle_event(&self) -> Event;
24}
25
26#[allow(dead_code)]
27pub(crate) trait DeviceInfoOp: Send + Sync + Any + Debug + 'static {
28 fn id(&self) -> usize;
29 fn backend_name(&self) -> &str;
30 fn descriptor(&self) -> &DeviceDescriptor;
31 fn configuration_descriptors(&self) -> &[ConfigurationDescriptor];
32}
33
34#[cfg(any(kmod, umod))]
35pub enum ProbedDeviceInfoOp {
36 Device(Box<dyn DeviceInfoOp>),
37 Hub(Box<dyn DeviceInfoOp>),
38}
39
40#[cfg(any(kmod, umod))]
41pub struct ProbeChangesOp {
42 pub connected: Vec<ProbedDeviceInfoOp>,
43 pub disconnected: Vec<usize>,
44}
45
46pub(crate) trait DeviceOp: Send + Any + 'static {
48 fn id(&self) -> usize;
49 fn backend_name(&self) -> &str;
50 fn descriptor(&self) -> &DeviceDescriptor;
51 fn configuration_descriptors(&self) -> &[ConfigurationDescriptor];
52
53 fn ctrl_ep_ref(&self) -> &EndpointHandle;
54
55 fn ctrl_ep_mut(&mut self) -> &mut EndpointHandle;
56
57 fn claim_interface<'a>(
58 &'a mut self,
59 interface: u8,
60 alternate: u8,
61 ) -> BoxFuture<'a, Result<BTreeMap<u8, EndpointHandle>, USBError>>;
62
63 fn release_interface<'a>(&'a mut self, interface: u8) -> BoxFuture<'a, Result<(), USBError>>;
64
65 fn set_configuration<'a>(
66 &'a mut self,
67 configuration_value: u8,
68 ) -> BoxFuture<'a, Result<(), USBError>>;
69
70 fn disconnect(&mut self) -> BoxFuture<'_, Result<(), USBError>>;
72
73 fn update_hub(&mut self, params: HubParams) -> BoxFuture<'_, Result<(), USBError>>;
74}
75
76#[derive(Debug, Clone)]
77pub struct HubParams {
78 pub num_ports: u8,
80
81 pub multi_tt: bool,
83
84 pub tt_think_time_ns: u16,
87
88 pub parent_hub_slot_id: u8,
90
91 pub root_hub_port_number: u8,
93}