diff --git a/src/rp2_common/hardware_pio/include/hardware/pio.h b/src/rp2_common/hardware_pio/include/hardware/pio.h index 09ab7fe3..39b8ef5b 100644 --- a/src/rp2_common/hardware_pio/include/hardware/pio.h +++ b/src/rp2_common/hardware_pio/include/hardware/pio.h @@ -786,6 +786,15 @@ static inline uint pio_get_gpio_base(PIO pio) { #endif } +static inline void check_pio_pin_mask(__unused PIO pio, __unused uint sm, __unused uint32_t pinmask) { + // check no pins are set in the mask which are incompatible with the pio +#if PICO_PIO_USE_GPIO_BASE + valid_params_if(HARDWARE_PIO, (pinmask & ~(0xfffffffful << pio_get_gpio_base(pio))) == 0); +#else + valid_params_if(HARDWARE_PIO, (pinmask & ~0xfffffffful) == 0); +#endif +} + static inline void check_pio_pin_mask64(__unused PIO pio, __unused uint sm, __unused uint64_t pinmask) { // check no pins are set in the mask which are incompatible with the pio #if PICO_PIO_USE_GPIO_BASE diff --git a/src/rp2_common/hardware_pio/pio.c b/src/rp2_common/hardware_pio/pio.c index d4de48c5..7550e619 100644 --- a/src/rp2_common/hardware_pio/pio.c +++ b/src/rp2_common/hardware_pio/pio.c @@ -251,6 +251,7 @@ void pio_sm_set_pins_internal(PIO pio, uint sm, uint32_t pins) { #ifndef pio_sm_set_pins_internal void pio_sm_set_pins(PIO pio, uint sm, uint32_t pins) { + check_pio_pin_mask(pio, sm, pins); #if PICO_PIO_USE_GPIO_BASE pins >>= pio_get_gpio_base(pio); #endif @@ -287,6 +288,7 @@ void pio_sm_set_pins_with_mask_internal(PIO pio, uint sm, uint32_t pin_values, u #ifndef pio_sm_set_pins_with_mask_internal void pio_sm_set_pins_with_mask(PIO pio, uint sm, uint32_t pin_values, uint32_t pin_mask) { + check_pio_pin_mask(pio, sm, pin_mask); #if PICO_PIO_USE_GPIO_BASE pin_values >>= pio_get_gpio_base(pio); pin_mask >>= pio_get_gpio_base(pio); @@ -324,6 +326,7 @@ void pio_sm_set_pindirs_with_mask_internal(PIO pio, uint sm, uint32_t pindirs, u #ifndef pio_sm_set_pindirs_with_mask_internal void pio_sm_set_pindirs_with_mask(PIO pio, uint sm, uint32_t pindirs, uint32_t pin_mask) { + check_pio_pin_mask(pio, sm, pin_mask); #if PICO_PIO_USE_GPIO_BASE pindirs >>= pio_get_gpio_base(pio); pin_mask >>= pio_get_gpio_base(pio); @@ -333,6 +336,7 @@ void pio_sm_set_pindirs_with_mask(PIO pio, uint sm, uint32_t pindirs, uint32_t p #endif void pio_sm_set_pindirs_with_mask64(PIO pio, uint sm, uint64_t pindirs, uint64_t pin_mask) { + check_pio_pin_mask64(pio, sm, pin_mask); #if PICO_PIO_USE_GPIO_BASE pindirs >>= pio_get_gpio_base(pio); pin_mask >>= pio_get_gpio_base(pio);