stm32: document hrtim, qspi, sdmmc, spi.
This commit is contained in:
		@@ -54,6 +54,7 @@ const SD_INIT_FREQ: Hertz = Hertz(400_000);
 | 
			
		||||
 | 
			
		||||
/// The signalling scheme used on the SDMMC bus
 | 
			
		||||
#[non_exhaustive]
 | 
			
		||||
#[allow(missing_docs)]
 | 
			
		||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
 | 
			
		||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
 | 
			
		||||
pub enum Signalling {
 | 
			
		||||
@@ -70,6 +71,9 @@ impl Default for Signalling {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Aligned data block for SDMMC transfers.
 | 
			
		||||
///
 | 
			
		||||
/// This is a 512-byte array, aligned to 4 bytes to satisfy DMA requirements.
 | 
			
		||||
#[repr(align(4))]
 | 
			
		||||
#[derive(Debug, Clone, PartialEq, Eq)]
 | 
			
		||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
 | 
			
		||||
@@ -94,17 +98,23 @@ impl DerefMut for DataBlock {
 | 
			
		||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
 | 
			
		||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
 | 
			
		||||
pub enum Error {
 | 
			
		||||
    /// Timeout reported by the hardware
 | 
			
		||||
    Timeout,
 | 
			
		||||
    /// Timeout reported by the software driver.
 | 
			
		||||
    SoftwareTimeout,
 | 
			
		||||
    /// Unsupported card version.
 | 
			
		||||
    UnsupportedCardVersion,
 | 
			
		||||
    /// Unsupported card type.
 | 
			
		||||
    UnsupportedCardType,
 | 
			
		||||
    /// CRC error.
 | 
			
		||||
    Crc,
 | 
			
		||||
    DataCrcFail,
 | 
			
		||||
    RxOverFlow,
 | 
			
		||||
    /// No card inserted.
 | 
			
		||||
    NoCard,
 | 
			
		||||
    /// Bad clock supplied to the SDMMC peripheral.
 | 
			
		||||
    BadClock,
 | 
			
		||||
    /// Signaling switch failed.
 | 
			
		||||
    SignalingSwitchFailed,
 | 
			
		||||
    PeripheralBusy,
 | 
			
		||||
    /// ST bit error.
 | 
			
		||||
    #[cfg(sdmmc_v1)]
 | 
			
		||||
    StBitErr,
 | 
			
		||||
}
 | 
			
		||||
@@ -363,6 +373,7 @@ impl<'d, T: Instance, Dma: SdmmcDma<T>> Sdmmc<'d, T, Dma> {
 | 
			
		||||
 | 
			
		||||
#[cfg(sdmmc_v2)]
 | 
			
		||||
impl<'d, T: Instance> Sdmmc<'d, T, NoDma> {
 | 
			
		||||
    /// Create a new SDMMC driver, with 1 data lane.
 | 
			
		||||
    pub fn new_1bit(
 | 
			
		||||
        sdmmc: impl Peripheral<P = T> + 'd,
 | 
			
		||||
        _irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd,
 | 
			
		||||
@@ -396,6 +407,7 @@ impl<'d, T: Instance> Sdmmc<'d, T, NoDma> {
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Create a new SDMMC driver, with 4 data lanes.
 | 
			
		||||
    pub fn new_4bit(
 | 
			
		||||
        sdmmc: impl Peripheral<P = T> + 'd,
 | 
			
		||||
        _irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd,
 | 
			
		||||
@@ -497,7 +509,7 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Data transfer is in progress
 | 
			
		||||
    #[inline(always)]
 | 
			
		||||
    #[inline]
 | 
			
		||||
    fn data_active() -> bool {
 | 
			
		||||
        let regs = T::regs();
 | 
			
		||||
 | 
			
		||||
@@ -509,7 +521,7 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Coammand transfer is in progress
 | 
			
		||||
    #[inline(always)]
 | 
			
		||||
    #[inline]
 | 
			
		||||
    fn cmd_active() -> bool {
 | 
			
		||||
        let regs = T::regs();
 | 
			
		||||
 | 
			
		||||
@@ -521,7 +533,7 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Wait idle on CMDACT, RXACT and TXACT (v1) or DOSNACT and CPSMACT (v2)
 | 
			
		||||
    #[inline(always)]
 | 
			
		||||
    #[inline]
 | 
			
		||||
    fn wait_idle() {
 | 
			
		||||
        while Self::data_active() || Self::cmd_active() {}
 | 
			
		||||
    }
 | 
			
		||||
@@ -837,7 +849,7 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Clear flags in interrupt clear register
 | 
			
		||||
    #[inline(always)]
 | 
			
		||||
    #[inline]
 | 
			
		||||
    fn clear_interrupt_flags() {
 | 
			
		||||
        let regs = T::regs();
 | 
			
		||||
        regs.icr().write(|w| {
 | 
			
		||||
@@ -1152,7 +1164,8 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[inline(always)]
 | 
			
		||||
    /// Read a data block.
 | 
			
		||||
    #[inline]
 | 
			
		||||
    pub async fn read_block(&mut self, block_idx: u32, buffer: &mut DataBlock) -> Result<(), Error> {
 | 
			
		||||
        let card_capacity = self.card()?.card_type;
 | 
			
		||||
 | 
			
		||||
@@ -1204,6 +1217,7 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
 | 
			
		||||
        res
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Write a data block.
 | 
			
		||||
    pub async fn write_block(&mut self, block_idx: u32, buffer: &DataBlock) -> Result<(), Error> {
 | 
			
		||||
        let card = self.card.as_mut().ok_or(Error::NoCard)?;
 | 
			
		||||
 | 
			
		||||
@@ -1283,7 +1297,7 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
 | 
			
		||||
    ///
 | 
			
		||||
    /// Returns Error::NoCard if [`init_card`](#method.init_card)
 | 
			
		||||
    /// has not previously succeeded
 | 
			
		||||
    #[inline(always)]
 | 
			
		||||
    #[inline]
 | 
			
		||||
    pub fn card(&self) -> Result<&Card, Error> {
 | 
			
		||||
        self.card.as_ref().ok_or(Error::NoCard)
 | 
			
		||||
    }
 | 
			
		||||
@@ -1419,7 +1433,9 @@ pub(crate) mod sealed {
 | 
			
		||||
    pub trait Pins<T: Instance> {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// SDMMC instance trait.
 | 
			
		||||
pub trait Instance: sealed::Instance + RccPeripheral + 'static {}
 | 
			
		||||
 | 
			
		||||
pin_trait!(CkPin, Instance);
 | 
			
		||||
pin_trait!(CmdPin, Instance);
 | 
			
		||||
pin_trait!(D0Pin, Instance);
 | 
			
		||||
@@ -1434,7 +1450,10 @@ pin_trait!(D7Pin, Instance);
 | 
			
		||||
#[cfg(sdmmc_v1)]
 | 
			
		||||
dma_trait!(SdmmcDma, Instance);
 | 
			
		||||
 | 
			
		||||
// SDMMCv2 uses internal DMA
 | 
			
		||||
/// DMA instance trait.
 | 
			
		||||
///
 | 
			
		||||
/// This is only implemented for `NoDma`, since SDMMCv2 has DMA built-in, instead of
 | 
			
		||||
/// using ST's system-wide DMA peripheral.
 | 
			
		||||
#[cfg(sdmmc_v2)]
 | 
			
		||||
pub trait SdmmcDma<T: Instance> {}
 | 
			
		||||
#[cfg(sdmmc_v2)]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user