diff options
| author | Scott Mabin <[email protected]> | 2023-09-10 14:51:59 +0100 |
|---|---|---|
| committer | Scott Mabin <[email protected]> | 2023-09-10 20:27:38 +0100 |
| commit | 268da2fcde429887a7df879deb90d2383d9d754e (patch) | |
| tree | ed2f0f6666ec642c0c2bf1cf8611a1c08b917d2c | |
| parent | f17f09057d8ef4b2ba09fb26e2a320384549b513 (diff) | |
Handle stbiterr in 4bit wide mode for sdmmc_v1
| -rw-r--r-- | embassy-stm32/Cargo.toml | 4 | ||||
| -rw-r--r-- | embassy-stm32/src/sdmmc/mod.rs | 56 |
2 files changed, 48 insertions, 12 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml index ded58aee3..bd9b406a3 100644 --- a/embassy-stm32/Cargo.toml +++ b/embassy-stm32/Cargo.toml | |||
| @@ -58,7 +58,7 @@ sdio-host = "0.5.0" | |||
| 58 | embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } | 58 | embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } |
| 59 | critical-section = "1.1" | 59 | critical-section = "1.1" |
| 60 | atomic-polyfill = "1.0.1" | 60 | atomic-polyfill = "1.0.1" |
| 61 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-eaa4987e523408dfb31c1b76765dd345d2761373" } | 61 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-e667107cf81934383ec5744f49b2cda0599ec749" } |
| 62 | vcell = "0.1.3" | 62 | vcell = "0.1.3" |
| 63 | bxcan = "0.7.0" | 63 | bxcan = "0.7.0" |
| 64 | nb = "1.0.0" | 64 | nb = "1.0.0" |
| @@ -77,7 +77,7 @@ critical-section = { version = "1.1", features = ["std"] } | |||
| 77 | [build-dependencies] | 77 | [build-dependencies] |
| 78 | proc-macro2 = "1.0.36" | 78 | proc-macro2 = "1.0.36" |
| 79 | quote = "1.0.15" | 79 | quote = "1.0.15" |
| 80 | stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-eaa4987e523408dfb31c1b76765dd345d2761373", default-features = false, features = ["metadata"]} | 80 | stm32-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] |
| 83 | default = ["rt"] | 83 | default = ["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 |
