Skip to content
This repository has been archived by the owner on Apr 6, 2021. It is now read-only.

Integrate numbered RAL instances #3

Draft
wants to merge 5 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,7 @@ imxrt1060 = []

[dev-dependencies]
static_assertions = "1.1"

[patch.crates-io.imxrt-ral]
git = "https://github.com/imxrt-rs/imxrt-ral"
branch = "typenum-instances"
58 changes: 29 additions & 29 deletions src/ral.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,21 @@ use imxrt_ral as ral;
/// Helper for a clock control module designed to the
/// RAL interface.
pub type CCM = crate::CCM<
ral::pit::Instance,
ral::gpt::Instance,
ral::lpuart::Instance,
ral::lpspi::Instance,
ral::lpi2c::Instance,
ral::pit::RegisterBlock,
ral::gpt::RegisterBlock,
ral::lpuart::RegisterBlock,
ral::lpspi::RegisterBlock,
ral::lpi2c::RegisterBlock,
>;

/// A periodic clock that controls RAL PIT and GPT timings
pub type PerClock = crate::PerClock<ral::pit::Instance, ral::gpt::Instance>;
pub type PerClock = crate::PerClock<ral::pit::RegisterBlock, ral::gpt::RegisterBlock>;
/// A UART clock that controls RAL LPUART timing
pub type UARTClock = crate::UARTClock<ral::lpuart::Instance>;
pub type UARTClock = crate::UARTClock<ral::lpuart::RegisterBlock>;
/// A SPI clock that controls RAL LPSPI timing
pub type SPIClock = crate::SPIClock<ral::lpspi::Instance>;
pub type SPIClock = crate::SPIClock<ral::lpspi::RegisterBlock>;
/// An I2C clock that contorls RAL LPI2C timing
pub type I2CClock = crate::I2CClock<ral::lpi2c::Instance>;
pub type I2CClock = crate::I2CClock<ral::lpi2c::RegisterBlock>;

impl CCM {
/// Converts the `imxrt-ral` CCM instance into the `CCM` driver
Expand All @@ -47,7 +47,7 @@ impl CCM {
}
}

unsafe impl Instance for ral::dma0::Instance {
unsafe impl Instance for ral::dma0::RegisterBlock {
type Inst = DMA;
#[inline(always)]
fn instance(&self) -> DMA {
Expand All @@ -66,19 +66,19 @@ unsafe impl Instance for ral::dma0::Instance {
///
/// let CCM{ mut handle, .. } = ccm::CCM::take().map(CCM::from_ral).unwrap();
/// let mut dma = DMA0::take().unwrap();
/// handle.set_clock_gate_dma(&mut dma, ClockGate::On);
/// handle.clock_gate_dma(&dma);
/// handle.set_clock_gate_dma(&mut *dma, ClockGate::On);
/// handle.clock_gate_dma(&*dma);
/// ```
#[cfg(doctest)]
struct DMAClockGate;

#[cfg(not(any(feature = "imxrt1010", feature = "imxrt1060")))]
compile_error!("Ensure that LPI2C instances are correct");
unsafe impl Instance for ral::lpi2c::Instance {
unsafe impl Instance for ral::lpi2c::RegisterBlock {
type Inst = I2C;
#[inline(always)]
fn instance(&self) -> I2C {
match &**self as *const _ {
match &*self as *const _ {
ral::lpi2c::LPI2C1 => I2C::I2C1,
ral::lpi2c::LPI2C2 => I2C::I2C2,
#[cfg(feature = "imxrt1060")]
Expand Down Expand Up @@ -110,11 +110,11 @@ unsafe impl Instance for ral::lpi2c::Instance {
#[cfg(doctest)]
struct I2CClockGate;

unsafe impl Instance for ral::gpt::Instance {
unsafe impl Instance for ral::gpt::RegisterBlock {
type Inst = GPT;
#[inline(always)]
fn instance(&self) -> GPT {
match &**self as *const _ {
match &*self as *const _ {
ral::gpt::GPT1 => GPT::GPT1,
ral::gpt::GPT2 => GPT::GPT2,
_ => unreachable!(),
Expand Down Expand Up @@ -143,7 +143,7 @@ unsafe impl Instance for ral::gpt::Instance {
#[cfg(doctest)]
struct GPTClockGate;

unsafe impl Instance for ral::pit::Instance {
unsafe impl Instance for ral::pit::RegisterBlock {
type Inst = PIT;
#[inline(always)]
fn instance(&self) -> PIT {
Expand Down Expand Up @@ -171,11 +171,11 @@ struct PITClockGate;

#[cfg(not(any(feature = "imxrt1010", feature = "imxrt1060")))]
compile_error!("Ensure that LPSPI instances are correct");
unsafe impl Instance for ral::lpspi::Instance {
unsafe impl Instance for ral::lpspi::RegisterBlock {
type Inst = SPI;
#[inline(always)]
fn instance(&self) -> SPI {
match &**self as *const _ {
match &*self as *const _ {
ral::lpspi::LPSPI1 => SPI::SPI1,
ral::lpspi::LPSPI2 => SPI::SPI2,
#[cfg(feature = "imxrt1060")]
Expand Down Expand Up @@ -208,11 +208,11 @@ struct SPIClockGate;

#[cfg(not(any(feature = "imxrt1010", feature = "imxrt1060")))]
compile_error!("Ensure that LPUART instances are correct");
unsafe impl Instance for ral::lpuart::Instance {
unsafe impl Instance for ral::lpuart::RegisterBlock {
type Inst = UART;
#[inline(always)]
fn instance(&self) -> UART {
match &**self as *const _ {
match &*self as *const _ {
ral::lpuart::LPUART1 => UART::UART1,
ral::lpuart::LPUART2 => UART::UART2,
ral::lpuart::LPUART3 => UART::UART3,
Expand Down Expand Up @@ -257,11 +257,11 @@ use ral::adc1 as adc;

#[cfg(not(any(feature = "imxrt1010", feature = "imxrt1060")))]
compile_error!("Ensure that ADC instances are correct");
unsafe impl Instance for adc::Instance {
unsafe impl Instance for adc::RegisterBlock {
type Inst = ADC;
#[inline(always)]
fn instance(&self) -> ADC {
match &**self as *const _ {
match &*self as *const _ {
adc::ADC1 => ADC::ADC1,
#[cfg(feature = "imxrt1060")]
adc::ADC2 => ADC::ADC2,
Expand All @@ -284,8 +284,8 @@ unsafe impl Instance for adc::Instance {
///
/// let CCM{ mut handle, .. } = ccm::CCM::take().map(CCM::from_ral).unwrap();
/// let mut adc = ADC1::take().unwrap();
/// handle.set_clock_gate_adc(&mut adc, ClockGate::On);
/// handle.clock_gate_adc(&adc);
/// handle.set_clock_gate_adc(&mut *adc, ClockGate::On);
/// handle.clock_gate_adc(&*adc);
/// ```
#[cfg(doctest)]
struct ADCClockGate;
Expand All @@ -297,11 +297,11 @@ use ral::pwm1 as pwm;

#[cfg(not(any(feature = "imxrt1010", feature = "imxrt1060")))]
compile_error!("Ensure that PWM instances are correct");
unsafe impl Instance for pwm::Instance {
unsafe impl Instance for pwm::RegisterBlock {
type Inst = PWM;
#[inline(always)]
fn instance(&self) -> PWM {
match &**self as *const _ {
match &*self as *const _ {
pwm::PWM1 => PWM::PWM1,
#[cfg(feature = "imxrt1060")]
pwm::PWM2 => PWM::PWM2,
Expand Down Expand Up @@ -329,8 +329,8 @@ unsafe impl Instance for pwm::Instance {
///
/// let CCM{ mut handle, .. } = ccm::CCM::take().map(CCM::from_ral).unwrap();
/// let mut pwm = PWM1::take().unwrap();
/// handle.set_clock_gate_pwm(&mut pwm, ClockGate::On);
/// handle.clock_gate_pwm(&pwm);
/// handle.set_clock_gate_pwm(&mut *pwm, ClockGate::On);
/// handle.clock_gate_pwm(&*pwm);
/// ```
#[cfg(doctest)]
struct PWMClockGate;
Expand Down
52 changes: 26 additions & 26 deletions tests/ral.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,46 +9,46 @@ const IMXRT1060: bool = cfg!(feature = "imxrt1060");

#[test]
fn dma_is_valid() {
assert!(ral::dma0::Instance::is_valid(DMA));
assert!(ral::dma0::RegisterBlock::is_valid(DMA));
}

#[test]
fn i2c_is_valid() {
assert!(ral::lpi2c::Instance::is_valid(I2C::I2C1));
assert!(ral::lpi2c::Instance::is_valid(I2C::I2C2));
assert_eq!(ral::lpi2c::Instance::is_valid(I2C::I2C3), IMXRT1060);
assert_eq!(ral::lpi2c::Instance::is_valid(I2C::I2C4), IMXRT1060);
assert!(ral::lpi2c::RegisterBlock::is_valid(I2C::I2C1));
assert!(ral::lpi2c::RegisterBlock::is_valid(I2C::I2C2));
assert_eq!(ral::lpi2c::RegisterBlock::is_valid(I2C::I2C3), IMXRT1060);
assert_eq!(ral::lpi2c::RegisterBlock::is_valid(I2C::I2C4), IMXRT1060);
}

#[test]
fn gpt_is_valid() {
assert!(ral::gpt::Instance::is_valid(GPT::GPT1));
assert!(ral::gpt::Instance::is_valid(GPT::GPT2));
assert!(ral::gpt::RegisterBlock::is_valid(GPT::GPT1));
assert!(ral::gpt::RegisterBlock::is_valid(GPT::GPT2));
}

#[test]
fn pit_is_valid() {
assert!(ral::pit::Instance::is_valid(PIT))
assert!(ral::pit::RegisterBlock::is_valid(PIT))
}

#[test]
fn spi_is_valid() {
assert!(ral::lpspi::Instance::is_valid(SPI::SPI1));
assert!(ral::lpspi::Instance::is_valid(SPI::SPI2));
assert_eq!(ral::lpspi::Instance::is_valid(SPI::SPI3), IMXRT1060);
assert_eq!(ral::lpspi::Instance::is_valid(SPI::SPI3), IMXRT1060);
assert!(ral::lpspi::RegisterBlock::is_valid(SPI::SPI1));
assert!(ral::lpspi::RegisterBlock::is_valid(SPI::SPI2));
assert_eq!(ral::lpspi::RegisterBlock::is_valid(SPI::SPI3), IMXRT1060);
assert_eq!(ral::lpspi::RegisterBlock::is_valid(SPI::SPI3), IMXRT1060);
}

#[test]
fn uart_is_valid() {
assert!(ral::lpuart::Instance::is_valid(UART::UART1));
assert!(ral::lpuart::Instance::is_valid(UART::UART2));
assert!(ral::lpuart::Instance::is_valid(UART::UART3));
assert!(ral::lpuart::Instance::is_valid(UART::UART4));
assert_eq!(ral::lpuart::Instance::is_valid(UART::UART5), IMXRT1060);
assert_eq!(ral::lpuart::Instance::is_valid(UART::UART6), IMXRT1060);
assert_eq!(ral::lpuart::Instance::is_valid(UART::UART7), IMXRT1060);
assert_eq!(ral::lpuart::Instance::is_valid(UART::UART8), IMXRT1060);
assert!(ral::lpuart::RegisterBlock::is_valid(UART::UART1));
assert!(ral::lpuart::RegisterBlock::is_valid(UART::UART2));
assert!(ral::lpuart::RegisterBlock::is_valid(UART::UART3));
assert!(ral::lpuart::RegisterBlock::is_valid(UART::UART4));
assert_eq!(ral::lpuart::RegisterBlock::is_valid(UART::UART5), IMXRT1060);
assert_eq!(ral::lpuart::RegisterBlock::is_valid(UART::UART6), IMXRT1060);
assert_eq!(ral::lpuart::RegisterBlock::is_valid(UART::UART7), IMXRT1060);
assert_eq!(ral::lpuart::RegisterBlock::is_valid(UART::UART8), IMXRT1060);
}

#[cfg(feature = "imxrt1060")]
Expand All @@ -58,8 +58,8 @@ use ral::adc1 as adc;

#[test]
fn adc_is_valid() {
assert!(adc::Instance::is_valid(ADC::ADC1));
assert_eq!(adc::Instance::is_valid(ADC::ADC2), IMXRT1060);
assert!(adc::RegisterBlock::is_valid(ADC::ADC1));
assert_eq!(adc::RegisterBlock::is_valid(ADC::ADC2), IMXRT1060);
}

#[cfg(feature = "imxrt1060")]
Expand All @@ -69,8 +69,8 @@ use ral::pwm1 as pwm;

#[test]
fn pwm_is_valid() {
assert!(pwm::Instance::is_valid(PWM::PWM1));
assert_eq!(pwm::Instance::is_valid(PWM::PWM2), IMXRT1060);
assert_eq!(pwm::Instance::is_valid(PWM::PWM3), IMXRT1060);
assert_eq!(pwm::Instance::is_valid(PWM::PWM4), IMXRT1060);
assert!(pwm::RegisterBlock::is_valid(PWM::PWM1));
assert_eq!(pwm::RegisterBlock::is_valid(PWM::PWM2), IMXRT1060);
assert_eq!(pwm::RegisterBlock::is_valid(PWM::PWM3), IMXRT1060);
assert_eq!(pwm::RegisterBlock::is_valid(PWM::PWM4), IMXRT1060);
}