1use 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}