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
//! imxrt-ral-like API for USB access

pub mod usb;
pub mod usbphy;

pub use ral_registers::{modify_reg, read_reg, write_reg, RORegister, RWRegister};

use crate::Peripherals;

/// The RAL API requires us to treat all endpoint control registers as unique.
/// We can make it a little easier with this function, the `EndptCtrl` type,
/// and the helper module.
pub mod endpoint_control {
    use crate::ral;

    #[allow(non_snake_case)]
    pub struct EndptCtrl<'a> {
        pub ENDPTCTRL: &'a ral::RWRegister<u32>,
    }

    #[allow(non_snake_case)]
    pub mod ENDPTCTRL {
        pub use super::ral::usb::ENDPTCTRL1::*;
    }

    pub fn register(usb: &super::usb::Instance, endpoint: usize) -> EndptCtrl {
        EndptCtrl {
            ENDPTCTRL: match endpoint {
                0 => &usb.ENDPTCTRL0,
                1 => &usb.ENDPTCTRL1,
                2 => &usb.ENDPTCTRL2,
                3 => &usb.ENDPTCTRL3,
                4 => &usb.ENDPTCTRL4,
                5 => &usb.ENDPTCTRL5,
                6 => &usb.ENDPTCTRL6,
                7 => &usb.ENDPTCTRL7,
                _ => unreachable!("ENDPTCTRL register {} doesn't exist", endpoint),
            },
        }
    }
}

pub struct Instances {
    pub usb: usb::Instance,
    pub usbphy: usbphy::Instance,
}

/// Converts the core registers into a USB register block instance
pub fn instances<P: Peripherals>(peripherals: P) -> Instances {
    let usb = usb::Instance {
        addr: peripherals.usb().cast(),
    };
    let usbphy = usbphy::Instance {
        addr: peripherals.usbphy().cast(),
    };
    Instances { usb, usbphy }
}