sdmmc_core/
status.rs

1/// Represents the operation  modes of an SD card.
2#[repr(C)]
3#[derive(Clone, Copy, Debug, Eq, PartialEq)]
4pub enum OperationMode {
5    Inactive,
6    CardIdentification,
7    DataTransfer,
8}
9
10impl OperationMode {
11    /// Creates a new [OperationMode].
12    pub const fn new() -> Self {
13        Self::Inactive
14    }
15}
16
17impl Default for OperationMode {
18    fn default() -> Self {
19        Self::new()
20    }
21}
22
23/// Represents the card states of an SD card.
24#[repr(C)]
25#[derive(Clone, Copy, Debug, Eq, PartialEq)]
26pub enum CardState {
27    Inactive,
28    Idle,
29    Ready,
30    Identification,
31    Standby,
32    Transfer,
33    SendingData,
34    ReceivingData,
35    Programming,
36    Disconnect,
37}
38
39impl CardState {
40    /// Creates a new [CardState].
41    pub const fn new() -> Self {
42        Self::Inactive
43    }
44
45    /// Gets the [OperationMode] associated with the [CardState].
46    ///
47    /// For details, see `Table 4-1` of [Part1 Physical Layer](https://www.sdcard.org/downloads/pls/pdf/?f=Part1PhysicalLayerSimplifiedSpecificationVer9.10Fin_20231201.pdf) SD specification.
48    pub const fn operation_mode(&self) -> OperationMode {
49        match self {
50            Self::Inactive => OperationMode::Inactive,
51            Self::Idle | Self::Ready | Self::Identification => OperationMode::CardIdentification,
52            _ => OperationMode::DataTransfer,
53        }
54    }
55}
56
57impl Default for CardState {
58    fn default() -> Self {
59        Self::new()
60    }
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn test_card_state() {
69        [
70            CardState::Inactive,
71            CardState::Idle,
72            CardState::Ready,
73            CardState::Identification,
74            CardState::Standby,
75            CardState::Transfer,
76            CardState::SendingData,
77            CardState::ReceivingData,
78            CardState::Programming,
79            CardState::Disconnect,
80        ]
81        .into_iter()
82        .zip([
83            OperationMode::Inactive,
84            OperationMode::CardIdentification,
85            OperationMode::CardIdentification,
86            OperationMode::CardIdentification,
87            OperationMode::DataTransfer,
88            OperationMode::DataTransfer,
89            OperationMode::DataTransfer,
90            OperationMode::DataTransfer,
91            OperationMode::DataTransfer,
92            OperationMode::DataTransfer,
93        ])
94        .for_each(|(exp_cs, exp_om)| {
95            assert_eq!(
96                exp_cs.operation_mode(),
97                exp_om,
98                "CardState: {exp_cs:?}, OperationMode: {exp_om:?}"
99            );
100        });
101    }
102}