use crate::{hal, pins, ral};
use core::sync::atomic::{AtomicBool, Ordering};
pub use hal::lpspi::Pins as LpspiPins;
pub use ral::Instances;
pub fn instances() -> Instances {
static TAKEN: AtomicBool = AtomicBool::new(false);
assert!(!TAKEN.swap(true, Ordering::SeqCst));
unsafe { Instances::instances() }
}
pub use crate::clock_power::*;
pub type T40Resources = Resources<pins::t40::Pins>;
pub type T41Resources = Resources<pins::t41::Pins>;
pub type TMMResources = Resources<pins::tmm::Pins>;
#[non_exhaustive]
pub struct Resources<Pins> {
pub pit: hal::pit::Channels,
pub gpt1: hal::gpt::Gpt1,
pub gpt2: hal::gpt::Gpt2,
pub gpio1: hal::gpio::Port<1>,
pub gpio2: hal::gpio::Port<2>,
pub gpio3: hal::gpio::Port<3>,
pub gpio4: hal::gpio::Port<4>,
pub usb: hal::usbd::Instances<1>,
pub dma: [Option<hal::dma::channel::Channel>; hal::dma::CHANNEL_COUNT],
pub srtc: hal::snvs::srtc::Disabled,
pub snvs_lp_core: hal::snvs::LpCore,
pub ccm: ral::ccm::CCM,
pub ccm_analog: ral::ccm_analog::CCM_ANALOG,
pub dcdc: ral::dcdc::DCDC,
pub pins: Pins,
pub lpi2c1: ral::lpi2c::LPI2C1,
pub lpi2c3: ral::lpi2c::LPI2C3,
pub lpspi4: ral::lpspi::LPSPI4,
pub lpuart6: ral::lpuart::LPUART6,
pub lpuart4: ral::lpuart::LPUART4,
pub lpuart2: ral::lpuart::LPUART2,
pub lpuart3: ral::lpuart::LPUART3,
pub lpuart8: ral::lpuart::LPUART8,
pub lpuart1: ral::lpuart::LPUART1,
pub flexpwm1: (hal::flexpwm::Pwm<1>, hal::flexpwm::Submodules<1>),
pub flexpwm2: (hal::flexpwm::Pwm<2>, hal::flexpwm::Submodules<2>),
pub flexpwm3: (hal::flexpwm::Pwm<3>, hal::flexpwm::Submodules<3>),
pub flexpwm4: (hal::flexpwm::Pwm<4>, hal::flexpwm::Submodules<4>),
pub flexio1: ral::flexio::FLEXIO1,
pub flexio2: ral::flexio::FLEXIO2,
pub flexio3: ral::flexio::FLEXIO3,
pub adc1: hal::adc::Adc<1>,
pub adc2: hal::adc::Adc<2>,
pub trng: hal::trng::Trng,
pub tempmon: hal::tempmon::TempMon,
}
pub type Led = hal::gpio::Output<pins::common::P13>;
pub fn led(gpio2: &mut hal::gpio::Port<2>, p13: pins::common::P13) -> Led {
gpio2.output(p13)
}
pub fn lpi2c<Scl, Sda, const N: u8>(
instance: ral::lpi2c::Instance<N>,
scl: Scl,
sda: Sda,
clock_speed: Lpi2cClockSpeed,
) -> hal::lpi2c::Lpi2c<hal::lpi2c::Pins<Scl, Sda>, N>
where
Scl: hal::iomuxc::lpi2c::Pin<
Signal = hal::iomuxc::lpi2c::Scl,
Module = hal::iomuxc::consts::Const<N>,
>,
Sda: hal::iomuxc::lpi2c::Pin<
Signal = hal::iomuxc::lpi2c::Sda,
Module = hal::iomuxc::consts::Const<N>,
>,
{
hal::lpi2c::Lpi2c::new(
instance,
hal::lpi2c::Pins { scl, sda },
&lpi2c_baud(clock_speed),
)
}
pub type Lpi2c1 = hal::lpi2c::Lpi2c<hal::lpi2c::Pins<pins::common::P19, pins::common::P18>, 1>;
pub type Lpi2c3 = hal::lpi2c::Lpi2c<hal::lpi2c::Pins<pins::common::P16, pins::common::P17>, 3>;
pub type Lpspi4 = hal::lpspi::Lpspi<
LpspiPins<pins::common::P11, pins::common::P12, pins::common::P13, pins::common::P10>,
4,
>;
pub fn lpspi<Sdo, Sdi, Sck, Pcs0, const N: u8>(
instance: ral::lpspi::Instance<N>,
pins: LpspiPins<Sdo, Sdi, Sck, Pcs0>,
baud: u32,
) -> hal::lpspi::Lpspi<LpspiPins<Sdo, Sdi, Sck, Pcs0>, N>
where
Sdo: hal::iomuxc::lpspi::Pin<
Signal = hal::iomuxc::lpspi::Sdo,
Module = hal::iomuxc::consts::Const<N>,
>,
Sdi: hal::iomuxc::lpspi::Pin<
Signal = hal::iomuxc::lpspi::Sdi,
Module = hal::iomuxc::consts::Const<N>,
>,
Sck: hal::iomuxc::lpspi::Pin<
Signal = hal::iomuxc::lpspi::Sck,
Module = hal::iomuxc::consts::Const<N>,
>,
Pcs0: hal::iomuxc::lpspi::Pin<
Signal = hal::iomuxc::lpspi::Pcs0,
Module = hal::iomuxc::consts::Const<N>,
>,
{
let mut spi = hal::lpspi::Lpspi::new(instance, pins);
spi.disabled(|spi| spi.set_clock_hz(LPSPI_FREQUENCY, baud));
spi
}
pub fn lpuart<Tx, Rx, const N: u8>(
instance: ral::lpuart::Instance<N>,
tx: Tx,
rx: Rx,
baud: u32,
) -> hal::lpuart::Lpuart<hal::lpuart::Pins<Tx, Rx>, N>
where
Tx: hal::iomuxc::lpuart::Pin<
Direction = hal::iomuxc::lpuart::Tx,
Module = hal::iomuxc::consts::Const<N>,
>,
Rx: hal::iomuxc::lpuart::Pin<
Direction = hal::iomuxc::lpuart::Rx,
Module = hal::iomuxc::consts::Const<N>,
>,
{
let mut uart = hal::lpuart::Lpuart::new(instance, hal::lpuart::Pins { tx, rx });
uart.disable(|uart| uart.set_baud(&lpuart_baud(baud)));
uart
}
pub type Lpuart6 = hal::lpuart::Lpuart<hal::lpuart::Pins<pins::common::P1, pins::common::P0>, 6>;
pub type Lpuart4 = hal::lpuart::Lpuart<hal::lpuart::Pins<pins::common::P8, pins::common::P7>, 4>;
pub type Lpuart2 = hal::lpuart::Lpuart<hal::lpuart::Pins<pins::common::P14, pins::common::P15>, 2>;
pub type Lpuart3 = hal::lpuart::Lpuart<hal::lpuart::Pins<pins::common::P17, pins::common::P16>, 3>;
pub type Lpuart8 = hal::lpuart::Lpuart<hal::lpuart::Pins<pins::common::P20, pins::common::P21>, 8>;
pub type Lpuart1 = hal::lpuart::Lpuart<hal::lpuart::Pins<pins::common::P24, pins::common::P25>, 1>;
fn prepare_resources<Pins>(
mut instances: Instances,
from_pads: impl FnOnce(hal::iomuxc::pads::Pads) -> Pins,
) -> Resources<Pins> {
prepare_clocks_and_power(
&mut instances.CCM,
&mut instances.CCM_ANALOG,
&mut instances.DCDC,
);
let iomuxc = hal::iomuxc::into_pads(instances.IOMUXC);
let pins = from_pads(iomuxc);
ral::modify_reg!(ral::pit, instances.PIT, MCR, FRZ: FRZ_1);
let pit = hal::pit::new(instances.PIT);
let mut gpt1 = hal::gpt::Gpt::new(instances.GPT1);
gpt1.disable();
let mut gpt2 = hal::gpt::Gpt::new(instances.GPT2);
gpt2.disable();
let hal::snvs::Snvs {
low_power:
hal::snvs::LowPower {
core: snvs_lp_core,
srtc,
..
},
..
} = hal::snvs::new(instances.SNVS);
let adc1 = hal::adc::Adc::new(
instances.ADC1,
hal::adc::ClockSelect::ADACK,
hal::adc::ClockDivision::Div8,
);
let adc2 = hal::adc::Adc::new(
instances.ADC2,
hal::adc::ClockSelect::ADACK,
hal::adc::ClockDivision::Div8,
);
let trng = hal::trng::Trng::new(instances.TRNG, Default::default(), Default::default());
let tempmon = hal::tempmon::TempMon::with_measure_freq(instances.TEMPMON, 0x1000);
Resources {
pit,
gpt1,
gpt2,
gpio1: hal::gpio::Port::new(instances.GPIO1),
gpio2: hal::gpio::Port::new(instances.GPIO2),
gpio3: hal::gpio::Port::new(instances.GPIO3),
gpio4: hal::gpio::Port::new(instances.GPIO4),
usb: hal::usbd::Instances {
usb: instances.USB1,
usbphy: instances.USBPHY1,
usbnc: instances.USBNC1,
},
dma: hal::dma::channels(instances.DMA, instances.DMAMUX),
srtc,
snvs_lp_core,
ccm: instances.CCM,
ccm_analog: instances.CCM_ANALOG,
dcdc: instances.DCDC,
pins,
lpi2c1: instances.LPI2C1,
lpi2c3: instances.LPI2C3,
lpspi4: instances.LPSPI4,
lpuart6: instances.LPUART6,
lpuart4: instances.LPUART4,
lpuart2: instances.LPUART2,
lpuart3: instances.LPUART3,
lpuart8: instances.LPUART8,
lpuart1: instances.LPUART1,
flexio1: instances.FLEXIO1,
flexio2: instances.FLEXIO2,
flexio3: instances.FLEXIO3,
flexpwm1: hal::flexpwm::new(instances.PWM1),
flexpwm2: hal::flexpwm::new(instances.PWM2),
flexpwm3: hal::flexpwm::new(instances.PWM3),
flexpwm4: hal::flexpwm::new(instances.PWM4),
adc1,
adc2,
trng,
tempmon,
}
}
pub fn t40(instances: impl Into<Instances>) -> T40Resources {
prepare_resources(instances.into(), pins::t40::from_pads)
}
pub fn t41(instances: impl Into<Instances>) -> T41Resources {
prepare_resources(instances.into(), pins::t41::from_pads)
}
pub fn tmm(instances: impl Into<Instances>) -> TMMResources {
prepare_resources(instances.into(), pins::tmm::from_pads)
}