@@ -77,7 +77,7 @@ static inline void sm_config_set_in_pin_count_issue1878(pio_sm_config *c, uint i
7777 ((in_count & 0x1fu ) << PIO_SM0_SHIFTCTRL_IN_COUNT_LSB );
7878 #endif
7979}
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 ) {
8181 for (size_t i = 0 ; i < NUM_BANK0_GPIOS ; i ++ ) {
8282 bool used = pins_we_use & (1 << i );
8383 if (used ) {
@@ -179,8 +179,8 @@ void reset_rp2pio_statemachine(void) {
179179 }
180180}
181181
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 ;
184184 if (first_pin != NULL ) {
185185 for (size_t i = 0 ; i < pin_count ; i ++ ) {
186186 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
195195 if (exclusive_pin_use || _pin_reference_count [pin_number ] == 0 ) {
196196 assert_pin_free (pin );
197197 }
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 ));
199203 }
200204 }
201205 return pins_we_use ;
@@ -250,12 +254,12 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
250254 const uint16_t * init , size_t init_len ,
251255 const mcu_pin_obj_t * first_out_pin , uint8_t out_pin_count ,
252256 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 ,
254258 const mcu_pin_obj_t * first_set_pin , uint8_t set_pin_count ,
255259 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 ,
257261 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 ,
259263 bool auto_pull , uint8_t pull_threshold , bool out_shift_right ,
260264 bool wait_for_txstall ,
261265 bool auto_push , uint8_t push_threshold , bool in_shift_right ,
@@ -270,6 +274,16 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
270274 // Create a program id that isn't the pointer so we can store it without storing the original object.
271275 uint32_t program_id = ~((uint32_t )program );
272276
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+
273287 // Next, find a PIO and state machine to use.
274288 size_t pio_index = NUM_PIOS ;
275289 uint8_t program_offset = 32 ;
@@ -341,7 +355,7 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
341355 self -> pull_pin_down = pull_pin_down ;
342356
343357 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 ) {
345359 continue ;
346360 }
347361 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,
467481 return true;
468482}
469483
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 ) {
471485 if (!first_pin ) {
472486 return 0 ;
473487 }
474- value = value & (( 1 << bit_count ) - 1 );
488+ value = value & (PIO_PINMASK ( bit_count ) - 1 );
475489 uint32_t shift = first_pin -> number ;
476- return value << shift | value >> ( 32 - shift ) ;
490+ return value << shift ;
477491}
478492
479493typedef struct {
@@ -589,15 +603,15 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
589603 size_t frequency ,
590604 const uint16_t * init , size_t init_len ,
591605 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 ,
593607 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 ,
596610 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 ,
598612 bool sideset_enable ,
599613 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 ,
601615 bool exclusive_pin_use ,
602616 bool auto_pull , uint8_t pull_threshold , bool out_shift_right ,
603617 bool wait_for_txstall ,
@@ -610,7 +624,7 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
610624 int mov_status_n ) {
611625
612626 // 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 ;
614628 pins_we_use |= _check_pins_free (first_out_pin , out_pin_count , exclusive_pin_use );
615629 pins_we_use |= _check_pins_free (first_in_pin , in_pin_count , exclusive_pin_use );
616630 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,
642656 mp_raise_ValueError_varg (MP_ERROR_TEXT ("Program does OUT without loading OSR" ));
643657 }
644658
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 );
651665 // Check that OUT and SET settings agree because we don't have a way of picking one over the other.
652666 if ((initial_pin_state & set_out_overlap ) != (initial_set_pin_state & set_out_overlap )) {
653667 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,
659673 initial_pin_direction |= initial_set_pin_direction ;
660674
661675 // 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 );
665679
666680 // 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 );
669683
670684 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 );
672686 if (jmp_pull == PULL_UP ) {
673687 pull_up |= jmp_mask ;
674688 }
0 commit comments