@@ -204,45 +204,84 @@ impl<const P: char, const N: u8, MODE: PinMode> Pin<P, N, MODE> {
204
204
/// ensure they use this properly.
205
205
#[ inline( always) ]
206
206
pub ( super ) fn mode < M : PinMode > ( & mut self ) {
207
- let offset = 2 * N ;
207
+ change_mode ! ( ( * Gpio :: <P >:: ptr( ) ) , N ) ;
208
+ }
209
+
210
+ #[ inline( always) ]
211
+ /// Converts pin into specified mode
212
+ pub fn into_mode < M : PinMode > ( mut self ) -> Pin < P , N , M > {
213
+ self . mode :: < M > ( ) ;
214
+ Pin :: new ( )
215
+ }
216
+ }
217
+
218
+ macro_rules! change_mode {
219
+ ( $block: expr, $N: ident) => {
220
+ let offset = 2 * $N;
208
221
unsafe {
209
222
if MODE :: OTYPER != M :: OTYPER {
210
223
if let Some ( otyper) = M :: OTYPER {
211
- ( * Gpio :: < P > :: ptr ( ) )
224
+ $block
212
225
. otyper
213
- . modify ( |r, w| w. bits ( r. bits ( ) & !( 0b1 << N ) | ( otyper << N ) ) ) ;
226
+ . modify( |r, w| w. bits( r. bits( ) & !( 0b1 << $ N) | ( otyper << $ N) ) ) ;
214
227
}
215
228
}
216
229
217
230
if MODE :: AFR != M :: AFR {
218
231
if let Some ( afr) = M :: AFR {
219
- if N < 8 {
220
- let offset2 = 4 * { N } ;
221
- ( * Gpio :: < P > :: ptr ( ) ) . afrl . modify ( |r, w| {
232
+ if $ N < 8 {
233
+ let offset2 = 4 * { $ N } ;
234
+ $block . afrl. modify( |r, w| {
222
235
w. bits( ( r. bits( ) & !( 0b1111 << offset2) ) | ( afr << offset2) )
223
236
} ) ;
224
237
} else {
225
- let offset2 = 4 * { N - 8 } ;
226
- ( * Gpio :: < P > :: ptr ( ) ) . afrh . modify ( |r, w| {
238
+ let offset2 = 4 * { $ N - 8 } ;
239
+ $block . afrh. modify( |r, w| {
227
240
w. bits( ( r. bits( ) & !( 0b1111 << offset2) ) | ( afr << offset2) )
228
241
} ) ;
229
242
}
230
243
}
231
244
}
232
245
233
246
if MODE :: MODER != M :: MODER {
234
- ( * Gpio :: < P > :: ptr ( ) )
247
+ $block
235
248
. moder
236
249
. modify( |r, w| w. bits( ( r. bits( ) & !( 0b11 << offset) ) | ( M :: MODER << offset) ) ) ;
237
250
}
238
251
}
252
+ } ;
253
+ }
254
+ use change_mode;
255
+
256
+ use super :: ErasedPin ;
257
+ impl < MODE : PinMode > ErasedPin < MODE > {
258
+ #[ inline( always) ]
259
+ pub ( super ) fn mode < M : PinMode > ( & mut self ) {
260
+ let n = self . pin_id ( ) ;
261
+ change_mode ! ( self . block( ) , n) ;
239
262
}
240
263
241
264
#[ inline( always) ]
242
265
/// Converts pin into specified mode
243
- pub fn into_mode < M : PinMode > ( mut self ) -> Pin < P , N , M > {
266
+ pub fn into_mode < M : PinMode > ( mut self ) -> ErasedPin < M > {
244
267
self . mode :: < M > ( ) ;
245
- Pin :: new ( )
268
+ ErasedPin :: from_pin_port ( self . into_pin_port ( ) )
269
+ }
270
+ }
271
+
272
+ use super :: PartiallyErasedPin ;
273
+ impl < const P : char , MODE : PinMode > PartiallyErasedPin < P , MODE > {
274
+ #[ inline( always) ]
275
+ pub ( super ) fn mode < M : PinMode > ( & mut self ) {
276
+ let n = self . pin_id ( ) ;
277
+ change_mode ! ( ( * Gpio :: <P >:: ptr( ) ) , n) ;
278
+ }
279
+
280
+ #[ inline( always) ]
281
+ /// Converts pin into specified mode
282
+ pub fn into_mode < M : PinMode > ( mut self ) -> PartiallyErasedPin < P , M > {
283
+ self . mode :: < M > ( ) ;
284
+ PartiallyErasedPin :: new ( self . i )
246
285
}
247
286
}
248
287
0 commit comments