stm32_usbd/
registers.rs

1use crate::pac::usb::{RegisterBlock, EPR};
2use crate::UsbPeripheral;
3use core::marker::PhantomData;
4
5/// A proxy type that provides unified register interface
6pub struct UsbRegisters<USB> {
7    _marker: PhantomData<USB>,
8}
9
10impl<USB: UsbPeripheral> core::ops::Deref for UsbRegisters<USB> {
11    type Target = RegisterBlock;
12
13    fn deref(&self) -> &Self::Target {
14        let ptr = USB::REGISTERS as *const Self::Target;
15        unsafe { &*ptr }
16    }
17}
18
19impl<USB: UsbPeripheral> UsbRegisters<USB> {
20    pub fn new() -> Self {
21        Self { _marker: PhantomData }
22    }
23
24    pub fn ep_register(index: u8) -> &'static EPR {
25        let usb_ptr = USB::REGISTERS as *const RegisterBlock;
26        unsafe { &(*usb_ptr).epr[index as usize] }
27    }
28}