Expand description
no_std SD/MMC protocol building blocks for embedded systems.
This crate provides protocol-level types and driver skeletons for SD, MMC and SDIO cards. It is transport-agnostic at the trait level and brings its own SPI-mode driver plus an SDIO host-controller abstraction.
§What you get
cmd::Command/cmd::DataDirection: SD/MMC command opcodes, argument encoding and per-command data direction.response::Responseand friends (response::CidResponse,response::CsdResponse,response::SwitchStatus, …): typed parsers for the response formats defined in the SD spec.error::Error: a single error enum the drivers and parsers return.spi(featurespi, on by default): aspi::SpiTransporttrait plus thespi::SpiSdmmcdriver for SPI-mode SD cards. Includes a thinspi::SpiDeviceWrapperadapter forembedded-hal1.0SpiDevice<u8>implementations.- [
sdio] (featuresdio): a [sdio::SdioHost] trait that abstracts a host controller and the [sdio::SdioSdmmc] driver that drives it through card initialization, block I/O and bus-speed selection.
§Cargo features
| Feature | Default | Purpose |
|---|---|---|
spi | yes | Enables spi::SpiTransport and spi::SpiSdmmc. |
sdio | no | Enables the host trait and submit/poll data-command contract. |
Diagnostic output goes through the log crate; configure a logger in
your application to capture it.
§Example
ⓘ
use embedded_hal::delay::DelayNs;
use sdmmc_protocol::{
Error,
spi::{SpiSdmmc, SpiTransport},
};
struct MySpi;
impl SpiTransport for MySpi {
fn transfer_byte(&mut self, byte: u8) -> Result<u8, Error> {
}
}
fn boot<D: DelayNs>(spi: MySpi, delay: D) -> Result<(), Error> {
let mut card = SpiSdmmc::new(spi, delay);
let _info = card.init()?;
let mut block = [0u8; 512];
card.read_block(0, &mut block)?;
Ok(())
}§Maturity
The SPI path has protocol-level unit tests and basic block read/write support. The SDIO path is a host abstraction skeleton and needs platform-specific validation before use on real hardware.
§MSRV
Rust 1.85 (the first stable to ship edition 2024).
Re-exports§
pub use block::BlockBufferConfig;pub use block::BlockPoll;pub use block::BlockRequestId;pub use block::BlockTransferDirection;pub use block::BlockTransferMode;pub use block::BlockTransferState;pub use block::CommandPoll;pub use block::CommandResponsePoll;pub use block::DataCommandDirection;pub use block::DataCommandPoll;pub use block::DataCommandState;pub use block::OperationPoll;pub use cmd::Command;pub use cmd::DataDirection;pub use error::Error;pub use error::ErrorContext;pub use error::Phase;pub use response::CidResponse;pub use response::CsdResponse;pub use response::Response;pub use response::SwitchStatus;