stm32u5: Add support for HSPI peripheral

This commit is contained in:
William Spinelli 2024-12-19 12:15:40 +01:00 committed by Dario Nieuwenhuis
parent 33d6f65453
commit 19efea195d
4 changed files with 1443 additions and 0 deletions

View File

@ -1081,6 +1081,27 @@ fn main() {
(("octospim", "P2_NCS"), quote!(crate::ospi::NSSPin)), (("octospim", "P2_NCS"), quote!(crate::ospi::NSSPin)),
(("octospim", "P2_CLK"), quote!(crate::ospi::SckPin)), (("octospim", "P2_CLK"), quote!(crate::ospi::SckPin)),
(("octospim", "P2_NCLK"), quote!(crate::ospi::NckPin)), (("octospim", "P2_NCLK"), quote!(crate::ospi::NckPin)),
(("hspi", "IO0"), quote!(crate::hspi::D0Pin)),
(("hspi", "IO1"), quote!(crate::hspi::D1Pin)),
(("hspi", "IO2"), quote!(crate::hspi::D2Pin)),
(("hspi", "IO3"), quote!(crate::hspi::D3Pin)),
(("hspi", "IO4"), quote!(crate::hspi::D4Pin)),
(("hspi", "IO5"), quote!(crate::hspi::D5Pin)),
(("hspi", "IO6"), quote!(crate::hspi::D6Pin)),
(("hspi", "IO7"), quote!(crate::hspi::D7Pin)),
(("hspi", "IO8"), quote!(crate::hspi::D8Pin)),
(("hspi", "IO9"), quote!(crate::hspi::D9Pin)),
(("hspi", "IO10"), quote!(crate::hspi::D10Pin)),
(("hspi", "IO11"), quote!(crate::hspi::D11Pin)),
(("hspi", "IO12"), quote!(crate::hspi::D12Pin)),
(("hspi", "IO13"), quote!(crate::hspi::D13Pin)),
(("hspi", "IO14"), quote!(crate::hspi::D14Pin)),
(("hspi", "IO15"), quote!(crate::hspi::D15Pin)),
(("hspi", "DQS0"), quote!(crate::hspi::DQS0Pin)),
(("hspi", "DQS1"), quote!(crate::hspi::DQS1Pin)),
(("hspi", "NCS"), quote!(crate::hspi::NSSPin)),
(("hspi", "CLK"), quote!(crate::hspi::SckPin)),
(("hspi", "NCLK"), quote!(crate::hspi::NckPin)),
(("tsc", "G1_IO1"), quote!(crate::tsc::G1IO1Pin)), (("tsc", "G1_IO1"), quote!(crate::tsc::G1IO1Pin)),
(("tsc", "G1_IO2"), quote!(crate::tsc::G1IO2Pin)), (("tsc", "G1_IO2"), quote!(crate::tsc::G1IO2Pin)),
(("tsc", "G1_IO3"), quote!(crate::tsc::G1IO3Pin)), (("tsc", "G1_IO3"), quote!(crate::tsc::G1IO3Pin)),
@ -1265,6 +1286,7 @@ fn main() {
(("sdmmc", "RX"), quote!(crate::sdmmc::SdmmcDma)), (("sdmmc", "RX"), quote!(crate::sdmmc::SdmmcDma)),
(("quadspi", "QUADSPI"), quote!(crate::qspi::QuadDma)), (("quadspi", "QUADSPI"), quote!(crate::qspi::QuadDma)),
(("octospi", "OCTOSPI1"), quote!(crate::ospi::OctoDma)), (("octospi", "OCTOSPI1"), quote!(crate::ospi::OctoDma)),
(("hspi", "HSPI1"), quote!(crate::hspi::HspiDma)),
(("dac", "CH1"), quote!(crate::dac::DacDma1)), (("dac", "CH1"), quote!(crate::dac::DacDma1)),
(("dac", "CH2"), quote!(crate::dac::DacDma2)), (("dac", "CH2"), quote!(crate::dac::DacDma2)),
(("timer", "UP"), quote!(crate::timer::UpDma)), (("timer", "UP"), quote!(crate::timer::UpDma)),

View File

@ -0,0 +1,411 @@
//! Enums used in Hspi configuration.
#[allow(dead_code)]
#[derive(Copy, Clone, defmt::Format)]
pub(crate) enum HspiMode {
IndirectWrite,
IndirectRead,
AutoPolling,
MemoryMapped,
}
impl Into<u8> for HspiMode {
fn into(self) -> u8 {
match self {
HspiMode::IndirectWrite => 0b00,
HspiMode::IndirectRead => 0b01,
HspiMode::AutoPolling => 0b10,
HspiMode::MemoryMapped => 0b11,
}
}
}
/// Hspi lane width
#[allow(dead_code)]
#[derive(Copy, Clone, defmt::Format)]
pub enum HspiWidth {
/// None
NONE,
/// Single lane
SING,
/// Dual lanes
DUAL,
/// Quad lanes
QUAD,
/// Eight lanes
OCTO,
/// Sixteen lanes
HEXADECA,
}
impl Into<u8> for HspiWidth {
fn into(self) -> u8 {
match self {
HspiWidth::NONE => 0b00,
HspiWidth::SING => 0b01,
HspiWidth::DUAL => 0b10,
HspiWidth::QUAD => 0b11,
HspiWidth::OCTO => 0b100,
HspiWidth::HEXADECA => 0b101,
}
}
}
/// Flash bank selection
#[allow(dead_code)]
#[derive(Copy, Clone, defmt::Format)]
pub enum FlashSelection {
/// Bank 1
Flash1,
/// Bank 2
Flash2,
}
impl Into<bool> for FlashSelection {
fn into(self) -> bool {
match self {
FlashSelection::Flash1 => false,
FlashSelection::Flash2 => true,
}
}
}
/// Wrap Size
#[allow(dead_code)]
#[allow(missing_docs)]
#[derive(Copy, Clone, defmt::Format)]
pub enum WrapSize {
None,
_16Bytes,
_32Bytes,
_64Bytes,
_128Bytes,
}
impl Into<u8> for WrapSize {
fn into(self) -> u8 {
match self {
WrapSize::None => 0x00,
WrapSize::_16Bytes => 0x02,
WrapSize::_32Bytes => 0x03,
WrapSize::_64Bytes => 0x04,
WrapSize::_128Bytes => 0x05,
}
}
}
/// Memory Type
#[allow(missing_docs)]
#[allow(dead_code)]
#[derive(Copy, Clone, defmt::Format)]
pub enum MemoryType {
Micron,
Macronix,
Standard,
MacronixRam,
HyperBusMemory,
HyperBusRegister,
}
impl Into<u8> for MemoryType {
fn into(self) -> u8 {
match self {
MemoryType::Micron => 0x00,
MemoryType::Macronix => 0x01,
MemoryType::Standard => 0x02,
MemoryType::MacronixRam => 0x03,
MemoryType::HyperBusMemory => 0x04,
MemoryType::HyperBusRegister => 0x04,
}
}
}
/// Hspi memory size.
#[allow(missing_docs)]
#[derive(Copy, Clone, defmt::Format)]
pub enum MemorySize {
_1KiB,
_2KiB,
_4KiB,
_8KiB,
_16KiB,
_32KiB,
_64KiB,
_128KiB,
_256KiB,
_512KiB,
_1MiB,
_2MiB,
_4MiB,
_8MiB,
_16MiB,
_32MiB,
_64MiB,
_128MiB,
_256MiB,
_512MiB,
_1GiB,
_2GiB,
_4GiB,
Other(u8),
}
impl Into<u8> for MemorySize {
fn into(self) -> u8 {
match self {
MemorySize::_1KiB => 6,
MemorySize::_2KiB => 7,
MemorySize::_4KiB => 8,
MemorySize::_8KiB => 9,
MemorySize::_16KiB => 10,
MemorySize::_32KiB => 11,
MemorySize::_64KiB => 12,
MemorySize::_128KiB => 13,
MemorySize::_256KiB => 14,
MemorySize::_512KiB => 15,
MemorySize::_1MiB => 16,
MemorySize::_2MiB => 17,
MemorySize::_4MiB => 18,
MemorySize::_8MiB => 19,
MemorySize::_16MiB => 20,
MemorySize::_32MiB => 21,
MemorySize::_64MiB => 22,
MemorySize::_128MiB => 23,
MemorySize::_256MiB => 24,
MemorySize::_512MiB => 25,
MemorySize::_1GiB => 26,
MemorySize::_2GiB => 27,
MemorySize::_4GiB => 28,
MemorySize::Other(val) => val,
}
}
}
/// Hspi Address size
#[derive(Copy, Clone, defmt::Format)]
pub enum AddressSize {
/// 8-bit address
_8Bit,
/// 16-bit address
_16Bit,
/// 24-bit address
_24Bit,
/// 32-bit address
_32Bit,
}
impl Into<u8> for AddressSize {
fn into(self) -> u8 {
match self {
AddressSize::_8Bit => 0b00,
AddressSize::_16Bit => 0b01,
AddressSize::_24Bit => 0b10,
AddressSize::_32Bit => 0b11,
}
}
}
/// Time the Chip Select line stays high.
#[allow(missing_docs)]
#[derive(Copy, Clone, defmt::Format)]
pub enum ChipSelectHighTime {
_1Cycle,
_2Cycle,
_3Cycle,
_4Cycle,
_5Cycle,
_6Cycle,
_7Cycle,
_8Cycle,
}
impl Into<u8> for ChipSelectHighTime {
fn into(self) -> u8 {
match self {
ChipSelectHighTime::_1Cycle => 0,
ChipSelectHighTime::_2Cycle => 1,
ChipSelectHighTime::_3Cycle => 2,
ChipSelectHighTime::_4Cycle => 3,
ChipSelectHighTime::_5Cycle => 4,
ChipSelectHighTime::_6Cycle => 5,
ChipSelectHighTime::_7Cycle => 6,
ChipSelectHighTime::_8Cycle => 7,
}
}
}
/// FIFO threshold.
#[allow(missing_docs)]
#[derive(Copy, Clone, defmt::Format)]
pub enum FIFOThresholdLevel {
_1Bytes,
_2Bytes,
_3Bytes,
_4Bytes,
_5Bytes,
_6Bytes,
_7Bytes,
_8Bytes,
_9Bytes,
_10Bytes,
_11Bytes,
_12Bytes,
_13Bytes,
_14Bytes,
_15Bytes,
_16Bytes,
_17Bytes,
_18Bytes,
_19Bytes,
_20Bytes,
_21Bytes,
_22Bytes,
_23Bytes,
_24Bytes,
_25Bytes,
_26Bytes,
_27Bytes,
_28Bytes,
_29Bytes,
_30Bytes,
_31Bytes,
_32Bytes,
}
impl Into<u8> for FIFOThresholdLevel {
fn into(self) -> u8 {
match self {
FIFOThresholdLevel::_1Bytes => 0,
FIFOThresholdLevel::_2Bytes => 1,
FIFOThresholdLevel::_3Bytes => 2,
FIFOThresholdLevel::_4Bytes => 3,
FIFOThresholdLevel::_5Bytes => 4,
FIFOThresholdLevel::_6Bytes => 5,
FIFOThresholdLevel::_7Bytes => 6,
FIFOThresholdLevel::_8Bytes => 7,
FIFOThresholdLevel::_9Bytes => 8,
FIFOThresholdLevel::_10Bytes => 9,
FIFOThresholdLevel::_11Bytes => 10,
FIFOThresholdLevel::_12Bytes => 11,
FIFOThresholdLevel::_13Bytes => 12,
FIFOThresholdLevel::_14Bytes => 13,
FIFOThresholdLevel::_15Bytes => 14,
FIFOThresholdLevel::_16Bytes => 15,
FIFOThresholdLevel::_17Bytes => 16,
FIFOThresholdLevel::_18Bytes => 17,
FIFOThresholdLevel::_19Bytes => 18,
FIFOThresholdLevel::_20Bytes => 19,
FIFOThresholdLevel::_21Bytes => 20,
FIFOThresholdLevel::_22Bytes => 21,
FIFOThresholdLevel::_23Bytes => 22,
FIFOThresholdLevel::_24Bytes => 23,
FIFOThresholdLevel::_25Bytes => 24,
FIFOThresholdLevel::_26Bytes => 25,
FIFOThresholdLevel::_27Bytes => 26,
FIFOThresholdLevel::_28Bytes => 27,
FIFOThresholdLevel::_29Bytes => 28,
FIFOThresholdLevel::_30Bytes => 29,
FIFOThresholdLevel::_31Bytes => 30,
FIFOThresholdLevel::_32Bytes => 31,
}
}
}
/// Dummy cycle count
#[allow(missing_docs)]
#[derive(Copy, Clone, defmt::Format)]
pub enum DummyCycles {
_0,
_1,
_2,
_3,
_4,
_5,
_6,
_7,
_8,
_9,
_10,
_11,
_12,
_13,
_14,
_15,
_16,
_17,
_18,
_19,
_20,
_21,
_22,
_23,
_24,
_25,
_26,
_27,
_28,
_29,
_30,
_31,
}
impl Into<u8> for DummyCycles {
fn into(self) -> u8 {
match self {
DummyCycles::_0 => 0,
DummyCycles::_1 => 1,
DummyCycles::_2 => 2,
DummyCycles::_3 => 3,
DummyCycles::_4 => 4,
DummyCycles::_5 => 5,
DummyCycles::_6 => 6,
DummyCycles::_7 => 7,
DummyCycles::_8 => 8,
DummyCycles::_9 => 9,
DummyCycles::_10 => 10,
DummyCycles::_11 => 11,
DummyCycles::_12 => 12,
DummyCycles::_13 => 13,
DummyCycles::_14 => 14,
DummyCycles::_15 => 15,
DummyCycles::_16 => 16,
DummyCycles::_17 => 17,
DummyCycles::_18 => 18,
DummyCycles::_19 => 19,
DummyCycles::_20 => 20,
DummyCycles::_21 => 21,
DummyCycles::_22 => 22,
DummyCycles::_23 => 23,
DummyCycles::_24 => 24,
DummyCycles::_25 => 25,
DummyCycles::_26 => 26,
DummyCycles::_27 => 27,
DummyCycles::_28 => 28,
DummyCycles::_29 => 29,
DummyCycles::_30 => 30,
DummyCycles::_31 => 31,
}
}
}
/// Functional mode
#[allow(missing_docs)]
#[allow(dead_code)]
#[derive(Copy, Clone, defmt::Format)]
pub enum FunctionalMode {
IndirectWrite,
IndirectRead,
AutoStatusPolling,
MemoryMapped,
}
impl Into<u8> for FunctionalMode {
fn into(self) -> u8 {
match self {
FunctionalMode::IndirectWrite => 0x00,
FunctionalMode::IndirectRead => 0x01,
FunctionalMode::AutoStatusPolling => 0x02,
FunctionalMode::MemoryMapped => 0x03,
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -83,6 +83,8 @@ pub mod hash;
pub mod hrtim; pub mod hrtim;
#[cfg(hsem)] #[cfg(hsem)]
pub mod hsem; pub mod hsem;
#[cfg(hspi)]
pub mod hspi;
#[cfg(i2c)] #[cfg(i2c)]
pub mod i2c; pub mod i2c;
#[cfg(any(all(spi_v1, rcc_f4), spi_v3))] #[cfg(any(all(spi_v1, rcc_f4), spi_v3))]