Skip to content

Commit 442af43

Browse files
Merge pull request #157 from adafruit/rp2350b
Enable use of pins >32 on RP2350B
2 parents d17f8ef + 7f7ea5b commit 442af43

File tree

8 files changed

+69
-35
lines changed

8 files changed

+69
-35
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ jobs:
1616
fail-fast: false
1717
matrix:
1818
sdk_version:
19+
- '2.1.0'
1920
- '2.0.0'
2021
- '1.5.1'
2122
runs-on: ubuntu-latest

src/pio_usb.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -283,25 +283,38 @@ static void configure_tx_channel(uint8_t ch, PIO pio, uint sm) {
283283

284284
static void apply_config(pio_port_t *pp, const pio_usb_configuration_t *c,
285285
root_port_t *port) {
286-
pp->pio_usb_tx = c->pio_tx_num == 0 ? pio0 : pio1;
286+
pp->pio_usb_tx = pio_get_instance(c->pio_tx_num);
287287
pp->sm_tx = c->sm_tx;
288288
pp->tx_ch = c->tx_ch;
289-
pp->pio_usb_rx = c->pio_rx_num == 0 ? pio0 : pio1;
289+
pp->pio_usb_rx = pio_get_instance(c->pio_rx_num);
290290
pp->sm_rx = c->sm_rx;
291291
pp->sm_eop = c->sm_eop;
292292
port->pin_dp = c->pin_dp;
293293

294+
uint highest_pin;
294295
if (c->pinout == PIO_USB_PINOUT_DPDM) {
295296
port->pin_dm = c->pin_dp + 1;
297+
highest_pin = port->pin_dm;
296298
pp->fs_tx_program = &usb_tx_dpdm_program;
297299
pp->fs_tx_pre_program = &usb_tx_pre_dpdm_program;
298300
pp->ls_tx_program = &usb_tx_dmdp_program;
299301
} else {
300302
port->pin_dm = c->pin_dp - 1;
303+
highest_pin = port->pin_dp;
301304
pp->fs_tx_program = &usb_tx_dmdp_program;
302305
pp->fs_tx_pre_program = &usb_tx_pre_dmdp_program;
303306
pp->ls_tx_program = &usb_tx_dpdm_program;
304307
}
308+
309+
#if defined(PICO_PIO_USE_GPIO_BASE) && PICO_PIO_USE_GPIO_BASE+0
310+
if (highest_pin > 32) {
311+
pio_set_gpio_base(pp->pio_usb_tx, 16);
312+
pio_set_gpio_base(pp->pio_usb_rx, 16);
313+
}
314+
#else
315+
(void)highest_pin;
316+
#endif
317+
305318
port->pinout = c->pinout;
306319

307320
pp->debug_pin_rx = c->debug_pin_rx;
@@ -323,7 +336,7 @@ void pio_usb_bus_init(pio_port_t *pp, const pio_usb_configuration_t *c,
323336
root_port_t *root) {
324337
memset(root, 0, sizeof(root_port_t));
325338

326-
pp->pio_usb_tx = c->pio_tx_num == 0 ? pio0 : pio1;
339+
pp->pio_usb_tx = pio_get_instance(c->pio_tx_num);
327340
dma_claim_mask(1<<c->tx_ch);
328341
configure_tx_channel(c->tx_ch, pp->pio_usb_tx, c->sm_tx);
329342

@@ -573,8 +586,8 @@ int pio_usb_host_add_port(uint8_t pin_dp, PIO_USB_PINOUT pinout) {
573586
pio_gpio_init(pio_port[0].pio_usb_tx, root->pin_dm);
574587
gpio_set_inover(pin_dp, GPIO_OVERRIDE_INVERT);
575588
gpio_set_inover(root->pin_dm, GPIO_OVERRIDE_INVERT);
576-
pio_sm_set_pindirs_with_mask(pio_port[0].pio_usb_tx, pio_port[0].sm_tx, 0,
577-
(1 << pin_dp) | (1 << root->pin_dm));
589+
pio_sm_set_pindirs_with_mask64(pio_port[0].pio_usb_tx, pio_port[0].sm_tx, 0,
590+
(1ull << pin_dp) | (1ull << root->pin_dm));
578591
port_pin_drive_setting(root);
579592
root->initialized = true;
580593

src/pio_usb_device.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ usb_device_t *pio_usb_device_init(const pio_usb_configuration_t *c,
291291
// configure PIOx_IRQ_0 to detect packet receive start
292292
pio_set_irqn_source_enabled(pp->pio_usb_rx, 0, pis_interrupt0 + IRQ_RX_START,
293293
true);
294-
pp->device_rx_irq_num = (pp->pio_usb_rx == pio0) ? PIO0_IRQ_0 : PIO1_IRQ_0;
294+
pp->device_rx_irq_num = PIO_IRQ_NUM(pp->pio_usb_rx, 0);
295295
irq_set_exclusive_handler(pp->device_rx_irq_num, usb_device_packet_handler);
296296
irq_set_enabled(pp->device_rx_irq_num, true);
297297

src/sdk_compat.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#pragma once
2+
3+
#if PICO_SDK_VERSION_MAJOR < 2
4+
static __always_inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint jmp_pin) {
5+
pio->sm[sm].execctrl =
6+
(pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS) |
7+
(jmp_pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB);
8+
}
9+
10+
static_assert(PIO1_BASE - PIO0_BASE == (1u << 20), "hardware layout mismatch");
11+
#define PIO_INSTANCE(instance) ((pio_hw_t *)(PIO0_BASE + (instance) * (1u << 20)))
12+
static __always_inline PIO pio_get_instance(uint instance) {
13+
return PIO_INSTANCE(instance);
14+
}
15+
16+
#define PIO_NUM(pio) (((uintptr_t)(pio) - PIO0_BASE) >> 20)
17+
#define NUM_PIO_IRQS (2u)
18+
#define PIO_IRQ_NUM(pio, irqn) (PIO0_IRQ_0 + NUM_PIO_IRQS * PIO_NUM(pio) + (irqn))
19+
20+
#endif
21+
22+
#if PICO_SDK_VERSION_MAJOR < 2 || (PICO_SDK_VERSION_MAJOR == 2 && PICO_SDK_VERSION_MINOR < 1)
23+
static void pio_sm_set_pins_with_mask64(PIO pio, uint sm, uint64_t pin_values, uint64_t pin_mask) {
24+
pio_sm_set_pins_with_mask(pio, sm, (uint32_t) pin_values, (uint32_t) pin_mask);
25+
}
26+
27+
static void pio_sm_set_pindirs_with_mask64(PIO pio, uint sm, uint64_t pin_values, uint64_t pin_mask) {
28+
pio_sm_set_pindirs_with_mask(pio, sm, (uint32_t) pin_values, (uint32_t) pin_mask);
29+
}
30+
#endif
31+

src/usb_rx.pio

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,7 @@ J2:
155155

156156
% c-sdk {
157157
#include "hardware/clocks.h"
158-
159-
#if PICO_SDK_VERSION_MAJOR < 2
160-
static __always_inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint jmp_pin) {
161-
pio->sm[sm].execctrl =
162-
(pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS) |
163-
(jmp_pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB);
164-
}
165-
#endif
158+
#include "sdk_compat.h"
166159

167160
static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm, int pin_debug) {
168161
if (pin_dp < pin_dm) {
@@ -182,8 +175,8 @@ static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pi
182175
} else {
183176
c = usb_nrzi_decoder_debug_program_get_default_config(offset);
184177

185-
pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug);
186-
pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug);
178+
pio_sm_set_pins_with_mask64(pio, sm, 0, 1ull << pin_debug);
179+
pio_sm_set_pindirs_with_mask64(pio, sm, 1ull << pin_debug, 1ull << pin_debug);
187180
pio_gpio_init(pio, pin_debug);
188181
sm_config_set_sideset_pins(&c, pin_debug);
189182
}
@@ -208,8 +201,8 @@ static inline void eop_detect_fs_program_init(PIO pio, uint sm, uint offset,
208201
c = usb_edge_detector_program_get_default_config(offset);
209202
} else {
210203
c = usb_edge_detector_debug_program_get_default_config(offset);
211-
pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug);
212-
pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug);
204+
pio_sm_set_pins_with_mask64(pio, sm, 0, 1ull << pin_debug);
205+
pio_sm_set_pindirs_with_mask64(pio, sm, 1ull << pin_debug, 1ull << pin_debug);
213206
pio_gpio_init(pio, pin_debug);
214207
sm_config_set_sideset_pins(&c, pin_debug);
215208
}
@@ -232,4 +225,4 @@ static inline void eop_detect_fs_program_init(PIO pio, uint sm, uint offset,
232225
pio_sm_set_enabled(pio, sm, true);
233226
}
234227

235-
%}
228+
%}

src/usb_rx.pio.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,7 @@ static inline pio_sm_config usb_nrzi_decoder_debug_program_get_default_config(ui
173173
}
174174

175175
#include "hardware/clocks.h"
176-
#if PICO_SDK_VERSION_MAJOR < 2
177-
static __always_inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint jmp_pin) {
178-
pio->sm[sm].execctrl =
179-
(pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS) |
180-
(jmp_pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB);
181-
}
182-
#endif
176+
#include "sdk_compat.h"
183177
static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm, int pin_debug) {
184178
if (pin_dp < pin_dm) {
185179
pio_sm_set_consecutive_pindirs(pio, sm, pin_dp, 2, false);
@@ -195,8 +189,8 @@ static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pi
195189
c = usb_nrzi_decoder_program_get_default_config(offset);
196190
} else {
197191
c = usb_nrzi_decoder_debug_program_get_default_config(offset);
198-
pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug);
199-
pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug);
192+
pio_sm_set_pins_with_mask64(pio, sm, 0, 1ull << pin_debug);
193+
pio_sm_set_pindirs_with_mask64(pio, sm, 1ull << pin_debug, 1ull << pin_debug);
200194
pio_gpio_init(pio, pin_debug);
201195
sm_config_set_sideset_pins(&c, pin_debug);
202196
}
@@ -216,8 +210,8 @@ static inline void eop_detect_fs_program_init(PIO pio, uint sm, uint offset,
216210
c = usb_edge_detector_program_get_default_config(offset);
217211
} else {
218212
c = usb_edge_detector_debug_program_get_default_config(offset);
219-
pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug);
220-
pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug);
213+
pio_sm_set_pins_with_mask64(pio, sm, 0, 1ull << pin_debug);
214+
pio_sm_set_pindirs_with_mask64(pio, sm, 1ull << pin_debug, 1ull << pin_debug);
221215
pio_gpio_init(pio, pin_debug);
222216
sm_config_set_sideset_pins(&c, pin_debug);
223217
}

src/usb_tx.pio

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ set pindirs, 0b11 side FJ_LK
9191

9292
% c-sdk {
9393
#include "hardware/clocks.h"
94+
#include "sdk_compat.h"
9495

9596
static void __no_inline_not_in_flash_func(usb_tx_configure_pins)(PIO pio, uint sm, uint pin_dp, uint pin_dm) {
9697
if (pin_dp < pin_dm) {
@@ -106,7 +107,7 @@ set pindirs, 0b11 side FJ_LK
106107

107108
static inline void usb_tx_fs_program_init(PIO pio, uint sm, uint offset,
108109
uint pin_dp, uint pin_dm) {
109-
pio_sm_set_pins_with_mask(pio, sm, (1 << pin_dp), ((1 << pin_dp) | (1 << pin_dm)));
110+
pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dp), ((1ull << pin_dp) | (1ull << pin_dm)));
110111

111112
gpio_pull_down(pin_dp);
112113
gpio_pull_down(pin_dm);
@@ -132,7 +133,7 @@ set pindirs, 0b11 side FJ_LK
132133

133134
static inline void usb_tx_ls_program_init(PIO pio, uint sm, uint offset,
134135
uint pin_dp, uint pin_dm) {
135-
pio_sm_set_pins_with_mask(pio, sm, (1 << pin_dm), ((1 << pin_dp) | (1 << pin_dm)));
136+
pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dm), ((1ull << pin_dp) | (1ull << pin_dm)));
136137

137138
gpio_pull_down(pin_dp);
138139
gpio_pull_down(pin_dm);
@@ -156,4 +157,4 @@ set pindirs, 0b11 side FJ_LK
156157
pio_sm_set_enabled(pio, sm, true);
157158
}
158159

159-
%}
160+
%}

src/usb_tx.pio.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ static inline pio_sm_config usb_tx_pre_dmdp_program_get_default_config(uint offs
138138
}
139139

140140
#include "hardware/clocks.h"
141+
#include "sdk_compat.h"
141142
static void __no_inline_not_in_flash_func(usb_tx_configure_pins)(PIO pio, uint sm, uint pin_dp, uint pin_dm) {
142143
if (pin_dp < pin_dm) {
143144
pio_sm_set_out_pins(pio, sm, pin_dp, 2);
@@ -151,7 +152,7 @@ static inline pio_sm_config usb_tx_pre_dmdp_program_get_default_config(uint offs
151152
}
152153
static inline void usb_tx_fs_program_init(PIO pio, uint sm, uint offset,
153154
uint pin_dp, uint pin_dm) {
154-
pio_sm_set_pins_with_mask(pio, sm, (1 << pin_dp), ((1 << pin_dp) | (1 << pin_dm)));
155+
pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dp), ((1ull << pin_dp) | (1ull << pin_dm)));
155156
gpio_pull_down(pin_dp);
156157
gpio_pull_down(pin_dm);
157158
pio_gpio_init(pio, pin_dp);
@@ -170,7 +171,7 @@ static inline pio_sm_config usb_tx_pre_dmdp_program_get_default_config(uint offs
170171
}
171172
static inline void usb_tx_ls_program_init(PIO pio, uint sm, uint offset,
172173
uint pin_dp, uint pin_dm) {
173-
pio_sm_set_pins_with_mask(pio, sm, (1 << pin_dm), ((1 << pin_dp) | (1 << pin_dm)));
174+
pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dm), ((1ull << pin_dp) | (1ull << pin_dm)));
174175
gpio_pull_down(pin_dp);
175176
gpio_pull_down(pin_dm);
176177
pio_gpio_init(pio, pin_dp);

0 commit comments

Comments
 (0)