upc/
lib.rs

1//! # USB packet channel (UPC)
2//!
3//! This library provides a reliable, packet-based transport over a physical USB connection
4//! with an asynchronous API.
5//!
6
7#![deny(unsafe_code)]
8#![warn(missing_docs)]
9#![cfg_attr(docsrs, feature(doc_auto_cfg))]
10
11#[cfg(feature = "device")]
12pub mod device;
13
14#[cfg(any(feature = "host", feature = "web"))]
15pub mod host;
16
17/// Maximum info size.
18pub const INFO_SIZE: usize = 4096;
19
20/// Default maximum packet size.
21pub const MAX_SIZE: usize = 16_777_216;
22
23/// USB interface class.
24#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
25pub struct Class {
26    /// Class code.
27    pub class: u8,
28    /// Subclass code.
29    pub sub_class: u8,
30    /// Protocol code.
31    pub protocol: u8,
32}
33
34impl Class {
35    /// Vendor specific class code.
36    pub const VENDOR_SPECIFIC: u8 = 0xff;
37
38    /// Creates a new USB device or interface class.
39    pub const fn new(class: u8, sub_class: u8, protocol: u8) -> Self {
40        Self { class, sub_class, protocol }
41    }
42
43    /// Creates a new USB device or interface class with vendor-specific class code.
44    pub const fn vendor_specific(sub_class: u8, protocol: u8) -> Self {
45        Self::new(Self::VENDOR_SPECIFIC, sub_class, protocol)
46    }
47}
48
49#[cfg(feature = "device")]
50impl From<Class> for usb_gadget::Class {
51    fn from(Class { class, sub_class, protocol }: Class) -> Self {
52        usb_gadget::Class { class, sub_class, protocol }
53    }
54}
55
56#[allow(dead_code)]
57const CTRL_REQ_OPEN: u8 = 1;
58#[allow(dead_code)]
59const CTRL_REQ_CLOSE: u8 = 2;
60#[allow(dead_code)]
61const CTRL_REQ_INFO: u8 = 3;