1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
//! USB peripheral driver for Synopsys USB OTG peripherals.
#![no_std]
#[cfg(all(feature = "fs", feature = "hs"))]
compile_error!("choose only one USB mode");
#[cfg(not(any(feature = "fs", feature ="hs")))]
compile_error!("select USB mode feature (fs/hs)");
mod endpoint;
mod endpoint_memory;
mod target;
/// USB peripheral driver.
pub mod bus;
pub use crate::bus::UsbBus;
mod ral;
mod transition;
/// A trait for device-specific USB peripherals. Implement this to add support for a new hardware
/// platform. Peripherals that have this trait must have the same register block as STM32 USB OTG
/// peripherals.
pub unsafe trait UsbPeripheral: Send + Sync {
/// Pointer to the register block
const REGISTERS: *const ();
/// true for High Speed variants of the peripheral, false for Full Speed
const HIGH_SPEED: bool;
/// FIFO size in 32-bit words
const FIFO_DEPTH_WORDS: usize;
/// Number of (bidirectional) endpoints
const ENDPOINT_COUNT: usize;
/// Enables USB device on its peripheral bus
fn enable();
/// AHB frequency in hertz
fn ahb_frequency_hz(&self) -> u32;
/// Returns PHY type that should be used for USB peripheral
fn phy_type(&self) -> PhyType { PhyType::InternalFullSpeed }
/// Performs initial setup of the internal high-speed PHY
///
/// This function should turn on LDO and PLL and wait for PHY clock to become stable.
fn setup_internal_hs_phy(&self) {}
}
/// USB PHY type
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum PhyType {
/// Internal Full-Speed PHY
///
/// Available on most High-Speed peripherals.
InternalFullSpeed,
/// Internal High-Speed PHY
///
/// Available on a few STM32 chips.
InternalHighSpeed,
/// External ULPI High-Speed PHY
ExternalHighSpeed,
}