aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2023-09-10 19:52:47 +0000
committerGitHub <[email protected]>2023-09-10 19:52:47 +0000
commite308286f3c5c2a730d2aa78c51d7a768160295e5 (patch)
treec61193fe4f9a88cec309dd7daea0879e3b5470f6
parenta992d4895de6e5d3ff242f02cef320e94d5df262 (diff)
parent268da2fcde429887a7df879deb90d2383d9d754e (diff)
Merge pull request #1881 from MabezDev/sdmmc-stbiterr
Handle stbiterr in 4bit wide mode for sdmmc_v1
-rw-r--r--embassy-stm32/Cargo.toml4
-rw-r--r--embassy-stm32/src/sdmmc/mod.rs56
2 files changed, 48 insertions, 12 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index ff41f0ba3..4ba47764d 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -58,7 +58,7 @@ sdio-host = "0.5.0"
58embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } 58embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true }
59critical-section = "1.1" 59critical-section = "1.1"
60atomic-polyfill = "1.0.1" 60atomic-polyfill = "1.0.1"
61stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-eaa4987e523408dfb31c1b76765dd345d2761373" } 61stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-e667107cf81934383ec5744f49b2cda0599ec749" }
62vcell = "0.1.3" 62vcell = "0.1.3"
63bxcan = "0.7.0" 63bxcan = "0.7.0"
64nb = "1.0.0" 64nb = "1.0.0"
@@ -77,7 +77,7 @@ critical-section = { version = "1.1", features = ["std"] }
77[build-dependencies] 77[build-dependencies]
78proc-macro2 = "1.0.36" 78proc-macro2 = "1.0.36"
79quote = "1.0.15" 79quote = "1.0.15"
80stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-eaa4987e523408dfb31c1b76765dd345d2761373", default-features = false, features = ["metadata"]} 80stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-e667107cf81934383ec5744f49b2cda0599ec749", default-features = false, features = ["metadata"]}
81 81
82[features] 82[features]
83default = ["rt"] 83default = ["rt"]
diff --git a/embassy-stm32/src/sdmmc/mod.rs b/embassy-stm32/src/sdmmc/mod.rs
index 6b532363c..9fb380fd6 100644
--- a/embassy-stm32/src/sdmmc/mod.rs
+++ b/embassy-stm32/src/sdmmc/mod.rs
@@ -33,6 +33,8 @@ impl<T: Instance> InterruptHandler<T> {
33 w.set_dtimeoutie(enable); 33 w.set_dtimeoutie(enable);
34 w.set_dataendie(enable); 34 w.set_dataendie(enable);
35 35
36 #[cfg(sdmmc_v1)]
37 w.set_stbiterre(enable);
36 #[cfg(sdmmc_v2)] 38 #[cfg(sdmmc_v2)]
37 w.set_dabortie(enable); 39 w.set_dabortie(enable);
38 }); 40 });
@@ -102,6 +104,8 @@ pub enum Error {
102 BadClock, 104 BadClock,
103 SignalingSwitchFailed, 105 SignalingSwitchFailed,
104 PeripheralBusy, 106 PeripheralBusy,
107 #[cfg(sdmmc_v1)]
108 StBitErr,
105} 109}
106 110
107/// A SD command 111/// A SD command
@@ -707,9 +711,15 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
707 711
708 if status.dcrcfail() { 712 if status.dcrcfail() {
709 return Poll::Ready(Err(Error::Crc)); 713 return Poll::Ready(Err(Error::Crc));
710 } else if status.dtimeout() { 714 }
715 if status.dtimeout() {
711 return Poll::Ready(Err(Error::Timeout)); 716 return Poll::Ready(Err(Error::Timeout));
712 } else if status.dataend() { 717 }
718 #[cfg(sdmmc_v1)]
719 if status.stbiterr() {
720 return Poll::Ready(Err(Error::StBitErr));
721 }
722 if status.dataend() {
713 return Poll::Ready(Ok(())); 723 return Poll::Ready(Ok(()));
714 } 724 }
715 Poll::Pending 725 Poll::Pending
@@ -782,9 +792,15 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
782 792
783 if status.dcrcfail() { 793 if status.dcrcfail() {
784 return Poll::Ready(Err(Error::Crc)); 794 return Poll::Ready(Err(Error::Crc));
785 } else if status.dtimeout() { 795 }
796 if status.dtimeout() {
786 return Poll::Ready(Err(Error::Timeout)); 797 return Poll::Ready(Err(Error::Timeout));
787 } else if status.dataend() { 798 }
799 #[cfg(sdmmc_v1)]
800 if status.stbiterr() {
801 return Poll::Ready(Err(Error::StBitErr));
802 }
803 if status.dataend() {
788 return Poll::Ready(Ok(())); 804 return Poll::Ready(Ok(()));
789 } 805 }
790 Poll::Pending 806 Poll::Pending
@@ -836,6 +852,8 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
836 w.set_dataendc(true); 852 w.set_dataendc(true);
837 w.set_dbckendc(true); 853 w.set_dbckendc(true);
838 w.set_sdioitc(true); 854 w.set_sdioitc(true);
855 #[cfg(sdmmc_v1)]
856 w.set_stbiterrc(true);
839 857
840 #[cfg(sdmmc_v2)] 858 #[cfg(sdmmc_v2)]
841 { 859 {
@@ -873,9 +891,15 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
873 891
874 if status.dcrcfail() { 892 if status.dcrcfail() {
875 return Poll::Ready(Err(Error::Crc)); 893 return Poll::Ready(Err(Error::Crc));
876 } else if status.dtimeout() { 894 }
895 if status.dtimeout() {
877 return Poll::Ready(Err(Error::Timeout)); 896 return Poll::Ready(Err(Error::Timeout));
878 } else if status.dataend() { 897 }
898 #[cfg(sdmmc_v1)]
899 if status.stbiterr() {
900 return Poll::Ready(Err(Error::StBitErr));
901 }
902 if status.dataend() {
879 return Poll::Ready(Ok(())); 903 return Poll::Ready(Ok(()));
880 } 904 }
881 Poll::Pending 905 Poll::Pending
@@ -1156,9 +1180,15 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
1156 1180
1157 if status.dcrcfail() { 1181 if status.dcrcfail() {
1158 return Poll::Ready(Err(Error::Crc)); 1182 return Poll::Ready(Err(Error::Crc));
1159 } else if status.dtimeout() { 1183 }
1184 if status.dtimeout() {
1160 return Poll::Ready(Err(Error::Timeout)); 1185 return Poll::Ready(Err(Error::Timeout));
1161 } else if status.dataend() { 1186 }
1187 #[cfg(sdmmc_v1)]
1188 if status.stbiterr() {
1189 return Poll::Ready(Err(Error::StBitErr));
1190 }
1191 if status.dataend() {
1162 return Poll::Ready(Ok(())); 1192 return Poll::Ready(Ok(()));
1163 } 1193 }
1164 Poll::Pending 1194 Poll::Pending
@@ -1207,9 +1237,15 @@ impl<'d, T: Instance, Dma: SdmmcDma<T> + 'd> Sdmmc<'d, T, Dma> {
1207 1237
1208 if status.dcrcfail() { 1238 if status.dcrcfail() {
1209 return Poll::Ready(Err(Error::Crc)); 1239 return Poll::Ready(Err(Error::Crc));
1210 } else if status.dtimeout() { 1240 }
1241 if status.dtimeout() {
1211 return Poll::Ready(Err(Error::Timeout)); 1242 return Poll::Ready(Err(Error::Timeout));
1212 } else if status.dataend() { 1243 }
1244 #[cfg(sdmmc_v1)]
1245 if status.stbiterr() {
1246 return Poll::Ready(Err(Error::StBitErr));
1247 }
1248 if status.dataend() {
1213 return Poll::Ready(Ok(())); 1249 return Poll::Ready(Ok(()));
1214 } 1250 }
1215 Poll::Pending 1251 Poll::Pending