Skip to main content

mci/
command_responses.rs

1// Have response MCI only
2pub trait ResponsePresent {}
3// 8 bit response = SPI only
4pub trait Response8 {}
5// 32 bit response = SPI only,
6pub trait Response32 {}
7// 136 bit response = MCI only
8pub trait Response136 {}
9// Card may send busy
10pub trait ResponseBusy {}
11// Expect valid crc = MCI only
12pub trait ResponseCrc {}
13
14pub trait Response {
15    fn val(&self) -> u32;
16}
17
18pub struct NoResponse;
19impl Response for NoResponse {
20    #[inline(always)]
21    fn val(&self) -> u32 {
22        ResponseType::NoResponse as u32
23    }
24}
25
26#[derive(Default)]
27pub struct CmdR1R6;
28impl ResponsePresent for CmdR1R6 {}
29impl ResponseCrc for CmdR1R6 {}
30impl Response for CmdR1R6 {
31    #[inline(always)]
32    fn val(&self) -> u32 {
33        ResponseType::CmdR1R6 as u32
34    }
35}
36
37#[derive(Default)]
38pub struct CmdR1B;
39impl ResponsePresent for CmdR1B {}
40impl ResponseBusy for CmdR1B {}
41impl ResponseCrc for CmdR1B {}
42impl Response for CmdR1B {
43    #[inline(always)]
44    fn val(&self) -> u32 {
45        ResponseType::CmdR1B as u32
46    }
47}
48
49#[derive(Default)]
50pub struct CmdR2;
51impl ResponsePresent for CmdR2 {}
52impl Response8 for CmdR2 {}
53impl Response136 for CmdR2 {}
54impl ResponseCrc for CmdR2 {}
55impl Response for CmdR2 {
56    #[inline(always)]
57    fn val(&self) -> u32 {
58        ResponseType::CmdR2 as u32
59    }
60}
61
62#[derive(Default)]
63pub struct CmdR3R4;
64impl ResponsePresent for CmdR3R4 {}
65impl Response32 for CmdR3R4 {}
66impl Response for CmdR3R4 {
67    #[inline(always)]
68    fn val(&self) -> u32 {
69        ResponseType::CmdR3R4 as u32
70    }
71}
72
73#[derive(Default)]
74pub struct CmdR5;
75impl ResponsePresent for CmdR5 {}
76impl Response8 for CmdR5 {}
77impl ResponseCrc for CmdR5 {}
78impl Response for CmdR5 {
79    #[inline(always)]
80    fn val(&self) -> u32 {
81        ResponseType::CmdR5 as u32
82    }
83}
84
85#[derive(Default)]
86pub struct CmdR7;
87impl ResponsePresent for CmdR7 {}
88impl Response32 for CmdR7 {}
89impl ResponseCrc for CmdR7 {}
90impl Response for CmdR7 {
91    #[inline(always)]
92    fn val(&self) -> u32 {
93        ResponseType::CmdR7 as u32
94    }
95}
96
97pub enum ResponseFlags {
98    ResponsePresent = 1 << 8,
99    Response8 = 1 << 9,
100    Response32 = 1 << 10,
101    Response136 = 1 << 11,
102    ResponseCrc = 1 << 12,
103    ResponseBusy = 1 << 13,
104}
105
106pub enum ResponseType {
107    NoResponse = 0,
108    CmdR1R6 = ResponseFlags::ResponsePresent as isize | ResponseFlags::ResponseCrc as isize,
109    CmdR1B = ResponseFlags::ResponsePresent as isize
110        | ResponseFlags::ResponseCrc as isize
111        | ResponseFlags::ResponseBusy as isize,
112    CmdR2 = ResponseFlags::ResponsePresent as isize
113        | ResponseFlags::Response8 as isize
114        | ResponseFlags::Response136 as isize
115        | ResponseFlags::ResponseCrc as isize,
116    CmdR3R4 = ResponseFlags::ResponsePresent as isize | ResponseFlags::Response32 as isize,
117    CmdR5 = ResponseFlags::ResponsePresent as isize
118        | ResponseFlags::Response8 as isize
119        | ResponseFlags::ResponseCrc as isize,
120    CmdR7 = ResponseFlags::ResponsePresent as isize
121        | ResponseFlags::Response32 as isize
122        | ResponseFlags::ResponseCrc as isize,
123}