#[derive(Debug, Fail)]
pub enum DmaError {
#[fail(display = "DMA read error.")]
Rx,
#[fail(display = "DMA write error.")]
Tx,
}
#[derive(Debug, Fail)]
pub enum R1Error {
#[fail(display = "Illegal command.")]
Illegal,
#[fail(display = "Command CRC mismatch.")]
Crc,
#[fail(display = "Invalid erase sequence.")]
InvalidEraseSequence,
#[fail(display = "Misaligned address.")]
Address,
#[fail(display = "Invalid argument.")]
Parameter,
}
#[derive(Debug, Fail)]
pub enum ReadError {
#[fail(display = "Read error.")]
Unknown,
#[fail(display = "Internal card error.")]
Card,
#[fail(display = "ECC error.")]
Ecc,
#[fail(display = "Out of range.")]
OutOfRange,
}
#[derive(Debug, Fail)]
pub enum WriteError {
#[fail(display = "CRC error.")]
Crc,
#[fail(display = "Write error.")]
Unknown,
#[fail(display = "Card is locked.")]
Locked,
#[fail(display = "Erase protect violation or lock failed.")]
WriteProtectEraseOrLockFailed,
#[fail(display = "Internal card error.")]
Card,
#[fail(display = "ECC error.")]
Ecc,
#[fail(display = "Write protect violation.")]
WriteProtect,
#[fail(display = "Erase param error.")]
EraseParam,
#[fail(display = "Out of range or CSD overwrite.")]
OutOfRangeOrCsdOverwrite,
}
#[derive(Debug, Fail)]
pub enum CmdError {
#[fail(display = "DMA error: {}", _0)]
Dma(DmaError),
#[fail(display = "SPI error.")]
Spi,
#[fail(display = "Command timeout.")]
Timeout,
#[fail(display = "R1 error: {}", _0)]
R1(R1Error),
#[fail(display = "Read error: {}", _0)]
Read(ReadError),
#[fail(display = "Write error: {}", _0)]
Write(WriteError),
#[fail(display = "Data CRC mismatch.")]
DataCrc,
}
#[derive(Debug, Fail)]
pub enum SpiInitError {
#[fail(display = "Command error: {}", _0)]
Cmd(CmdError),
#[fail(display = "Failed to go idle.")]
NotIdle,
#[fail(display = "Condition mismatch.")]
CondMismatch,
#[fail(display = "Unsupported voltage.")]
UnsupportedVoltage,
}
impl From<DmaError> for CmdError {
#[inline(always)]
fn from(err: DmaError) -> Self {
CmdError::Dma(err)
}
}
impl From<R1Error> for CmdError {
#[inline(always)]
fn from(err: R1Error) -> Self {
CmdError::R1(err)
}
}
impl From<ReadError> for CmdError {
#[inline(always)]
fn from(err: ReadError) -> Self {
CmdError::Read(err)
}
}
impl From<WriteError> for CmdError {
#[inline(always)]
fn from(err: WriteError) -> Self {
CmdError::Write(err)
}
}
impl From<DmaError> for SpiInitError {
#[inline(always)]
fn from(err: DmaError) -> Self {
err.into()
}
}
impl From<CmdError> for SpiInitError {
#[inline(always)]
fn from(err: CmdError) -> Self {
SpiInitError::Cmd(err)
}
}