imxrt_usbd/
ral.rs

1//! imxrt-ral-like API for USB access
2
3pub mod usb;
4pub mod usbphy;
5
6pub use ral_registers::{modify_reg, read_reg, write_reg, RORegister, RWRegister};
7
8use crate::Peripherals;
9
10/// The RAL API requires us to treat all endpoint control registers as unique.
11/// We can make it a little easier with this function, the `EndptCtrl` type,
12/// and the helper module.
13pub mod endpoint_control {
14    use crate::ral;
15
16    #[allow(non_snake_case)]
17    pub struct EndptCtrl<'a> {
18        pub ENDPTCTRL: &'a ral::RWRegister<u32>,
19    }
20
21    #[allow(non_snake_case)]
22    pub mod ENDPTCTRL {
23        pub use super::ral::usb::ENDPTCTRL1::*;
24    }
25
26    pub fn register(usb: &super::usb::Instance, endpoint: usize) -> EndptCtrl {
27        EndptCtrl {
28            ENDPTCTRL: match endpoint {
29                0 => &usb.ENDPTCTRL0,
30                1 => &usb.ENDPTCTRL1,
31                2 => &usb.ENDPTCTRL2,
32                3 => &usb.ENDPTCTRL3,
33                4 => &usb.ENDPTCTRL4,
34                5 => &usb.ENDPTCTRL5,
35                6 => &usb.ENDPTCTRL6,
36                7 => &usb.ENDPTCTRL7,
37                _ => unreachable!("ENDPTCTRL register {} doesn't exist", endpoint),
38            },
39        }
40    }
41}
42
43pub struct Instances {
44    pub usb: usb::Instance,
45    pub usbphy: usbphy::Instance,
46}
47
48/// Converts the core registers into a USB register block instance
49pub fn instances<P: Peripherals>(peripherals: P) -> Instances {
50    let usb = usb::Instance {
51        addr: peripherals.usb().cast(),
52    };
53    let usbphy = usbphy::Instance {
54        addr: peripherals.usbphy().cast(),
55    };
56    Instances { usb, usbphy }
57}