stm32_rust_template/driver/usb/
mod.rs

1#![allow(dead_code)]
2
3use bitflags::bitflags;
4
5/// USB Role
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum UsbRole {
8    None = 0,
9    Host = 1,
10    Device = 2,
11}
12
13/// USB Signal Pins
14bitflags! {
15    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
16    pub struct UsbPin: u32 {
17        const DP    = 1 << 0;  // USB D+
18        const DM    = 1 << 1;  // USB D-
19        const VBUS  = 1 << 2;  // USB VBUS
20        const OC    = 1 << 3;  // OverCurrent
21        const ID    = 1 << 4;  // USB ID
22    }
23}
24
25/// USB Speeds
26#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub enum UsbSpeed {
28    Low = 0,
29    Full = 1,
30    High = 2,
31}
32
33/// USB PID Types
34#[derive(Debug, Clone, Copy, PartialEq, Eq)]
35#[repr(u8)]
36pub enum UsbPid {
37    Reserved = 0,
38    Out = 1,
39    Ack = 2,
40    Data0 = 3,
41    Ping = 4,
42    Sof = 5,
43    Nyet = 6,
44    Data2 = 7,
45    Split = 8,
46    In = 9,
47    Nak = 10,
48    Data1 = 11,
49    Err = 12,
50    Setup = 13,
51    Stall = 14,
52    Mdata = 15,
53}
54
55/// Endpoint address helpers
56pub mod endpoint {
57    pub const NUMBER_MASK: u8 = 0x0F;
58    pub const DIRECTION_MASK: u8 = 0x80;
59
60    #[inline]
61    pub fn address(number: u8, direction_in: bool) -> u8 {
62        (number & NUMBER_MASK) | if direction_in { DIRECTION_MASK } else { 0 }
63    }
64
65    #[inline]
66    pub fn number(address: u8) -> u8 {
67        address & NUMBER_MASK
68    }
69
70    #[inline]
71    pub fn is_in(address: u8) -> bool {
72        address & DIRECTION_MASK != 0
73    }
74}
75
76/// Endpoint types
77#[derive(Debug, Clone, Copy, PartialEq, Eq)]
78pub enum EndpointType {
79    Control = 0,
80    Isochronous = 1,
81    Bulk = 2,
82    Interrupt = 3,
83}
84
85/// Endpoint packet size helpers
86pub mod packet_size {
87    pub const MAX_PACKET_SIZE_MASK: u16 = 0x07FF;
88
89    pub const MICROFRAME_TRANSACTIONS_MASK: u16 = 0x1800;
90    pub const MICROFRAME_TRANSACTIONS_1: u16 = 0x0000;
91    pub const MICROFRAME_TRANSACTIONS_2: u16 = 0x0800;
92    pub const MICROFRAME_TRANSACTIONS_3: u16 = 0x1000;
93}
94
95pub mod device;
96pub mod host;