use super::ResponseMode;
#[repr(C)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ResponseType {
None,
R1,
R1b,
R2,
R3,
R4,
R5,
R6,
R7,
}
impl ResponseType {
pub const LEN_8BIT: usize = 1;
pub const LEN_16BIT: usize = 2;
pub const LEN_40BIT: usize = 5;
pub const LEN_48BIT: usize = 6;
pub const LEN_136BIT: usize = 17;
pub const LEN_NONE: usize = 0;
pub const fn new() -> Self {
Self::R1
}
pub const fn len(&self, mode: ResponseMode) -> usize {
match (mode, self) {
(
ResponseMode::Sd,
Self::R1 | Self::R1b | Self::R3 | Self::R4 | Self::R6 | Self::R7,
) => Self::LEN_48BIT,
(ResponseMode::Sd | ResponseMode::Sdio, Self::R2) => Self::LEN_136BIT,
(ResponseMode::Sdio, Self::R1 | Self::R1b | Self::R4 | Self::R5 | Self::R6) => {
Self::LEN_48BIT
}
(ResponseMode::Spi, Self::R1 | Self::R1b) => Self::LEN_8BIT,
(ResponseMode::Spi, Self::R2 | Self::R5) => Self::LEN_16BIT,
(ResponseMode::Spi, Self::R3 | Self::R4 | Self::R7) => Self::LEN_40BIT,
_ => Self::LEN_NONE,
}
}
pub const fn has_crc(&self, mode: ResponseMode) -> bool {
matches!(
(mode, self),
(
ResponseMode::Sd,
Self::R1 | Self::R1b | Self::R2 | Self::R4 | Self::R5 | Self::R6 | Self::R7
)
) || matches!((mode, self), (ResponseMode::Sdio, Self::R5 | Self::R6))
}
}
impl Default for ResponseType {
fn default() -> Self {
Self::new()
}
}