SPI peripheral signal cleanup (#2245)

* Compact peripheral description a bit

* Enable QSPI on ESP32 SPI3

* Remove SPI4 from ESP32S2

* Changelog

* Remove inaccurate comment
This commit is contained in:
Dániel Buga 2024-09-27 19:03:18 +02:00 committed by GitHub
parent 4422ed3ccf
commit 0981c1b619
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 178 additions and 268 deletions

View File

@ -73,6 +73,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- SPI: Fixed an issue where repeated calls to `dma_transfer` may end up looping indefinitely (#2179) - SPI: Fixed an issue where repeated calls to `dma_transfer` may end up looping indefinitely (#2179)
- SPI: Fixed an issue that prevented correctly reading the first byte in a transaction (#2179) - SPI: Fixed an issue that prevented correctly reading the first byte in a transaction (#2179)
- SPI: ESP32: Send address with correct data mode even when no data is sent. (#2231) - SPI: ESP32: Send address with correct data mode even when no data is sent. (#2231)
- SPI: ESP32: Allow using QSPI mode on SPI3. (#2245)
- PARL_IO: Fixed an issue that caused garbage to be output at the start of some requests (#2211) - PARL_IO: Fixed an issue that caused garbage to be output at the start of some requests (#2211)
- TWAI on ESP32 (#2207) - TWAI on ESP32 (#2207)

View File

@ -507,10 +507,7 @@ where
/// ///
/// Copies the content of `words` in chunks of 64 bytes into the SPI /// Copies the content of `words` in chunks of 64 bytes into the SPI
/// transmission FIFO. If `words` is longer than 64 bytes, multiple /// transmission FIFO. If `words` is longer than 64 bytes, multiple
/// sequential transfers are performed. This function will return before /// sequential transfers are performed.
/// all bytes of the last chunk to transmit have been sent to the wire. If
/// you must ensure that the whole messages was written correctly, use
/// `flush`.
pub fn write_bytes(&mut self, words: &[u8]) -> Result<(), Error> { pub fn write_bytes(&mut self, words: &[u8]) -> Result<(), Error> {
self.spi.write_bytes(words)?; self.spi.write_bytes(words)?;
self.spi.flush()?; self.spi.flush()?;
@ -2466,6 +2463,8 @@ pub trait ExtendedInstance: Instance {
#[doc(hidden)] #[doc(hidden)]
pub trait Instance: private::Sealed { pub trait Instance: private::Sealed {
fn peripheral(&self) -> crate::system::Peripheral;
fn register_block(&self) -> &RegisterBlock; fn register_block(&self) -> &RegisterBlock;
fn sclk_signal(&self) -> OutputSignal; fn sclk_signal(&self) -> OutputSignal;
@ -2476,9 +2475,15 @@ pub trait Instance: private::Sealed {
fn cs_signal(&self) -> OutputSignal; fn cs_signal(&self) -> OutputSignal;
fn enable_peripheral(&self); #[inline(always)]
fn enable_peripheral(&self) {
PeripheralClockControl::enable(self.peripheral());
}
fn reset_peripheral(&self); #[inline(always)]
fn reset_peripheral(&self) {
PeripheralClockControl::reset(self.peripheral());
}
fn spi_num(&self) -> u8; fn spi_num(&self) -> u8;
@ -3136,13 +3141,23 @@ fn set_up_common_phases(reg_block: &RegisterBlock, cmd: Command, address: Addres
} }
} }
#[cfg(any(esp32c2, esp32c3, esp32c6, esp32h2))] #[cfg(spi2)]
impl Instance for crate::peripherals::SPI2 { impl Instance for crate::peripherals::SPI2 {
#[inline(always)] #[inline(always)]
fn register_block(&self) -> &RegisterBlock { fn register_block(&self) -> &RegisterBlock {
self self
} }
#[inline(always)]
fn spi_num(&self) -> u8 {
2
}
#[inline(always)]
fn peripheral(&self) -> crate::system::Peripheral {
crate::system::Peripheral::Spi2
}
#[inline(always)] #[inline(always)]
fn set_interrupt_handler(&mut self, handler: InterruptHandler) { fn set_interrupt_handler(&mut self, handler: InterruptHandler) {
self.bind_spi2_interrupt(handler.handler()); self.bind_spi2_interrupt(handler.handler());
@ -3151,156 +3166,137 @@ impl Instance for crate::peripherals::SPI2 {
#[inline(always)] #[inline(always)]
fn sclk_signal(&self) -> OutputSignal { fn sclk_signal(&self) -> OutputSignal {
OutputSignal::FSPICLK_MUX cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::HSPICLK
} else if #[cfg(any(esp32s2, esp32s3))] {
OutputSignal::FSPICLK
} else {
OutputSignal::FSPICLK_MUX
}
}
} }
#[inline(always)] #[inline(always)]
fn mosi_signal(&self) -> OutputSignal { fn mosi_signal(&self) -> OutputSignal {
OutputSignal::FSPID cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::HSPID
} else {
OutputSignal::FSPID
}
}
} }
#[inline(always)] #[inline(always)]
fn miso_signal(&self) -> InputSignal { fn miso_signal(&self) -> InputSignal {
InputSignal::FSPIQ cfg_if::cfg_if! {
if #[cfg(esp32)] {
InputSignal::HSPIQ
} else {
InputSignal::FSPIQ
}
}
} }
#[inline(always)] #[inline(always)]
fn cs_signal(&self) -> OutputSignal { fn cs_signal(&self) -> OutputSignal {
OutputSignal::FSPICS0 cfg_if::cfg_if! {
} if #[cfg(esp32)] {
OutputSignal::HSPICS0
#[inline(always)] } else {
fn enable_peripheral(&self) { OutputSignal::FSPICS0
PeripheralClockControl::enable(crate::system::Peripheral::Spi2); }
} }
#[inline(always)]
fn reset_peripheral(&self) {
PeripheralClockControl::reset(crate::system::Peripheral::Spi2);
}
#[inline(always)]
fn spi_num(&self) -> u8 {
2
} }
} }
#[cfg(any(esp32c2, esp32c3, esp32c6, esp32h2))] #[cfg(spi2)]
impl ExtendedInstance for crate::peripherals::SPI2 { impl ExtendedInstance for crate::peripherals::SPI2 {
#[inline(always)] #[inline(always)]
fn sio0_input_signal(&self) -> InputSignal { fn sio0_input_signal(&self) -> InputSignal {
InputSignal::FSPID cfg_if::cfg_if! {
if #[cfg(esp32)] {
InputSignal::HSPID
} else {
InputSignal::FSPID
}
}
} }
#[inline(always)] #[inline(always)]
fn sio1_output_signal(&self) -> OutputSignal { fn sio1_output_signal(&self) -> OutputSignal {
OutputSignal::FSPIQ cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::HSPIQ
} else {
OutputSignal::FSPIQ
}
}
} }
#[inline(always)] #[inline(always)]
fn sio2_output_signal(&self) -> OutputSignal { fn sio2_output_signal(&self) -> OutputSignal {
OutputSignal::FSPIWP cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::HSPIWP
} else {
OutputSignal::FSPIWP
}
}
} }
#[inline(always)] #[inline(always)]
fn sio2_input_signal(&self) -> InputSignal { fn sio2_input_signal(&self) -> InputSignal {
InputSignal::FSPIWP cfg_if::cfg_if! {
if #[cfg(esp32)] {
InputSignal::HSPIWP
} else {
InputSignal::FSPIWP
}
}
} }
#[inline(always)] #[inline(always)]
fn sio3_output_signal(&self) -> OutputSignal { fn sio3_output_signal(&self) -> OutputSignal {
OutputSignal::FSPIHD cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::HSPIHD
} else {
OutputSignal::FSPIHD
}
}
} }
#[inline(always)] #[inline(always)]
fn sio3_input_signal(&self) -> InputSignal { fn sio3_input_signal(&self) -> InputSignal {
InputSignal::FSPIHD cfg_if::cfg_if! {
if #[cfg(esp32)] {
InputSignal::HSPIHD
} else {
InputSignal::FSPIHD
}
}
} }
} }
#[cfg(esp32)] #[cfg(spi3)]
impl Instance for crate::peripherals::SPI2 {
#[inline(always)]
fn register_block(&self) -> &RegisterBlock {
self
}
#[inline(always)]
fn set_interrupt_handler(&mut self, handler: InterruptHandler) {
self.bind_spi2_interrupt(handler.handler());
crate::interrupt::enable(crate::peripherals::Interrupt::SPI2, handler.priority()).unwrap();
}
#[inline(always)]
fn sclk_signal(&self) -> OutputSignal {
OutputSignal::HSPICLK
}
#[inline(always)]
fn mosi_signal(&self) -> OutputSignal {
OutputSignal::HSPID
}
#[inline(always)]
fn miso_signal(&self) -> InputSignal {
InputSignal::HSPIQ
}
#[inline(always)]
fn cs_signal(&self) -> OutputSignal {
OutputSignal::HSPICS0
}
#[inline(always)]
fn enable_peripheral(&self) {
PeripheralClockControl::enable(crate::system::Peripheral::Spi2);
}
#[inline(always)]
fn reset_peripheral(&self) {
PeripheralClockControl::reset(crate::system::Peripheral::Spi2);
}
#[inline(always)]
fn spi_num(&self) -> u8 {
2
}
}
#[cfg(esp32)]
impl ExtendedInstance for crate::peripherals::SPI2 {
fn sio0_input_signal(&self) -> InputSignal {
InputSignal::HSPID
}
fn sio1_output_signal(&self) -> OutputSignal {
OutputSignal::HSPIQ
}
fn sio2_output_signal(&self) -> OutputSignal {
OutputSignal::HSPIWP
}
fn sio2_input_signal(&self) -> InputSignal {
InputSignal::HSPIWP
}
fn sio3_output_signal(&self) -> OutputSignal {
OutputSignal::HSPIHD
}
fn sio3_input_signal(&self) -> InputSignal {
InputSignal::HSPIHD
}
}
#[cfg(esp32)]
impl Instance for crate::peripherals::SPI3 { impl Instance for crate::peripherals::SPI3 {
#[inline(always)] #[inline(always)]
fn register_block(&self) -> &RegisterBlock { fn register_block(&self) -> &RegisterBlock {
self self
} }
#[inline(always)]
fn spi_num(&self) -> u8 {
3
}
#[inline(always)]
fn peripheral(&self) -> crate::system::Peripheral {
crate::system::Peripheral::Spi3
}
#[inline(always)] #[inline(always)]
fn set_interrupt_handler(&mut self, handler: InterruptHandler) { fn set_interrupt_handler(&mut self, handler: InterruptHandler) {
self.bind_spi3_interrupt(handler.handler()); self.bind_spi3_interrupt(handler.handler());
@ -3309,200 +3305,114 @@ impl Instance for crate::peripherals::SPI3 {
#[inline(always)] #[inline(always)]
fn sclk_signal(&self) -> OutputSignal { fn sclk_signal(&self) -> OutputSignal {
OutputSignal::VSPICLK cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::VSPICLK
} else {
OutputSignal::SPI3_CLK
}
}
} }
#[inline(always)] #[inline(always)]
fn mosi_signal(&self) -> OutputSignal { fn mosi_signal(&self) -> OutputSignal {
OutputSignal::VSPID cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::VSPID
} else {
OutputSignal::SPI3_D
}
}
} }
#[inline(always)] #[inline(always)]
fn miso_signal(&self) -> InputSignal { fn miso_signal(&self) -> InputSignal {
InputSignal::VSPIQ cfg_if::cfg_if! {
if #[cfg(esp32)] {
InputSignal::VSPIQ
} else {
InputSignal::SPI3_Q
}
}
} }
#[inline(always)] #[inline(always)]
fn cs_signal(&self) -> OutputSignal { fn cs_signal(&self) -> OutputSignal {
OutputSignal::VSPICS0 cfg_if::cfg_if! {
} if #[cfg(esp32)] {
OutputSignal::VSPICS0
#[inline(always)] } else {
fn enable_peripheral(&self) { OutputSignal::SPI3_CS0
PeripheralClockControl::enable(crate::system::Peripheral::Spi3) }
} }
#[inline(always)]
fn reset_peripheral(&self) {
PeripheralClockControl::reset(crate::system::Peripheral::Spi3)
}
#[inline(always)]
fn spi_num(&self) -> u8 {
3
} }
} }
#[cfg(any(esp32s2, esp32s3))] #[cfg(all(spi3, any(esp32, esp32s3)))]
impl Instance for crate::peripherals::SPI2 {
#[inline(always)]
fn register_block(&self) -> &RegisterBlock {
self
}
#[inline(always)]
fn set_interrupt_handler(&mut self, handler: InterruptHandler) {
self.bind_spi2_interrupt(handler.handler());
crate::interrupt::enable(crate::peripherals::Interrupt::SPI2, handler.priority()).unwrap();
}
#[inline(always)]
fn sclk_signal(&self) -> OutputSignal {
OutputSignal::FSPICLK
}
#[inline(always)]
fn mosi_signal(&self) -> OutputSignal {
OutputSignal::FSPID
}
#[inline(always)]
fn miso_signal(&self) -> InputSignal {
InputSignal::FSPIQ
}
#[inline(always)]
fn cs_signal(&self) -> OutputSignal {
OutputSignal::FSPICS0
}
#[inline(always)]
fn enable_peripheral(&self) {
PeripheralClockControl::enable(crate::system::Peripheral::Spi2)
}
#[inline(always)]
fn reset_peripheral(&self) {
PeripheralClockControl::reset(crate::system::Peripheral::Spi2)
}
#[inline(always)]
fn spi_num(&self) -> u8 {
2
}
}
#[cfg(any(esp32s2, esp32s3))]
impl ExtendedInstance for crate::peripherals::SPI2 {
#[inline(always)]
fn sio0_input_signal(&self) -> InputSignal {
InputSignal::FSPID
}
#[inline(always)]
fn sio1_output_signal(&self) -> OutputSignal {
OutputSignal::FSPIQ
}
#[inline(always)]
fn sio2_output_signal(&self) -> OutputSignal {
OutputSignal::FSPIWP
}
#[inline(always)]
fn sio2_input_signal(&self) -> InputSignal {
InputSignal::FSPIWP
}
#[inline(always)]
fn sio3_output_signal(&self) -> OutputSignal {
OutputSignal::FSPIHD
}
#[inline(always)]
fn sio3_input_signal(&self) -> InputSignal {
InputSignal::FSPIHD
}
}
#[cfg(any(esp32s2, esp32s3))]
impl Instance for crate::peripherals::SPI3 {
#[inline(always)]
fn register_block(&self) -> &RegisterBlock {
self
}
#[inline(always)]
fn set_interrupt_handler(&mut self, handler: InterruptHandler) {
self.bind_spi3_interrupt(handler.handler());
crate::interrupt::enable(crate::peripherals::Interrupt::SPI3, handler.priority()).unwrap();
}
#[inline(always)]
fn sclk_signal(&self) -> OutputSignal {
OutputSignal::SPI3_CLK
}
#[inline(always)]
fn mosi_signal(&self) -> OutputSignal {
OutputSignal::SPI3_D
}
#[inline(always)]
fn miso_signal(&self) -> InputSignal {
InputSignal::SPI3_Q
}
#[inline(always)]
fn cs_signal(&self) -> OutputSignal {
OutputSignal::SPI3_CS0
}
#[inline(always)]
fn enable_peripheral(&self) {
PeripheralClockControl::enable(crate::system::Peripheral::Spi3)
}
#[inline(always)]
fn reset_peripheral(&self) {
PeripheralClockControl::reset(crate::system::Peripheral::Spi3)
}
#[inline(always)]
fn spi_num(&self) -> u8 {
3
}
}
#[cfg(esp32s3)]
impl ExtendedInstance for crate::peripherals::SPI3 { impl ExtendedInstance for crate::peripherals::SPI3 {
#[inline(always)] #[inline(always)]
fn sio0_input_signal(&self) -> InputSignal { fn sio0_input_signal(&self) -> InputSignal {
InputSignal::SPI3_D cfg_if::cfg_if! {
if #[cfg(esp32)] {
InputSignal::HSPID
} else {
InputSignal::SPI3_D
}
}
} }
#[inline(always)] #[inline(always)]
fn sio1_output_signal(&self) -> OutputSignal { fn sio1_output_signal(&self) -> OutputSignal {
OutputSignal::SPI3_Q cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::HSPIQ
} else {
OutputSignal::SPI3_Q
}
}
} }
#[inline(always)] #[inline(always)]
fn sio2_output_signal(&self) -> OutputSignal { fn sio2_output_signal(&self) -> OutputSignal {
OutputSignal::SPI3_WP cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::HSPIWP
} else {
OutputSignal::SPI3_WP
}
}
} }
#[inline(always)] #[inline(always)]
fn sio2_input_signal(&self) -> InputSignal { fn sio2_input_signal(&self) -> InputSignal {
InputSignal::SPI3_WP cfg_if::cfg_if! {
if #[cfg(esp32)] {
InputSignal::HSPIWP
} else {
InputSignal::SPI3_WP
}
}
} }
#[inline(always)] #[inline(always)]
fn sio3_output_signal(&self) -> OutputSignal { fn sio3_output_signal(&self) -> OutputSignal {
OutputSignal::SPI3_HD cfg_if::cfg_if! {
if #[cfg(esp32)] {
OutputSignal::HSPIHD
} else {
OutputSignal::SPI3_HD
}
}
} }
#[inline(always)] #[inline(always)]
fn sio3_input_signal(&self) -> InputSignal { fn sio3_input_signal(&self) -> InputSignal {
InputSignal::SPI3_HD cfg_if::cfg_if! {
if #[cfg(esp32)] {
InputSignal::HSPIHD
} else {
InputSignal::SPI3_HD
}
}
} }
} }

View File

@ -34,7 +34,6 @@ peripherals = [
"spi1", "spi1",
"spi2", "spi2",
"spi3", "spi3",
"spi4",
"system", "system",
"systimer", "systimer",
"timg0", "timg0",