@@ -215,6 +215,20 @@ macro_rules! sta_tx {
215
215
} } ;
216
216
}
217
217
218
+ #[ inline]
219
+ fn clear_static_command_flags ( icr : & sdmmc1:: ICR ) {
220
+ icr. modify ( |_, w| {
221
+ w. ccrcfailc ( )
222
+ . set_bit ( )
223
+ . ctimeoutc ( )
224
+ . set_bit ( )
225
+ . cmdrendc ( )
226
+ . set_bit ( )
227
+ . cmdsentc ( )
228
+ . set_bit ( )
229
+ } )
230
+ }
231
+
218
232
#[ inline]
219
233
fn clear_static_data_flags ( icr : & sdmmc1:: ICR ) {
220
234
icr. modify ( |_, w| {
@@ -235,34 +249,10 @@ fn clear_static_data_flags(icr: &sdmmc1::ICR) {
235
249
236
250
#[ inline]
237
251
fn clear_all_interrupts ( icr : & sdmmc1:: ICR ) {
238
- icr. modify ( |_, w| {
239
- w. ccrcfailc ( )
240
- . set_bit ( )
241
- . ctimeoutc ( )
242
- . set_bit ( )
243
- . ceataendc ( )
244
- . set_bit ( )
245
- . cmdrendc ( )
246
- . set_bit ( )
247
- . cmdsentc ( )
248
- . set_bit ( )
249
- . dataendc ( )
250
- . set_bit ( )
251
- . dbckendc ( )
252
- . set_bit ( )
253
- . dcrcfailc ( )
254
- . set_bit ( )
255
- . dtimeoutc ( )
256
- . set_bit ( )
257
- . sdioitc ( )
258
- . set_bit ( )
259
- . stbiterrc ( )
260
- . set_bit ( )
261
- . rxoverrc ( )
262
- . set_bit ( )
263
- . txunderrc ( )
264
- . set_bit ( )
265
- } ) ;
252
+ clear_static_command_flags ( icr) ;
253
+ clear_static_data_flags ( icr) ;
254
+
255
+ icr. modify ( |_, w| w. sdioitc ( ) . set_bit ( ) ) ;
266
256
}
267
257
268
258
/// An initialized SD card.
@@ -772,7 +762,9 @@ impl Sdmmc {
772
762
for _ in 0 ..8 {
773
763
i -= 1 ;
774
764
let bits = u32:: from_be ( self . sdmmc . fifo . read ( ) . bits ( ) ) ;
775
- sd_status[ i] = bits. to_le ( ) ;
765
+ unsafe {
766
+ * sd_status. get_unchecked_mut ( i) = bits. to_le ( ) ;
767
+ }
776
768
}
777
769
}
778
770
}
@@ -808,9 +800,6 @@ impl Sdmmc {
808
800
fn cmd < R : common_cmd:: Resp > ( & self , cmd : Cmd < R > ) -> Result < ( ) , Error > {
809
801
while self . sdmmc . sta . read ( ) . cmdact ( ) . bit_is_set ( ) { }
810
802
811
- // Clear the interrupts before we start
812
- clear_all_interrupts ( & self . sdmmc . icr ) ;
813
-
814
803
self . sdmmc
815
804
. arg
816
805
. write ( |w| unsafe { w. cmdarg ( ) . bits ( cmd. arg ) } ) ;
@@ -842,32 +831,34 @@ impl Sdmmc {
842
831
}
843
832
844
833
if sta. ctimeout ( ) . bit ( ) {
845
- self . sdmmc . icr . modify ( |_ , w| w . ctimeoutc ( ) . set_bit ( ) ) ;
834
+ clear_static_command_flags ( & self . sdmmc . icr ) ;
846
835
847
836
return Err ( Error :: Timeout ) ;
848
837
}
849
838
850
839
if cmd. response_len ( ) == ResponseLen :: Zero {
851
840
if sta. cmdsent ( ) . bit ( ) {
852
- self . sdmmc . icr . modify ( |_ , w| w . cmdsentc ( ) . set_bit ( ) ) ;
841
+ clear_static_command_flags ( & self . sdmmc . icr ) ;
853
842
854
843
return Ok ( ( ) ) ;
855
844
}
856
845
} else {
857
846
if sta. ccrcfail ( ) . bit ( ) {
858
- self . sdmmc . icr . modify ( |_ , w| w . ccrcfailc ( ) . set_bit ( ) ) ;
847
+ clear_static_command_flags ( & self . sdmmc . icr ) ;
859
848
860
849
return Err ( Error :: CommandCrc ) ;
861
850
}
862
851
863
852
if sta. cmdrend ( ) . bit ( ) {
864
- self . sdmmc . icr . modify ( |_ , w| w . cmdrendc ( ) . set_bit ( ) ) ;
853
+ clear_static_command_flags ( & self . sdmmc . icr ) ;
865
854
866
855
return Ok ( ( ) ) ;
867
856
}
868
857
}
869
858
}
870
859
860
+ clear_static_command_flags ( & self . sdmmc . icr ) ;
861
+
871
862
Err ( Error :: SoftwareTimeout )
872
863
}
873
864
0 commit comments