0.23.0
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
andconfigure
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 aConfig
strurct that contains frequency, bit/byte order, VSync filter options.- DPI, I8080:
frequency
has been moved intoConfig
.
+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 thenb
crate if you need it.ExtU64
andRateExtU32
have been moved toesp_hal::time
Clock
andCpuClock
: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 asesp_hal::entry
, while other macros are found underesp_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 theDmaChannel
trait on GDMA devices (#2403, #2526) - Added
into_async
andinto_blocking
functions forParlIoTxOnly
,ParlIoRxOnly
(#2526) - ESP32-C6, H2, S3: Added
split
function to theDmaChannel
trait. (#2526, #2532) - DMA:
PeripheralDmaChannel
type aliasses andDmaChannelFor
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 theDmaChannel
trait. (#2526) - Added PSRAM configuration to
esp_hal::Config
ifquad-psram
oroctal-psram
is enabled (#2546) - Added
esp_hal::psram::psram_raw_parts
(#2546) - The timer drivers
OneShotTimer
&PeriodicTimer
haveinto_async
andnew_typed
methods (#2586) timer::Timer
trait has three new methods,wait
,async_interrupt_handler
andperipheral_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
andCamera::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
anddefmt::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 toSpi
(#2691) InterruptHandler
now implementsHash
anddefmt::Format
(#2830)uart::ConfigError
now implementsEq
(#2825)i2c::master::Error
now implementsEq
andHash
(#2825)i2c::master::Operation
now implementsDebug
,PartialEq
,Eq
,Hash
, andDisplay
(#2825)i2c::master::Config
now implementsPartialEq
,Eq
, ansHash
(#2825)i2c::master::I2c
now implementsDebug
,PartialEq
, andEq
(#2825)i2c::master::Info
now implementsDebug
(#2825)spi::master::Config
now implementsHash
(#2823)spi::master
drivers now implementDebug
anddefmt::Format
(#2823)DmaRxBuf
,DmaTxBuf
andDmaRxTxBuf
now implementDebug
anddefmt::Format
(#2823)- DMA channels (
AnyGdmaChannel
,SpiDmaChannel
,I2sDmaChannel
,CryptoDmaChannel
) and their RX/TX halves now implementDebug
anddefmt::Format
(#2823) DmaDescriptor
andDmaDescriptorFlags
now implementPartialEq
andEq
(#2823)gpio::{Event, WakeEvent, GpioRegisterAccess}
now implementDebug
,Eq
,PartialEq
andHash
(#2842)gpio::{Level, Pull, AlternateFunction, RtcFunction}
now implementHash
(#2842)gpio::{GpioPin, AnyPin, Io, Output, OutputOpenDrain, Input, Flex}
now implementDebug
,defmt::Format
(#2842)- More interrupts are available in
esp_hal::spi::master::SpiInterrupt
, addenable_listen
,interrupts
andclear_interrupts
for ESP32/ESP32-S2 (#2833) - The
ExtU64
andRateExtU32
traits have been added toesp_hal::time
(#2845) - Added
AnyPin::steal(pin_number)
(#2854) adc::{AdcCalSource, Attenuation, Resolution}
now implementHash
anddefmt::Format
(#2840)rtc_cntl::{RtcFastClock, RtcSlowClock, RtcCalSel}
now implementPartialEq
,Eq
,Hash
anddefmt::Format
(#2840)- Added
tsens::TemperatureSensor
peripheral for ESP32C6 and ESP32C3 (#2875) - Added
with_rx()
andwith_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
. TheChannel
drivers are now managed by DMA enabled peripheral drivers. (#2526) - The
Dpi
driver andDpiTransfer
now have aMode
type parameter. The driver's asyncness is determined by the asyncness of theLcd
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 renamedSystemTimer::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)SystemTimer
sAlarm
s are now type erased (#2576)TimerGroup
Timer
s are now type erased (#2581)- PSRAM is now initialized automatically if
quad-psram
oroctal-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 aMode
parameter and type erase the underlying driver by default (#2586) timer::Timer
has new trait requirements ofInto<AnyTimer>
,'static
andInterruptConfigurable
(#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
andI2C
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
andPeripheralOutput
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 toBitOder
,DataMode
andMode
(#2828)crate::Mode
was renamed tocrate::DriverMode
(#2828)Spi::with_miso
has been overloaded intoSpi::with_miso
andSpi::with_sio1
(#2557)- Renamed some I2C error variants (#2844)
- I2C: Replaced potential panics with errors. (#2831)
- UART: Make
AtCmdConfig
andConfigError
non-exhaustive (#2851) - UART: Make
AtCmdConfig
use builder-lite pattern (#2851) - UART: Fix naming violations for
DataBits
,Parity
, andStopBits
enum variants (#2893) - UART: Remove blocking version of
read_bytes
and renamedrain_fifo
toread_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
andCommand
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 fromDriveStrength
enum variants. (#2922) - Removed the
Attenuation
prefix fromAttenuation
enum variants. (#2922) - Renamed / changed some I2C error variants (#2844, #2862)
- The
entry
macro is replaced by themain
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
andconfigure_for_async
DMA channel functions has been removed (#2403) - The DMA channel objects no longer have
tx
andrx
fields. (#2526) SysTimerAlarms
has been removed, alarms are now part of theSystemTimer
struct (#2576)FrozenUnit
,AnyUnit
,SpecificUnit
,SpecificComparator
,AnyComparator
have been removed fromsystimer
(#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 fromesp-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
andpub fn write_byte
(#2915) - Removed all peripheral instance type parameters and
new_typed
constructors (#2907)