Skip to content

0.4.0

Compare
Choose a tag to compare
@mciantyre mciantyre released this 29 Aug 11:25

The 0.4.0 release has some new features, along with various breaking changes for both the HAL and RAL. See the notes below for more information.

The release introduces the imxrt-iomuxc crates, which provide a simpler interface for configuring processor pads. The imxrt-iomuxc API is re-exported through the imxrt_hal::iomuxc module. The changes below describe the breaking HAL changes, and suggest ways to migrate your HAL code.

RAL

  • BREAKING The RAL's "rtfm" feature is changed to "rtic", reflecting the framework's
    new name. Users who are relying on the "rtfm" feature should now use the "rtic" feature.

HAL

Added

  • steal() the top-level Peripherals object. The steal() method lets users use the imxrt_hal
    as an RTIC device.
  • DMA Memcpy may support interrupt handling
  • A new interface for pad configuration, supported by the imxrt-iomuxc crate family. See the Changed
    section for migration information.

Changed

  • BREAKING The pad configuration interface has simplified. Users will use the
    interface exposed by the imxrt-iomuxc crate family. This section describes how you might
    update your 0.3 (and earlier) code for the new interface.

    • Naming: the IOMUXC instance exposes pads with a new naming convention. Previously, member
      accessed resembled

      let peripherals = imxrt_hal::Peripherals::take().unwrap();
      peripherals.iomuxc.gpio_ad_b1_02;

      Now, IOMUXC member access resembles

      peripherals.iomuxc.ad_b1.p02

      Generally, remove the "gpio_" prefix, and replace the second underscore with member access and
      a "p" symbol.

    • Pad Types: The interface simplifies the pad types, removing the alternate type state.
      Usages resembling

      use imxrt_hal as hal;
      
      type MyPin = hal::iomuxc::gpio::GPIO_AD_B0_12<hal::iomuxc::Alt5>;

      can be simply expressed as

      type MyPin = hal::iomuxc::ad_b0::AD_B0_12;

      Note the stuttering convention of pad_group::pad_group_offset to reference pad types.

    • No alternate transition: there are no altX() methods. Usage resembling

      let mut uart = uarts.uart2.init(
          peripherals.iomuxc.gpio_ad_b1_02.alt2(),
          peripherals.iomuxc.gpio_ad_b1_03.alt2(),
          BAUD,
      ).unwrap()

      should drop the altX() calls (after renaming the pads).

      let mut uart = uarts.uart2.init(
          peripherals.iomuxc.ad_b1.p02,
          peripherals.iomuxc.ad_b1.p03,
          BAUD,
      ).unwrap();
    • Type Tags: all custom type-level constants, like imxrt_hal::uart::module::_1 are now
      typenum constants. There are no peripheral-specific constants. Usage resembling

      use imxrt_hal::uart;
      
      type MyTX = uart::Tx<uart::module::_3>;

      should update to

      use imxrt_hal::uart;
      use imxrt_hal::iomuxc;
      
      type MyTX = uart::Tx<iomuxc::consts::U3>;
    • GPIO: the new IOMUXC driver results in a simpler GPIO interface. There is now a single GPIO
      type that wraps an IOMUXC pad. Any GPIO type, like

      use imxrt_hal as hal;
      
      type HardwareFlag = hal::gpio::GPIO1IO26<hal::gpio::GPIO1, hal::gpio::Output>;

      should change to

      type HardwareFlag = hal::gpio::GPIO<hal::iomuxc::ad_b1::AD_B1_10, hal::gpio::Output>;

      The new GPIO types expose a no-return toggle() method, which shadows an embedded_hal
      trait method. If you notice compilation issues surrounding toggle(), try removing
      unwrap() calls:

      led.toggle().unwrap() // Old
      led.toggle()          // New

      Or, qualify that the ToggleableOutputPin trait method should be called.

  • BREAKING The HAL's "rtfm" feature is changed to "rtic", reflecting the framework's
    new name. Users who are relying on the "rtfm" feature should now use the "rtic" feature.

  • BREAKING The dma::{Config, ConfigBuilder} types are gone. This affects the dma::Peripheral
    interface. To configure interrupt on completion / half settings, use dma::Channel::set_interrupt_on_completion()
    / dma::Channel::set_interrupt_on_half() to perform the same configurations before suppling the
    channel to dma::Peripheral.