Skip to main content

crab_usb/backend/ty/
mod.rs

1#[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
46/// USB 设备特征(高层抽象)
47pub(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    /// Stops every endpoint owned by this device without issuing USB control requests.
71    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    /// Hub 端口数量
79    pub num_ports: u8,
80
81    /// 是否为 Multi-TT Hub
82    pub multi_tt: bool,
83
84    /// TT 思考时间(单位:纳秒)
85    /// 8 FS bit times = 666ns
86    pub tt_think_time_ns: u16,
87
88    /// 父 Hub Slot ID(0 表示 Root Hub)
89    pub parent_hub_slot_id: u8,
90
91    /// Root Hub 端口号
92    pub root_hub_port_number: u8,
93}