Skip to main content

rp_sdio/
errors.rs

1//! Possible errors that can be thrown
2
3use embedded_io::{blocking::ReadExactError, Error, ErrorKind};
4use snafu::prelude::*;
5
6#[derive(Debug, Snafu)]
7#[non_exhaustive]
8pub enum SdioError {
9    #[snafu(display("Timeout on SD command!"))]
10    CmdTimeout { cmd: u8, time_ms: u64 },
11    #[snafu(display("Timeout on write!"))]
12    WriteTimeout { time_ms: u64 },
13    #[snafu(display("Response is to the wrong command!"))]
14    WrongCmd { good_cmd: u8, bad_cmd: u8 },
15    #[snafu(display("Bad rx CRC7!"))]
16    BadRxCrc7 { good_crc: u8, bad_crc: u8 },
17    #[snafu(display("Bad tx CRC7!"))]
18    BadTxCrc7 {},
19    #[snafu(display("Bad rx CRC16!"))]
20    BadRxCrc16 { good_crc: u64, bad_crc: u64 },
21    #[snafu(display("Bad tx CRC16!"))]
22    BadTxCrc16 {},
23    #[snafu(display("Bad CMD8 check pattern!"))]
24    BadCheck { good_check: u8, bad_check: u8 },
25    #[snafu(display("Bad CMD8 voltage!"))]
26    BadVoltage { bad_volt: u8 },
27    #[snafu(display("Bad OCR voltage range!"))]
28    BadVoltRange { range: u32 },
29    #[snafu(display("Failed to write!"))]
30    WriteFail {},
31    #[snafu(display("Unknown response to write!"))]
32    WriteUnknown { response: u32 },
33    #[snafu(display("CC Error!"))]
34    CcError {},
35    #[snafu(display("Card ECC failed!"))]
36    CardEccFailed {},
37    #[snafu(display("Illegal Command!"))]
38    IllegalCommand {},
39    #[snafu(display("Out of range!"))]
40    OutOfRange {},
41    #[snafu(display("Misaligned address!"))]
42    AddressError {},
43    #[snafu(display("Block length incorrect!"))]
44    BlockLenError {},
45    #[snafu(display("Erase sequence error!"))]
46    EraseSeqError {},
47    #[snafu(display("Erase parameters error!"))]
48    EraseParamError {},
49    #[snafu(display("Write protection violation!"))]
50    WpViolation {},
51    #[snafu(display("Card is locked!"))]
52    CardIsLocked {},
53    #[snafu(display("Failed to lock/unlock card!"))]
54    LockUnlockFailed {},
55    #[snafu(display("CSD overwite error!"))]
56    CsdOverwrite {},
57    #[snafu(display("Wp erase skip!"))]
58    WpEraseSkip {},
59    #[snafu(display("Authentication error!"))]
60    AkeSeqError {},
61    #[snafu(display("Unknown cmd error!"))]
62    CmdUnknownErr {},
63    #[snafu(display("SDIO already transferring/recieving! Should definitely not happen!"))]
64    InTxRx {},
65    #[snafu(display("Unexpected EOF!"))]
66    UnexpectedEof {},
67}
68
69impl Error for SdioError {
70    fn kind(&self) -> ErrorKind {
71        ErrorKind::Other
72    }
73}
74
75impl From<SdioError> for ReadExactError<SdioError> {
76    fn from(e: SdioError) -> ReadExactError<SdioError> {
77        Self::Other(e)
78    }
79}
80
81impl From<ReadExactError<SdioError>> for SdioError {
82    fn from(e: ReadExactError<SdioError>) -> SdioError {
83        match e {
84            ReadExactError::UnexpectedEof => Self::UnexpectedEof {},
85            ReadExactError::Other(e) => e,
86        }
87    }
88}