@@ -77,7 +77,7 @@ static inline void sm_config_set_in_pin_count_issue1878(pio_sm_config *c, uint i
77
77
((in_count & 0x1fu ) << PIO_SM0_SHIFTCTRL_IN_COUNT_LSB );
78
78
#endif
79
79
}
80
- static void rp2pio_statemachine_set_pull (uint32_t pull_pin_up , uint32_t pull_pin_down , uint32_t pins_we_use ) {
80
+ static void rp2pio_statemachine_set_pull (pio_pinmask_t pull_pin_up , pio_pinmask_t pull_pin_down , pio_pinmask_t pins_we_use ) {
81
81
for (size_t i = 0 ; i < NUM_BANK0_GPIOS ; i ++ ) {
82
82
bool used = pins_we_use & (1 << i );
83
83
if (used ) {
@@ -179,8 +179,8 @@ void reset_rp2pio_statemachine(void) {
179
179
}
180
180
}
181
181
182
- static uint32_t _check_pins_free (const mcu_pin_obj_t * first_pin , uint8_t pin_count , bool exclusive_pin_use ) {
183
- uint32_t pins_we_use = 0 ;
182
+ static pio_pinmask_t _check_pins_free (const mcu_pin_obj_t * first_pin , uint8_t pin_count , bool exclusive_pin_use ) {
183
+ pio_pinmask_t pins_we_use = 0 ;
184
184
if (first_pin != NULL ) {
185
185
for (size_t i = 0 ; i < pin_count ; i ++ ) {
186
186
uint8_t pin_number = first_pin -> number + i ;
@@ -195,7 +195,11 @@ static uint32_t _check_pins_free(const mcu_pin_obj_t *first_pin, uint8_t pin_cou
195
195
if (exclusive_pin_use || _pin_reference_count [pin_number ] == 0 ) {
196
196
assert_pin_free (pin );
197
197
}
198
- pins_we_use |= 1 << pin_number ;
198
+ mp_printf (& mp_plat_print , "pins_we_use + pin %d\n" , pin_number );
199
+ pins_we_use |= PIO_PINMASK (pin_number );
200
+ mp_printf (& mp_plat_print , "pins_we_use = %08x %08x\n" ,
201
+ (uint32_t )(pins_we_use >> 32 ),
202
+ (uint32_t )(pins_we_use ));
199
203
}
200
204
}
201
205
return pins_we_use ;
@@ -250,12 +254,12 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
250
254
const uint16_t * init , size_t init_len ,
251
255
const mcu_pin_obj_t * first_out_pin , uint8_t out_pin_count ,
252
256
const mcu_pin_obj_t * first_in_pin , uint8_t in_pin_count ,
253
- uint32_t pull_pin_up , uint32_t pull_pin_down ,
257
+ pio_pinmask_t pull_pin_up , pio_pinmask_t pull_pin_down ,
254
258
const mcu_pin_obj_t * first_set_pin , uint8_t set_pin_count ,
255
259
const mcu_pin_obj_t * first_sideset_pin , uint8_t sideset_pin_count , bool sideset_pindirs ,
256
- uint32_t initial_pin_state , uint32_t initial_pin_direction ,
260
+ pio_pinmask_t initial_pin_state , pio_pinmask_t initial_pin_direction ,
257
261
const mcu_pin_obj_t * jmp_pin ,
258
- uint32_t pins_we_use , bool tx_fifo , bool rx_fifo ,
262
+ pio_pinmask_t pins_we_use , bool tx_fifo , bool rx_fifo ,
259
263
bool auto_pull , uint8_t pull_threshold , bool out_shift_right ,
260
264
bool wait_for_txstall ,
261
265
bool auto_push , uint8_t push_threshold , bool in_shift_right ,
@@ -270,6 +274,16 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
270
274
// Create a program id that isn't the pointer so we can store it without storing the original object.
271
275
uint32_t program_id = ~((uint32_t )program );
272
276
277
+ #if NUM_BANK0_GPIOS > 32
278
+ mp_printf (& mp_plat_print , "pins_we_use = %08x %08x\n" ,
279
+ (uint32_t )(pins_we_use >> 32 ),
280
+ (uint32_t )(pins_we_use ));
281
+ if ((pins_we_use >> 32 ) != 0 ) {
282
+ mp_printf (& mp_plat_print , "uses high pins. nyi\n" );
283
+ return false;
284
+ }
285
+ #endif
286
+
273
287
// Next, find a PIO and state machine to use.
274
288
size_t pio_index = NUM_PIOS ;
275
289
uint8_t program_offset = 32 ;
@@ -341,7 +355,7 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
341
355
self -> pull_pin_down = pull_pin_down ;
342
356
343
357
for (size_t pin_number = 0 ; pin_number < NUM_BANK0_GPIOS ; pin_number ++ ) {
344
- if ((pins_we_use & ( 1 << pin_number )) == 0 ) {
358
+ if ((pins_we_use & PIO_PINMASK ( pin_number )) == 0 ) {
345
359
continue ;
346
360
}
347
361
const mcu_pin_obj_t * pin = mcu_get_pin_by_number (pin_number );
@@ -467,13 +481,13 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
467
481
return true;
468
482
}
469
483
470
- static uint32_t mask_and_rotate (const mcu_pin_obj_t * first_pin , uint32_t bit_count , uint32_t value ) {
484
+ static pio_pinmask_t mask_and_shift (const mcu_pin_obj_t * first_pin , uint32_t bit_count , pio_pinmask_t value ) {
471
485
if (!first_pin ) {
472
486
return 0 ;
473
487
}
474
- value = value & (( 1 << bit_count ) - 1 );
488
+ value = value & (PIO_PINMASK ( bit_count ) - 1 );
475
489
uint32_t shift = first_pin -> number ;
476
- return value << shift | value >> ( 32 - shift ) ;
490
+ return value << shift ;
477
491
}
478
492
479
493
typedef struct {
@@ -589,15 +603,15 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
589
603
size_t frequency ,
590
604
const uint16_t * init , size_t init_len ,
591
605
const uint16_t * may_exec , size_t may_exec_len ,
592
- const mcu_pin_obj_t * first_out_pin , uint8_t out_pin_count , uint32_t initial_out_pin_state , uint32_t initial_out_pin_direction ,
606
+ const mcu_pin_obj_t * first_out_pin , uint8_t out_pin_count , pio_pinmask_t initial_out_pin_state , pio_pinmask_t initial_out_pin_direction ,
593
607
const mcu_pin_obj_t * first_in_pin , uint8_t in_pin_count ,
594
- uint32_t pull_pin_up , uint32_t pull_pin_down ,
595
- const mcu_pin_obj_t * first_set_pin , uint8_t set_pin_count , uint32_t initial_set_pin_state , uint32_t initial_set_pin_direction ,
608
+ pio_pinmask_t pull_pin_up , pio_pinmask_t pull_pin_down ,
609
+ const mcu_pin_obj_t * first_set_pin , uint8_t set_pin_count , pio_pinmask_t initial_set_pin_state , pio_pinmask_t initial_set_pin_direction ,
596
610
const mcu_pin_obj_t * first_sideset_pin , uint8_t sideset_pin_count , bool sideset_pindirs ,
597
- uint32_t initial_sideset_pin_state , uint32_t initial_sideset_pin_direction ,
611
+ pio_pinmask_t initial_sideset_pin_state , pio_pinmask_t initial_sideset_pin_direction ,
598
612
bool sideset_enable ,
599
613
const mcu_pin_obj_t * jmp_pin , digitalio_pull_t jmp_pull ,
600
- uint32_t wait_gpio_mask ,
614
+ pio_pinmask_t wait_gpio_mask ,
601
615
bool exclusive_pin_use ,
602
616
bool auto_pull , uint8_t pull_threshold , bool out_shift_right ,
603
617
bool wait_for_txstall ,
@@ -610,7 +624,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
610
624
int mov_status_n ) {
611
625
612
626
// First, check that all pins are free OR already in use by any PIO if exclusive_pin_use is false.
613
- uint32_t pins_we_use = wait_gpio_mask ;
627
+ pio_pinmask_t pins_we_use = wait_gpio_mask ;
614
628
pins_we_use |= _check_pins_free (first_out_pin , out_pin_count , exclusive_pin_use );
615
629
pins_we_use |= _check_pins_free (first_in_pin , in_pin_count , exclusive_pin_use );
616
630
pins_we_use |= _check_pins_free (first_set_pin , set_pin_count , exclusive_pin_use );
@@ -642,12 +656,12 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
642
656
mp_raise_ValueError_varg (MP_ERROR_TEXT ("Program does OUT without loading OSR" ));
643
657
}
644
658
645
- uint32_t initial_pin_state = mask_and_rotate (first_out_pin , out_pin_count , initial_out_pin_state );
646
- uint32_t initial_pin_direction = mask_and_rotate (first_out_pin , out_pin_count , initial_out_pin_direction );
647
- initial_set_pin_state = mask_and_rotate (first_set_pin , set_pin_count , initial_set_pin_state );
648
- initial_set_pin_direction = mask_and_rotate (first_set_pin , set_pin_count , initial_set_pin_direction );
649
- uint32_t set_out_overlap = mask_and_rotate (first_out_pin , out_pin_count , 0xffffffff ) &
650
- mask_and_rotate (first_set_pin , set_pin_count , 0xffffffff );
659
+ uint32_t initial_pin_state = mask_and_shift (first_out_pin , out_pin_count , initial_out_pin_state );
660
+ uint32_t initial_pin_direction = mask_and_shift (first_out_pin , out_pin_count , initial_out_pin_direction );
661
+ initial_set_pin_state = mask_and_shift (first_set_pin , set_pin_count , initial_set_pin_state );
662
+ initial_set_pin_direction = mask_and_shift (first_set_pin , set_pin_count , initial_set_pin_direction );
663
+ uint32_t set_out_overlap = mask_and_shift (first_out_pin , out_pin_count , 0xffffffff ) &
664
+ mask_and_shift (first_set_pin , set_pin_count , 0xffffffff );
651
665
// Check that OUT and SET settings agree because we don't have a way of picking one over the other.
652
666
if ((initial_pin_state & set_out_overlap ) != (initial_set_pin_state & set_out_overlap )) {
653
667
mp_raise_ValueError (MP_ERROR_TEXT ("Initial set pin state conflicts with initial out pin state" ));
@@ -659,16 +673,16 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
659
673
initial_pin_direction |= initial_set_pin_direction ;
660
674
661
675
// Sideset overrides OUT or SET so we always use its values.
662
- uint32_t sideset_mask = mask_and_rotate (first_sideset_pin , sideset_pin_count , 0x1f );
663
- initial_pin_state = (initial_pin_state & ~sideset_mask ) | mask_and_rotate (first_sideset_pin , sideset_pin_count , initial_sideset_pin_state );
664
- initial_pin_direction = (initial_pin_direction & ~sideset_mask ) | mask_and_rotate (first_sideset_pin , sideset_pin_count , initial_sideset_pin_direction );
676
+ uint32_t sideset_mask = mask_and_shift (first_sideset_pin , sideset_pin_count , 0x1f );
677
+ initial_pin_state = (initial_pin_state & ~sideset_mask ) | mask_and_shift (first_sideset_pin , sideset_pin_count , initial_sideset_pin_state );
678
+ initial_pin_direction = (initial_pin_direction & ~sideset_mask ) | mask_and_shift (first_sideset_pin , sideset_pin_count , initial_sideset_pin_direction );
665
679
666
680
// Deal with pull up/downs
667
- uint32_t pull_up = mask_and_rotate (first_in_pin , in_pin_count , pull_pin_up );
668
- uint32_t pull_down = mask_and_rotate (first_in_pin , in_pin_count , pull_pin_down );
681
+ uint32_t pull_up = mask_and_shift (first_in_pin , in_pin_count , pull_pin_up );
682
+ uint32_t pull_down = mask_and_shift (first_in_pin , in_pin_count , pull_pin_down );
669
683
670
684
if (jmp_pin ) {
671
- uint32_t jmp_mask = mask_and_rotate (jmp_pin , 1 , 0x1f );
685
+ uint32_t jmp_mask = mask_and_shift (jmp_pin , 1 , 0x1f );
672
686
if (jmp_pull == PULL_UP ) {
673
687
pull_up |= jmp_mask ;
674
688
}
0 commit comments