Skip to content

0.23.0

Compare
Choose a tag to compare
@jessebraham jessebraham released this 15 Jan 12:11
· 6 commits to main since this release
59a2c17

Please note that only changes to the esp-hal package are tracked in these release notes.

Migration Guide

Starting with this release, unstable parts of esp-hal will be gated behind the unstable feature.
The unstable feature itself is unstable, we might change the way we hide APIs without notice.
Unstable APIs are not covered by semver guarantees, they may break even between patch releases.

Please refer to the documentation to see which APIs are marked as unstable.

DMA changes

Accessing channel objects

DMA channels are now available through the Peripherals struct, which is returned
by esp_hal::init(). The channels themselves have been renamed to match other peripheral singletons.

  • ESP32-C2, C3, C6, H2 and S3: channelX -> DMA_CHX
  • ESP32 and S2: spiXchannel -> DMA_SPIX, i2sXchannel -> DMA_I2SX
-let dma = Dma::new(peripherals.DMA);
-let channel = dma.channel2;
+let channel = peripherals.DMA_CH2;

Channel configuration changes

  • configure_for_async and configure have been removed
  • PDMA devices (ESP32, ESP32-S2) provide no channel configurability
  • GDMA devices provide set_priority to change DMA in/out channel priority
 let mut spi = Spi::new_with_config(
     peripherals.SPI2,
     Config::default(),
 )
 // other setup
-.with_dma(dma_channel.configure(false, DmaPriority::Priority0));
+.with_dma(dma_channel);
+dma_channel.set_priority(DmaPriority::Priority1);
 let mut spi = Spi::new_with_config(
     peripherals.SPI2,
     Config::default(),
 )
 // other setup
-.with_dma(dma_channel.configure(false, DmaPriority::Priority1));
+.with_dma(dma_channel);

Burst mode configuration

Burst mode is now a property of buffers, instead of DMA channels. Configuration can be done by
calling set_burst_config on buffers that support it. The configuration options and the
corresponding BurstConfig type are device specfic.

Usability changes affecting applications

Individual channels are no longer wrapped in Channel, but they implement the DmaChannel trait.
This means that if you want to split them into an rx and a tx half (which is only supported on
the H2, C6 and S3 currently), you can't move out of the channel but instead you need to call
the split method.

-let tx = channel.tx;
+use esp_hal::dma::DmaChannel;
+let (rx, tx) = channel.split();

The Channel types remain available for use in peripheral drivers.

It is now simpler to work with DMA channels in generic contexts. esp-hal now provides convenience
traits and type aliasses to specify peripheral compatibility. The ChannelCreator types have been
removed, further simplifying use.

For example, previously you may have needed to write something like this to accept a DMA channel
in a generic function:

fn new_foo<'d, T>(
    dma_channel: ChannelCreator<2>, // It wasn't possible to accept a generic ChannelCreator.
    peripheral: impl Peripheral<P = T> + 'd,
)
where
    T: SomePeripheralInstance,
    ChannelCreator<2>: DmaChannelConvert<<T as DmaEligible>::Dma>,
{
    let dma_channel = dma_channel.configure_for_async(false, DmaPriority::Priority0);

    let driver = PeripheralDriver::new(peripheral, config).with_dma(dma_channel);

    // ...
}

From now on a similar, but more flexible implementation may look like:

fn new_foo<'d, T, CH>(
    dma_channel: impl Peripheral<P = CH> + 'd,
    peripheral: impl Peripheral<P = T> + 'd,
)
where
    T: SomePeripheralInstance,
    CH: DmaChannelFor<T>,
{
    // Optionally: dma_channel.set_priority(DmaPriority::Priority2);

    let driver = PeripheralDriver::new(peripheral, config).with_dma(dma_channel);

    // ...
}

Usability changes affecting third party peripheral drivers

If you are writing a driver and need to store a channel in a structure, you can use one of the
ChannelFor type aliasses.

 struct Aes<'d> {
-    channel: ChannelTx<'d, Blocking, <AES as DmaEligible>::Dma>,
+    channel: ChannelTx<'d, Blocking, PeripheralTxChannel<AES>>,
 }

Timer changes

The low level timers, SystemTimer and TimerGroup are now "dumb". They contain no logic for operating modes or trait implementations (except the low level Timer trait).

Timer drivers - OneShotTimer & PeriodicTimer

Both drivers now have a Mode parameter. Both also type erase the underlying driver by default, call new_typed to retain the type.

- OneShotTimer<'static, systimer::Alarm>;
+ OneShotTimer<'static, Blocking>;
- PeriodicTimer<'static, systimer::Alarm>;
+ PeriodicTimer<'static, Blocking>;

SystemTimer

let systimer = SystemTimer::new(peripherals.SYSTIMER);
- static UNIT0: StaticCell<SpecificUnit<'static, 0>> = StaticCell::new();
- let unit0 = UNIT0.init(systimer.unit0);
- let frozen_unit = FrozenUnit::new(unit0);
- let alarm0 = Alarm::new(systimer.comparator0, &frozen_unit);
- alarm0.set_period(1u32.secs());
+ let alarm0 = systimer.alarm0;
+ let mut timer = PeriodicTimer::new(alarm0);
+ timer.start(1u64.secs());

TIMG

Timer group timers have been type erased.

- timg::Timer<timg::Timer0<crate::peripherals::TIMG0>, Blocking>
+ timg::Timer

ETM usage has changed

Timer dependant ETM events should be created prior to initializing the timer with the chosen driver.

let task = ...; // ETM task
let syst = SystemTimer::new(peripherals.SYSTIMER);
let alarm0 = syst.alarm0;
- alarm0.load_value(1u64.millis()).unwrap();
- alarm0.start();
- let event = Event::new(&mut alarm0);
+ let event = Event::new(&alarm0);
+ let timer = OneShotTimer::new(alarm0);
+ timer.schedule(1u64.millis()).unwrap();
let _configured_channel = channel0.setup(&event, &task);

PSRAM is now initialized automatically

Calling esp_hal::initialize will now configure PSRAM if either the quad-psram or octal-psram
is enabled. To retrieve the address and size of the initialized external memory, use
esp_hal::psram::psram_raw_parts, which returns a pointer and a length.

-let peripherals = esp_hal::init(esp_hal::Config::default());
-let (start, size) = esp_hal::psram::init_psram(peripherals.PSRAM, psram_config);
+let peripherals = esp_hal::init({
+    let mut config = esp_hal::Config::default();
+    config.psram = psram_config;
+    config
+});
+let (start, size) = esp_hal::psram::psram_raw_parts(&peripherals.PSRAM, psram);

The usage of esp_alloc::psram_allocator! remains unchanged.

embedded-hal 0.2.* is not supported anymore.

As per rust-embedded/embedded-hal#640, our driver no longer implements traits from embedded-hal 0.2.x.
Analogs of all traits from the above mentioned version are available in embedded-hal 1.x.x

- use embedded_hal_02::can::Frame;
+ use embedded_can::Frame;
- use embedded_hal_02::digital::v2::OutputPin;
- use embedded_hal_02::digital::v2::ToggleableOutputPin;
+ use embedded_hal::digital::OutputPin;
+ use embedded_hal::digital::StatefulOutputPin;
- use embedded_hal_02::serial::{Read, Write};
+ use embedded_hal_nb::serial::{Read, Write};

You might also want to check the full official embedded-hal migration guide:
https://github.com/rust-embedded/embedded-hal/blob/master/docs/migrating-from-0.2-to-1.0.md

Interrupt related reshuffle

- use esp_hal::InterruptConfigurable;
- use esp_hal::DEFAULT_INTERRUPT_HANDLER;
+ use esp_hal::interrupt::InterruptConfigurable;
+ use esp_hal::interrupt::DEFAULT_INTERRUPT_HANDLER;

Driver constructors now take a configuration and are fallible

The old new_with_config constructor have been removed, and new constructors now always take
a configuration structure. They have also been updated to return a ConfigError if the configuration
is not compatible with the hardware.

-let mut spi = Spi::new_with_config(
+let mut spi = Spi::new(
     peripherals.SPI2,
     Config {
         frequency: 100.kHz(),
         mode: SpiMode::_0,
         ..Config::default()
     },
-);
+)
+.unwrap();
 let mut spi = Spi::new(
     peripherals.SPI2,
+    Config::default(),
-);
+)
+.unwrap();

Peripheral instance type parameters and new_typed constructors have been removed

Call new instead and remove the type parameters if you've used them.

-let mut spi: Spi<'lt, SPI2> = Spi::new_typed(..).unwrap();
+let mut spi: Spi<'lt> = Spi::new(..).unwrap();

LCD_CAM configuration changes

  • cam now has a Config strurct that contains frequency, bit/byte order, VSync filter options.
  • DPI, I8080: frequency has been moved into Config.
+let mut cam_config = cam::Config::default();
+cam_config.frequency = 1u32.MHz();
 cam::Camera::new(
     lcd_cam.cam,
     dma_rx_channel,
     pins,
-    1u32.MHz(),
+    cam_config,
 )

SpiDma now requires you specify the transfer length explicitly

  dma_tx_buf.set_length(5 /* or greater */);
- spi_dma.write(dma_tx_buf);
+ spi_dma.write(5, dma_tx_buf);
  dma_rx_buf.set_length(5 /* or greater */);
- spi_dma.read(dma_rx_buf);
+ spi_dma.read(5, dma_rx_buf);
  dma_rx_buf.set_length(5 /* or greater */);
  dma_tx_buf.set_length(5 /* or greater */);
- spi_dma.transfer(dma_rx_buf, dma_tx_buf);
+ spi_dma.transfer(5, dma_rx_buf, 5, dma_tx_buf);

I2C Error changes

To avoid abbreviations and contractions (as per the esp-hal guidelines), some error variants have changed

- Error::ExecIncomplete
+ Error::ExecutionIncomplete
- Error::CommandNrExceeded
+ Error::CommandNumberExceeded
- Error::ExceedingFifo
+ Error::FifoExceeded
- Error::TimeOut
+ Error::Timeout
- Error::InvalidZeroLength
+ Error::ZeroLengthInvalid

The AckCheckFailed variant changed to AcknowledgeCheckFailed(AcknowledgeCheckFailedReason)

-            Err(Error::AckCheckFailed)
+            Err(Error::AcknowledgeCheckFailed(reason))

I2C Configuration changes

The timeout field in Config changed from Option<u32> to a dedicated BusTimeout enum.

- timeout: Some(10)
+ timeout: BusTimeout::BusCycles(10)
- timeout: None
+ timeout: BusTimeout::Max

(Disabled isn't supported on ESP32 / ESP32-S2)

- timeout: None
+ timeout: BusTimeout::Disabled

The crate prelude has been removed

The reexports that were previously part of the prelude are available through other paths:

  • nb is no longer re-exported. Please import the nb crate if you need it.
  • ExtU64 and RateExtU32 have been moved to esp_hal::time
  • Clock and CpuClock: esp_hal::clock::{Clock, CpuClock}
  • The following traits need to be individually imported when needed:
    • esp_hal::analog::dac::Instance
    • esp_hal::gpio::Pin
    • esp_hal::ledc::channel::ChannelHW
    • esp_hal::ledc::channel::ChannelIFace
    • esp_hal::ledc::timer::TimerHW
    • esp_hal::ledc::timer::TimerIFace
    • esp_hal::timer::timg::TimerGroupInstance
    • esp_hal::timer::Timer
    • esp_hal::interrupt::InterruptConfigurable
  • The entry macro can be imported as esp_hal::entry, while other macros are found under esp_hal::macros

AtCmdConfig now uses builder-lite pattern

- uart0.set_at_cmd(AtCmdConfig::new(None, None, None, b'#', None));
+ uart0.set_at_cmd(AtCmdConfig::default().with_cmd_char(b'#'));

Crate configuration changes

To prevent ambiguity between configurations, we had to change the naming format of configuration
keys. Before, we used {prefix}_{key}, which meant that esp-hal and esp-hal-* configuration keys
were impossible to tell apart. To fix this issue, we are changing the separator from one underscore
character to _CONFIG_. This also means that users will have to change their config.toml
configurations to match the new format.

 [env]
-ESP_HAL_PLACE_SPI_DRIVER_IN_RAM="true"
+ESP_HAL_CONFIG_PLACE_SPI_DRIVER_IN_RAM="true"

UART changes

The Config struct's setters are now prefixed with with_. parity_none, parity_even,
parity_odd have been replaced by with_parity that takes a Parity parameter.

 let config = Config::default()
-    .rx_fifo_full_threshold(30)
+    .with_rx_fifo_full_threshold(30)
-    .parity_even();
+    .with_parity(Parity::Even);

The DataBits, Parity, and StopBits enum variants are no longer prefixed with the name of the enum.

e.g.

- DataBits::DataBits8
+ DataBits::_8
- Parity::ParityNone
+ Parity::None
- StopBits::Stop1
+ StopBits::_1

The previous blocking implementation of read_bytes has been removed, and the non-blocking drain_fifo has instead been renamed to read_bytes in its place.

Any code which was previously using read_bytes to fill a buffer in a blocking manner will now need to implement the necessary logic to block until the buffer is filled in their application instead.

The Error enum variant uses object+verb naming.

e.g.

- RxGlichDetected
+ GlitchOccurred

RX/TX pin assignment moved from constructors to builder functions.

e.g.

  let mut uart1 = Uart::new(
      peripherals.UART1,
-     Config::default(),
-     peripherals.GPIO1,
-     peripherals.GPIO2,
- ).unwrap();
+     Config::default())
+     .unwrap()
+     .with_rx(peripherals.GPIO1)
+     .with_tx(peripherals.GPIO2);

write_byte and read_byte have been removed.

e.g.

- while let nb::Result::Ok(_c) = serial.read_byte() {
-     cnt += 1;
- }
+ let mut buff = [0u8; 64];
+ let cnt = serial.read_bytes(&mut buff);

Spi with_miso has been split

Previously, with_miso set up the provided pin as an input and output, which was necessary for half duplex.
Full duplex does not require this, and it also creates an artificial restriction.

If you were using half duplex SPI with with_miso,
you should now use with_sio1 instead to get the previous behavior.

CPU Clocks

The specific CPU clock variants are renamed from e.g. Clock80MHz to _80MHz.

- CpuClock::Clock80MHz
+ CpuClock::_80MHz

Additionally the enum is marked as non-exhaustive.

SPI Changes

The SPI mode variants are renamed from e.g. Mode0 to _0.

- Mode::Mode0
+ Mode::_0

The Address and Command enums have similarly had their variants changed from e.g. Address1 to _1Bit and Command1 to _1Bit respectively:

- Address::Address1
+ Address::_1Bit
- Command::Command1
+ Command::_1Bit

write_byte and read_byte were removed and write_bytes and read_bytes can be used as replacement.

e.g.

let mut byte = [0u8; 1];
spi.read_bytes(&mut byte);

GPIO Changes

The GPIO drive strength variants are renamed from e.g. I5mA to _5mA.

-DriveStrength::I5mA
+DriveStrength::_5mA

ADC Changes

The ADC attenuation variants are renamed from e.g. Attenuation0dB to _0dB.

-Attenuation::Attenuation0dB
+Attenuation::_0dB

macro module is private now

Macros from procmacros crate (handler, ram, load_lp_code) are now imported via esp-hal.

- use esp_hal::macros::{handler, ram, load_lp_code};
+ use esp_hal::{handler, ram, load_lp_code};

entry macro is removed, use main macro

-use esp_hal::entry;
+use esp_hal::main;

-#[entry]
+#[main]
fn main() {

Changelog

Added

  • ESP32-S3: Added SDMMC signals (#2556)
  • Added set_priority to the DmaChannel trait on GDMA devices (#2403, #2526)
  • Added into_async and into_blocking functions for ParlIoTxOnly, ParlIoRxOnly (#2526)
  • ESP32-C6, H2, S3: Added split function to the DmaChannel trait. (#2526, #2532)
  • DMA: PeripheralDmaChannel type aliasses and DmaChannelFor traits to improve usability. (#2532)
  • dma::{Channel, ChannelRx, ChannelTx}::set_priority for GDMA devices (#2403)
  • esp_hal::asynch::AtomicWaker that does not hold a global critical section (#2555)
  • esp_hal::sync::RawMutex for embassy-sync. (#2555)
  • ESP32-C6, H2, S3: Added split function to the DmaChannel trait. (#2526)
  • Added PSRAM configuration to esp_hal::Config if quad-psram or octal-psram is enabled (#2546)
  • Added esp_hal::psram::psram_raw_parts (#2546)
  • The timer drivers OneShotTimer & PeriodicTimer have into_async and new_typed methods (#2586)
  • timer::Timer trait has three new methods, wait, async_interrupt_handler and peripheral_interrupt (#2586)
  • Configuration structs in the I2C, SPI, and UART drivers now implement the Builder Lite pattern (#2614)
  • Added I8080::apply_config, DPI::apply_config and Camera::apply_config (#2610)
  • Introduced the unstable feature which will be used to restrict stable APIs to a subset of esp-hal. (#2628)
  • HAL configuration structs now implement the Builder Lite pattern (#2645)
  • Added OutputOpenDrain::unlisten (#2625)
  • Added {Input, Flex}::wait_for (#2625)
  • Peripheral singletons now implement Debug and defmt::Format (#2682, #2834)
  • BurstConfig, a device-specific configuration for configuring DMA transfers in burst mode (#2543)
  • {DmaRxBuf, DmaTxBuf, DmaRxTxBuf}::set_burst_config (#2543)
  • Added SpiDmaBus::split for moving between manual & automatic DMA buffers (#2824)
  • ESP32-S2: DMA support for AES (#2699)
  • Added transfer_in_place_async and embedded-hal-async implementation to Spi (#2691)
  • InterruptHandler now implements Hash and defmt::Format (#2830)
  • uart::ConfigError now implements Eq (#2825)
  • i2c::master::Error now implements Eq and Hash (#2825)
  • i2c::master::Operation now implements Debug, PartialEq, Eq, Hash, and Display (#2825)
  • i2c::master::Config now implements PartialEq, Eq, ans Hash (#2825)
  • i2c::master::I2c now implements Debug, PartialEq, and Eq (#2825)
  • i2c::master::Info now implements Debug (#2825)
  • spi::master::Config now implements Hash (#2823)
  • spi::master drivers now implement Debug and defmt::Format (#2823)
  • DmaRxBuf, DmaTxBuf and DmaRxTxBuf now implement Debug and defmt::Format (#2823)
  • DMA channels (AnyGdmaChannel, SpiDmaChannel, I2sDmaChannel, CryptoDmaChannel) and their RX/TX halves now implement Debug and defmt::Format (#2823)
  • DmaDescriptor and DmaDescriptorFlags now implement PartialEq and Eq (#2823)
  • gpio::{Event, WakeEvent, GpioRegisterAccess} now implement Debug, Eq, PartialEq and Hash (#2842)
  • gpio::{Level, Pull, AlternateFunction, RtcFunction} now implement Hash (#2842)
  • gpio::{GpioPin, AnyPin, Io, Output, OutputOpenDrain, Input, Flex} now implement Debug, defmt::Format (#2842)
  • More interrupts are available in esp_hal::spi::master::SpiInterrupt, add enable_listen,interrupts and clear_interrupts for ESP32/ESP32-S2 (#2833)
  • The ExtU64 and RateExtU32 traits have been added to esp_hal::time (#2845)
  • Added AnyPin::steal(pin_number) (#2854)
  • adc::{AdcCalSource, Attenuation, Resolution} now implement Hash and defmt::Format (#2840)
  • rtc_cntl::{RtcFastClock, RtcSlowClock, RtcCalSel} now implement PartialEq, Eq, Hash and defmt::Format (#2840)
  • Added tsens::TemperatureSensor peripheral for ESP32C6 and ESP32C3 (#2875)
  • Added with_rx() and with_tx() methods to Uart, UartRx, and UartTx (#2904)
  • ESP32-S2: Made Wi-Fi peripheral non virtual. (#2942)
  • UartRx::check_for_errors, Uart::check_for_rx_errors, {Uart, UartRx}::read_buffered_bytes (#2935)
  • Added i2c interrupt API (#2944)

Changed

  • In addition to taking by value, peripheral drivers can now mutably borrow DMA channel objects. (#2526)
  • DMA channel objects are no longer wrapped in Channel. The Channel drivers are now managed by DMA enabled peripheral drivers. (#2526)
  • The Dpi driver and DpiTransfer now have a Mode type parameter. The driver's asyncness is determined by the asyncness of the Lcd used to create it. (#2526)
  • dma::{Channel, ChannelRx, ChannelTx}::set_priority for GDMA devices (#2403)
  • SystemTimer::set_unit_value & SystemTimer::configure_unit (#2576)
  • SystemTimer no longer uses peripheral ref (#2576)
  • TIMGX no longer uses peripheral ref (#2581)
  • SystemTimer::now has been renamed SystemTimer::unit_value(Unit) (#2576)
  • SpiDma transfers now explicitly take a length along with the DMA buffer object (#2587)
  • dma::{Channel, ChannelRx, ChannelTx}::set_priority for GDMA devices (#2403)
  • SystemTimers Alarms are now type erased (#2576)
  • TimerGroup Timers are now type erased (#2581)
  • PSRAM is now initialized automatically if quad-psram or octal-psram is enabled (#2546)
  • DMA channels are now available via the Peripherals struct, and have been renamed accordingly. (#2545)
  • Moved interrupt related items from lib.rs, moved to the interrupt module (#2613)
  • The timer drivers OneShotTimer & PeriodicTimer now have a Mode parameter and type erase the underlying driver by default (#2586)
  • timer::Timer has new trait requirements of Into<AnyTimer>, 'static and InterruptConfigurable (#2586)
  • systimer::etm::Event no longer borrows the alarm indefinitely (#2586)
  • A number of public enums and structs in the I2C, SPI, and UART drivers have been marked with #[non_exhaustive] (#2614)
  • Interrupt handling related functions are only provided for Blocking UART. (#2610)
  • Changed how Spi, (split or unsplit) Uart, LpUart, I8080, Camera, DPI and I2C drivers are constructed (#2610)
  • I8080, camera, DPI: The various standalone configuration options have been merged into Config (#2610)
  • Dropped GPIO futures stop listening for interrupts (#2625)
  • UART driver's StopBits enum variants now correctly use UpperCamelCase (#2669)
  • The PeripheralInput and PeripheralOutput traits are now sealed (#2690)
  • esp_hal::sync::Lock has been renamed to RawMutex (#2684)
  • Updated esp-pacs with support for Wi-Fi on the ESP32 and made the peripheral non virtual
  • SpiBitOrder, SpiDataMode, SpiMode were renamed to BitOder, DataMode and Mode (#2828)
  • crate::Mode was renamed to crate::DriverMode (#2828)
  • Spi::with_miso has been overloaded into Spi::with_miso and Spi::with_sio1 (#2557)
  • Renamed some I2C error variants (#2844)
  • I2C: Replaced potential panics with errors. (#2831)
  • UART: Make AtCmdConfig and ConfigError non-exhaustive (#2851)
  • UART: Make AtCmdConfig use builder-lite pattern (#2851)
  • UART: Fix naming violations for DataBits, Parity, and StopBits enum variants (#2893)
  • UART: Remove blocking version of read_bytes and rename drain_fifo to read_bytes instead (#2895)
  • Renamed variants of CpuClock, made the enum non-exhaustive (#2899)
  • SPI: Fix naming violations for Mode enum variants (#2902)
  • SPI: Fix naming violations for Address and Command enum variants (#2906)
  • ClockSource enums are now #[non_exhaustive] (#2912)
  • macros module is now private (#2900)
  • gpio::{Input, Flex}::wakeup_enable now returns an error instead of panicking. (#2916)
  • I2C: Have a dedicated enum to specify the timeout (#2864)
  • Removed the I prefix from DriveStrength enum variants. (#2922)
  • Removed the Attenuation prefix from Attenuation enum variants. (#2922)
  • Renamed / changed some I2C error variants (#2844, #2862)
  • The entry macro is replaced by the main macro (#2941)
  • {Uart, UartRx}::read_bytes now blocks until the buffer is filled. (#2935)
  • Bump MSRV to 1.84 (#2951)

Fixed

  • Xtensa devices now correctly enable the esp-hal-procmacros/rtc-slow feature (#2594)
  • User-bound GPIO interrupt handlers should no longer interfere with async pins. (#2625)
  • spi::master::Spi::{into_async, into_blocking} are now correctly available on the typed driver, to. (#2674)
  • It is no longer possible to safely conjure GpioPin instances (#2688)
  • UART: Public API follows C-WORD_ORDER Rust API standard (VerbObject order) (#2851)
  • DmaRxStreamBuf now correctly resets the descriptors the next time it's used (#2890)

Removed

  • Remove more examples. Update doctests. (#2547)
  • The configure and configure_for_async DMA channel functions has been removed (#2403)
  • The DMA channel objects no longer have tx and rx fields. (#2526)
  • SysTimerAlarms has been removed, alarms are now part of the SystemTimer struct (#2576)
  • FrozenUnit, AnyUnit, SpecificUnit, SpecificComparator, AnyComparator have been removed from systimer (#2576)
  • Remove Dma[Rx|Tx]Buffer::length (#2587)
  • esp_hal::psram::psram_range (#2546)
  • The Dma structure has been removed. (#2545)
  • Removed embedded-hal 0.2.x impls and deps from esp-hal (#2593)
  • Removed Camera::set_ functions (#2610)
  • DmaTxBuf::{compute_chunk_size, compute_descriptor_count, new_with_block_size} (#2543)
  • The prelude module has been removed (#2845)
  • SPI: Removed pub fn read_byte and pub fn write_byte (#2915)
  • Removed all peripheral instance type parameters and new_typed constructors (#2907)