@@ -260,60 +260,53 @@ impl_pins!(
260
260
mod stm32f1 {
261
261
use super :: * ;
262
262
use stm32f1xx_hal:: gpio:: {
263
- gpioa, gpiob, gpioc, gpiod, Alternate , Floating , IOPinSpeed , Input , OutputSpeed , PushPull ,
263
+ gpioa:: * , gpiob:: * , gpioc:: * , gpiod:: * , Alternate , Floating , IOPinSpeed , Input ,
264
+ OutputSpeed , PushPull ,
264
265
} ;
265
266
266
267
// STM32F1xx's require access to the CRL/CRH registers to change pin mode. As a result, we
267
268
// require that pins are already in the necessary mode before constructing `EthPins` as it
268
269
// would be inconvenient to pass CRL and CRH through to the `AlternateVeryHighSpeed` callsite.
269
270
270
- type PA1 = gpioa:: PA1 < Input < Floating > > ;
271
- type PA2 = gpioa:: PA2 < Alternate < PushPull > > ;
272
- type PA7 = gpioa:: PA7 < Input < Floating > > ;
273
- type PB11 = gpiob:: PB11 < Alternate < PushPull > > ;
274
- type PB12 = gpiob:: PB12 < Alternate < PushPull > > ;
275
- type PB13 = gpiob:: PB13 < Alternate < PushPull > > ;
276
- type PC1 = gpioc:: PC1 < Alternate < PushPull > > ;
277
- type PC4 = gpioc:: PC4 < Input < Floating > > ;
278
- type PC5 = gpioc:: PC5 < Input < Floating > > ;
279
- type PD8 = gpiod:: PD8 < Input < Floating > > ;
280
- type PD9 = gpiod:: PD9 < Input < Floating > > ;
281
- type PD10 = gpiod:: PD10 < Input < Floating > > ;
282
-
283
- unsafe impl RmiiRefClk for PA1 { }
284
- unsafe impl RmiiCrsDv for PA7 { }
285
- unsafe impl RmiiCrsDv for PD8 { }
286
- unsafe impl RmiiTxEN for PB11 { }
287
- unsafe impl RmiiTxD0 for PB12 { }
288
- unsafe impl RmiiTxD1 for PB13 { }
289
- unsafe impl RmiiRxD0 for PC4 { }
290
- unsafe impl RmiiRxD0 for PD9 { }
291
- unsafe impl RmiiRxD1 for PC5 { }
292
- unsafe impl RmiiRxD1 for PD10 { }
293
-
294
- macro_rules! impl_alt_very_high_speed {
295
- ( $( $PIN: ident) ,* ) => {
271
+ macro_rules! impl_pins {
272
+ ( $( $type: ident: [ $( ( $PIN: ty, $is_input: literal) ) ,+] ) ,* ) => {
296
273
$(
297
- impl AlternateVeryHighSpeed for $PIN {
298
- fn into_af11_very_high_speed( self ) {
299
- // Within this critical section, modifying the `CRL` register can
300
- // only be unsound if this critical section preempts other code
301
- // that is modifying the same register
302
- cortex_m:: interrupt:: free( |_| {
303
- // SAFETY: this is sound as long as the API of the HAL and structure of the CRL
304
- // struct does not change. In case the size of the `CRL` struct is changed, compilation
305
- // will fail as `mem::transmute` can only convert between types of the same size.
306
- //
307
- // This guards us from unsound behaviour introduced by point releases of the f1 hal
308
- let acrl: & mut _ = & mut unsafe { core:: mem:: transmute( ( ) ) } ;
309
- let mut pin = self . into_alternate_push_pull( acrl) ;
310
- pin. set_speed( acrl, IOPinSpeed :: Mhz50 ) ;
311
- } ) ;
274
+ $(
275
+ unsafe impl $type for $PIN { }
276
+ impl AlternateVeryHighSpeed for $PIN {
277
+ fn into_af11_very_high_speed( self ) {
278
+ // Within this critical section, modifying the `CRL` register can
279
+ // only be unsound if this critical section preempts other code
280
+ // that is modifying the same register
281
+ cortex_m:: interrupt:: free( |_| {
282
+ // SAFETY: this is sound as long as the API of the HAL and structure of the CRL
283
+ // struct does not change. In case the size of the `CRL` struct is changed, compilation
284
+ // will fail as `mem::transmute` can only convert between types of the same size.
285
+ //
286
+ // This guards us from unsound behaviour introduced by point releases of the f1 hal
287
+ let cr: & mut _ = & mut unsafe { core:: mem:: transmute( ( ) ) } ;
288
+ // The speed can only be changed on output pins
289
+ let mut pin = self . into_alternate_push_pull( cr) ;
290
+ pin. set_speed( cr, IOPinSpeed :: Mhz50 ) ;
291
+
292
+ if $is_input {
293
+ pin. into_floating_input( cr) ;
294
+ }
295
+ } ) ;
296
+ }
312
297
}
313
- }
298
+ ) +
314
299
) *
315
- }
300
+ } ;
316
301
}
317
302
318
- impl_alt_very_high_speed ! ( PA1 , PA2 , PA7 , PB11 , PB12 , PB13 , PC1 , PC4 , PC5 , PD8 , PD9 , PD10 ) ;
303
+ impl_pins ! (
304
+ RmiiRefClk : [ ( PA1 <Input <Floating >>, true ) ] ,
305
+ RmiiCrsDv : [ ( PA7 <Input <Floating >>, true ) , ( PD8 <Input <Floating >>, true ) ] ,
306
+ RmiiTxEN : [ ( PB11 <Alternate <PushPull >>, false ) ] ,
307
+ RmiiTxD0 : [ ( PB12 <Alternate <PushPull >>, false ) ] ,
308
+ RmiiTxD1 : [ ( PB13 <Alternate <PushPull >>, false ) ] ,
309
+ RmiiRxD0 : [ ( PC4 <Input <Floating >>, true ) , ( PD9 <Input <Floating >>, true ) ] ,
310
+ RmiiRxD1 : [ ( PC5 <Input <Floating >>, true ) , ( PD10 <Input <Floating >>, true ) ]
311
+ ) ;
319
312
}
0 commit comments