Skip to content

Commit 1b6b117

Browse files
committed
rp2350b: detect and note high pins as unsupported for now
1 parent 5602618 commit 1b6b117

File tree

4 files changed

+74
-39
lines changed

4 files changed

+74
-39
lines changed

ports/raspberrypi/bindings/rp2pio/StateMachine.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ void common_hal_rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
2121
size_t frequency,
2222
const uint16_t *init, size_t init_len,
2323
const uint16_t *may_exec, size_t may_exec_len,
24-
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,
25-
const mcu_pin_obj_t *first_in_pin, uint8_t in_pin_count, uint32_t pull_pin_up, uint32_t pull_pin_down,
26-
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,
24+
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,
25+
const mcu_pin_obj_t *first_in_pin, uint8_t in_pin_count, pio_pinmask_t pull_pin_up, pio_pinmask_t pull_pin_down,
26+
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,
2727
const mcu_pin_obj_t *first_sideset_pin, uint8_t sideset_pin_count, bool sideset_pindirs,
28-
uint32_t initial_sideset_pin_state, uint32_t initial_sideset_pin_direction,
28+
pio_pinmask_t initial_sideset_pin_state, pio_pinmask_t initial_sideset_pin_direction,
2929
bool sideset_enable,
3030
const mcu_pin_obj_t *jmp_pin, digitalio_pull_t jmp_pin_pull,
31-
uint32_t wait_gpio_mask,
31+
pio_pinmask_t wait_gpio_mask,
3232
bool exclusive_pin_use,
3333
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
3434
bool wait_for_txstall,

ports/raspberrypi/common-hal/neopixel_write/__init__.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void common_hal_neopixel_write(const digitalio_digitalinout_obj_t *digitalinout,
4040

4141
// TODO: Cache the state machine after we create it once. We'll need a way to
4242
// change the pins then though.
43-
uint32_t pins_we_use = 1 << digitalinout->pin->number;
43+
pio_pinmask_t pins_we_use = PIO_PINMASK(digitalinout->pin->number);
4444
bool ok = rp2pio_statemachine_construct(&state_machine,
4545
neopixel_program, MP_ARRAY_SIZE(neopixel_program),
4646
12800000, // 12.8MHz, to get appropriate sub-bit times in PIO program.

ports/raspberrypi/common-hal/rp2pio/StateMachine.c

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

479493
typedef 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
}

ports/raspberrypi/common-hal/rp2pio/StateMachine.h

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,24 @@
1212
#include "common-hal/memorymap/AddressRange.h"
1313
#include "src/rp2_common/hardware_pio/include/hardware/pio.h"
1414

15+
// pio_pinmask_t can hold ANY pin masks, so it is used before selection of gpiobase
16+
#if NUM_BANK0_GPIOS > 32
17+
typedef uint64_t pio_pinmask_t;
18+
#define PIO_PINMASK_BIT (64)
19+
#define PIO_PINMASK(i) (UINT64_C(1) << (i))
20+
#else
21+
typedef uint32_t pio_pinmask_t;
22+
#define PIO_PINMASK_BIT (32)
23+
#define PIO_PINMASK(i) (UINT32_C(1) << (i))
24+
#endif
25+
26+
// pio peripheral registers only work 32 bits at a time and depend on the selection of base
27+
// (0 only on RP2040 & RP2350A; 0 or 16 on RP2350B)
28+
typedef uint32_t pio_pinmask32_t;
29+
#define PIO_PINMASK32(i) (1u << (i))
30+
#define PIO_PINMASK32_BASE(i, base) PIO_PINMASK32((i) - (base))
31+
32+
1533
enum { PIO_ANY_OFFSET = -1 };
1634
enum { PIO_FIFO_JOIN_AUTO = -1, PIO_FIFO_TYPE_DEFAULT = PIO_FIFO_JOIN_AUTO };
1735
enum { PIO_MOV_STATUS_DEFAULT = STATUS_TX_LESSTHAN };
@@ -26,7 +44,7 @@ typedef struct sm_buf_info {
2644

2745
typedef struct {
2846
mp_obj_base_t base;
29-
uint32_t pins; // Bitmask of what pins this state machine uses.
47+
pio_pinmask32_t pins; // Bitmask of what pins this state machine uses.
3048
int state_machine;
3149
PIO pio;
3250
const uint16_t *init;
@@ -45,6 +63,9 @@ typedef struct {
4563
bool out_shift_right;
4664
bool in_shift_right;
4765
bool user_interruptible;
66+
#if NUM_BANK0_GPIOS > 32
67+
uint8_t gpio_offset;
68+
#endif
4869
uint8_t offset;
4970
uint8_t fifo_depth; // Either 4 if FIFOs are not joined, or 8 if they are.
5071

@@ -79,12 +100,12 @@ bool rp2pio_statemachine_construct(rp2pio_statemachine_obj_t *self,
79100
const uint16_t *init, size_t init_len,
80101
const mcu_pin_obj_t *first_out_pin, uint8_t out_pin_count,
81102
const mcu_pin_obj_t *first_in_pin, uint8_t in_pin_count,
82-
uint32_t pull_pin_up, uint32_t pull_pin_down,
103+
pio_pinmask_t pull_pin_up, pio_pinmask_t pull_pin_down,
83104
const mcu_pin_obj_t *first_set_pin, uint8_t set_pin_count,
84105
const mcu_pin_obj_t *first_sideset_pin, uint8_t sideset_pin_count, bool sideset_pindirs,
85-
uint32_t initial_pin_state, uint32_t initial_pin_direction,
106+
pio_pinmask_t initial_pin_state, pio_pinmask_t initial_pin_direction,
86107
const mcu_pin_obj_t *jmp_pin,
87-
uint32_t pins_we_use, bool tx_fifo, bool rx_fifo,
108+
pio_pinmask_t pins_we_use, bool tx_fifo, bool rx_fifo,
88109
bool auto_pull, uint8_t pull_threshold, bool out_shift_right,
89110
bool wait_for_txstall,
90111
bool auto_push, uint8_t push_threshold, bool in_shift_right,

0 commit comments

Comments
 (0)