From a7d2b61b278b6ff23b7d912dfd7d570b0559db9b Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Fri, 20 Dec 2024 11:09:37 -0600 Subject: [PATCH 1/5] Enable use of pins >32 on RP2350B Closes: #133 --- src/pio_usb.c | 17 +++++++++++++++-- src/usb_rx.pio | 10 +++++----- src/usb_rx.pio.h | 8 ++++---- src/usb_tx.pio | 6 +++--- src/usb_tx.pio.h | 4 ++-- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/pio_usb.c b/src/pio_usb.c index 5c7901b..d13b5d7 100644 --- a/src/pio_usb.c +++ b/src/pio_usb.c @@ -291,17 +291,30 @@ static void apply_config(pio_port_t *pp, const pio_usb_configuration_t *c, pp->sm_eop = c->sm_eop; port->pin_dp = c->pin_dp; + uint highest_pin; if (c->pinout == PIO_USB_PINOUT_DPDM) { port->pin_dm = c->pin_dp + 1; + highest_pin = port->pin_dm; pp->fs_tx_program = &usb_tx_dpdm_program; pp->fs_tx_pre_program = &usb_tx_pre_dpdm_program; pp->ls_tx_program = &usb_tx_dmdp_program; } else { port->pin_dm = c->pin_dp - 1; + highest_pin = port->pin_dp; pp->fs_tx_program = &usb_tx_dmdp_program; pp->fs_tx_pre_program = &usb_tx_pre_dmdp_program; pp->ls_tx_program = &usb_tx_dpdm_program; } + +#if PICO_PIO_USE_GPIO_BASE + if (highest_pin > 32) { + pio_set_gpio_base(pp->pio_usb_tx, 16); + pio_set_gpio_base(pp->pio_usb_rx, 16); + } +#else + (void)highest_pin; +#endif + port->pinout = c->pinout; pp->debug_pin_rx = c->debug_pin_rx; @@ -573,8 +586,8 @@ int pio_usb_host_add_port(uint8_t pin_dp, PIO_USB_PINOUT pinout) { pio_gpio_init(pio_port[0].pio_usb_tx, root->pin_dm); gpio_set_inover(pin_dp, GPIO_OVERRIDE_INVERT); gpio_set_inover(root->pin_dm, GPIO_OVERRIDE_INVERT); - pio_sm_set_pindirs_with_mask(pio_port[0].pio_usb_tx, pio_port[0].sm_tx, 0, - (1 << pin_dp) | (1 << root->pin_dm)); + pio_sm_set_pindirs_with_mask64(pio_port[0].pio_usb_tx, pio_port[0].sm_tx, 0, + (1ull << pin_dp) | (1ull << root->pin_dm)); port_pin_drive_setting(root); root->initialized = true; diff --git a/src/usb_rx.pio b/src/usb_rx.pio index 76e6fbe..c9d74be 100644 --- a/src/usb_rx.pio +++ b/src/usb_rx.pio @@ -182,8 +182,8 @@ static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pi } else { c = usb_nrzi_decoder_debug_program_get_default_config(offset); - pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug); - pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug); + pio_sm_set_pins_with_mask64(pio, sm, 0, 1ull << pin_debug); + pio_sm_set_pindirs_with_mask64(pio, sm, 1ull << pin_debug, 1ull << pin_debug); pio_gpio_init(pio, pin_debug); sm_config_set_sideset_pins(&c, pin_debug); } @@ -208,8 +208,8 @@ static inline void eop_detect_fs_program_init(PIO pio, uint sm, uint offset, c = usb_edge_detector_program_get_default_config(offset); } else { c = usb_edge_detector_debug_program_get_default_config(offset); - pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug); - pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug); + pio_sm_set_pins_with_mask64(pio, sm, 0, 1ull << pin_debug); + pio_sm_set_pindirs_with_mask64(pio, sm, 1ull << pin_debug, 1ull << pin_debug); pio_gpio_init(pio, pin_debug); sm_config_set_sideset_pins(&c, pin_debug); } @@ -232,4 +232,4 @@ static inline void eop_detect_fs_program_init(PIO pio, uint sm, uint offset, pio_sm_set_enabled(pio, sm, true); } -%} \ No newline at end of file +%} diff --git a/src/usb_rx.pio.h b/src/usb_rx.pio.h index 4beaa35..8b03d79 100644 --- a/src/usb_rx.pio.h +++ b/src/usb_rx.pio.h @@ -195,8 +195,8 @@ static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pi c = usb_nrzi_decoder_program_get_default_config(offset); } else { c = usb_nrzi_decoder_debug_program_get_default_config(offset); - pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug); - pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug); + pio_sm_set_pins_with_mask64(pio, sm, 0, 1ull << pin_debug); + pio_sm_set_pindirs_with_mask64(pio, sm, 1ull << pin_debug, 1ull << pin_debug); pio_gpio_init(pio, pin_debug); sm_config_set_sideset_pins(&c, pin_debug); } @@ -216,8 +216,8 @@ static inline void eop_detect_fs_program_init(PIO pio, uint sm, uint offset, c = usb_edge_detector_program_get_default_config(offset); } else { c = usb_edge_detector_debug_program_get_default_config(offset); - pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug); - pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug); + pio_sm_set_pins_with_mask64(pio, sm, 0, 1ull << pin_debug); + pio_sm_set_pindirs_with_mask64(pio, sm, 1ull << pin_debug, 1ull << pin_debug); pio_gpio_init(pio, pin_debug); sm_config_set_sideset_pins(&c, pin_debug); } diff --git a/src/usb_tx.pio b/src/usb_tx.pio index dffb7b9..07fc8c0 100644 --- a/src/usb_tx.pio +++ b/src/usb_tx.pio @@ -106,7 +106,7 @@ set pindirs, 0b11 side FJ_LK static inline void usb_tx_fs_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm) { - pio_sm_set_pins_with_mask(pio, sm, (1 << pin_dp), ((1 << pin_dp) | (1 << pin_dm))); + pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dp), ((1ull << pin_dp) | (1ull << pin_dm))); gpio_pull_down(pin_dp); gpio_pull_down(pin_dm); @@ -132,7 +132,7 @@ set pindirs, 0b11 side FJ_LK static inline void usb_tx_ls_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm) { - pio_sm_set_pins_with_mask(pio, sm, (1 << pin_dm), ((1 << pin_dp) | (1 << pin_dm))); + pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dm), ((1ull << pin_dp) | (1ull << pin_dm))); gpio_pull_down(pin_dp); gpio_pull_down(pin_dm); @@ -156,4 +156,4 @@ set pindirs, 0b11 side FJ_LK pio_sm_set_enabled(pio, sm, true); } -%} \ No newline at end of file +%} diff --git a/src/usb_tx.pio.h b/src/usb_tx.pio.h index 0e938c8..7c37ce6 100644 --- a/src/usb_tx.pio.h +++ b/src/usb_tx.pio.h @@ -151,7 +151,7 @@ static inline pio_sm_config usb_tx_pre_dmdp_program_get_default_config(uint offs } static inline void usb_tx_fs_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm) { - pio_sm_set_pins_with_mask(pio, sm, (1 << pin_dp), ((1 << pin_dp) | (1 << pin_dm))); + pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dp), ((1ull << pin_dp) | (1ull << pin_dm))); gpio_pull_down(pin_dp); gpio_pull_down(pin_dm); pio_gpio_init(pio, pin_dp); @@ -170,7 +170,7 @@ static inline pio_sm_config usb_tx_pre_dmdp_program_get_default_config(uint offs } static inline void usb_tx_ls_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm) { - pio_sm_set_pins_with_mask(pio, sm, (1 << pin_dm), ((1 << pin_dp) | (1 << pin_dm))); + pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dm), ((1ull << pin_dp) | (1ull << pin_dm))); gpio_pull_down(pin_dp); gpio_pull_down(pin_dm); pio_gpio_init(pio, pin_dp); From 38186c145af51056f119477086053ba383b7fde2 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Fri, 20 Dec 2024 11:53:28 -0600 Subject: [PATCH 2/5] Fix compatibility with old SDK versions --- src/pio_usb.c | 2 +- src/sdk_compat.h | 20 ++++++++++++++++++++ src/usb_rx.pio | 9 +-------- src/usb_rx.pio.h | 8 +------- src/usb_tx.pio | 1 + src/usb_tx.pio.h | 1 + 6 files changed, 25 insertions(+), 16 deletions(-) create mode 100644 src/sdk_compat.h diff --git a/src/pio_usb.c b/src/pio_usb.c index d13b5d7..f1bdcbe 100644 --- a/src/pio_usb.c +++ b/src/pio_usb.c @@ -306,7 +306,7 @@ static void apply_config(pio_port_t *pp, const pio_usb_configuration_t *c, pp->ls_tx_program = &usb_tx_dpdm_program; } -#if PICO_PIO_USE_GPIO_BASE +#if defined(PICO_PIO_USE_GPIO_BASE) && PICO_PIO_USE_GPIO_BASE+0 if (highest_pin > 32) { pio_set_gpio_base(pp->pio_usb_tx, 16); pio_set_gpio_base(pp->pio_usb_rx, 16); diff --git a/src/sdk_compat.h b/src/sdk_compat.h new file mode 100644 index 0000000..935dce2 --- /dev/null +++ b/src/sdk_compat.h @@ -0,0 +1,20 @@ +#pragma once + +#if PICO_SDK_VERSION_MAJOR < 2 +static __always_inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint jmp_pin) { + pio->sm[sm].execctrl = + (pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS) | + (jmp_pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB); +} +#endif + +#if PICO_SDK_VERSION_MAJOR < 2 || (PICO_SDK_VERSION_MAJOR == 2 && PICO_SDK_VERSION_MINOR < 1) +static void pio_sm_set_pins_with_mask64(PIO pio, uint sm, uint64_t pin_values, uint64_t pin_mask) { + pio_sm_set_pins_with_mask(pio, sm, (uint32_t) pin_values, (uint32_t) pin_mask); +} + +static void pio_sm_set_pindirs_with_mask64(PIO pio, uint sm, uint64_t pin_values, uint64_t pin_mask) { + pio_sm_set_pindirs_with_mask(pio, sm, (uint32_t) pin_values, (uint32_t) pin_mask); +} +#endif + diff --git a/src/usb_rx.pio b/src/usb_rx.pio index c9d74be..aa0807e 100644 --- a/src/usb_rx.pio +++ b/src/usb_rx.pio @@ -155,14 +155,7 @@ J2: % c-sdk { #include "hardware/clocks.h" - -#if PICO_SDK_VERSION_MAJOR < 2 -static __always_inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint jmp_pin) { - pio->sm[sm].execctrl = - (pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS) | - (jmp_pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB); -} -#endif +#include "sdk_compat.h" static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm, int pin_debug) { if (pin_dp < pin_dm) { diff --git a/src/usb_rx.pio.h b/src/usb_rx.pio.h index 8b03d79..29341e1 100644 --- a/src/usb_rx.pio.h +++ b/src/usb_rx.pio.h @@ -173,13 +173,7 @@ static inline pio_sm_config usb_nrzi_decoder_debug_program_get_default_config(ui } #include "hardware/clocks.h" -#if PICO_SDK_VERSION_MAJOR < 2 -static __always_inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint jmp_pin) { - pio->sm[sm].execctrl = - (pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS) | - (jmp_pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB); -} -#endif +#include "sdk_compat.h" static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm, int pin_debug) { if (pin_dp < pin_dm) { pio_sm_set_consecutive_pindirs(pio, sm, pin_dp, 2, false); diff --git a/src/usb_tx.pio b/src/usb_tx.pio index 07fc8c0..b64fe64 100644 --- a/src/usb_tx.pio +++ b/src/usb_tx.pio @@ -91,6 +91,7 @@ set pindirs, 0b11 side FJ_LK % c-sdk { #include "hardware/clocks.h" +#include "sdk_compat.h" static void __no_inline_not_in_flash_func(usb_tx_configure_pins)(PIO pio, uint sm, uint pin_dp, uint pin_dm) { if (pin_dp < pin_dm) { diff --git a/src/usb_tx.pio.h b/src/usb_tx.pio.h index 7c37ce6..991565b 100644 --- a/src/usb_tx.pio.h +++ b/src/usb_tx.pio.h @@ -138,6 +138,7 @@ static inline pio_sm_config usb_tx_pre_dmdp_program_get_default_config(uint offs } #include "hardware/clocks.h" +#include "sdk_compat.h" static void __no_inline_not_in_flash_func(usb_tx_configure_pins)(PIO pio, uint sm, uint pin_dp, uint pin_dm) { if (pin_dp < pin_dm) { pio_sm_set_out_pins(pio, sm, pin_dp, 2); From 445ca6403643f19ae8a70a3632b6924943a93189 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Fri, 20 Dec 2024 11:54:22 -0600 Subject: [PATCH 3/5] run CI on 2.1.0 --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a3b34cc..951163b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,6 +16,7 @@ jobs: fail-fast: false matrix: sdk_version: + - '2.1.0' - '2.0.0' - '1.5.1' runs-on: ubuntu-latest From b559b3e1637ead1768514b0de962e21a99a9adbf Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sun, 26 Jan 2025 10:55:04 -0600 Subject: [PATCH 4/5] Handle rp2350 pio2 by using sdk pio_get_instance & PIO_IRQ_NUM --- src/pio_usb.c | 6 +++--- src/pio_usb_device.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pio_usb.c b/src/pio_usb.c index f1bdcbe..13dc81f 100644 --- a/src/pio_usb.c +++ b/src/pio_usb.c @@ -283,10 +283,10 @@ static void configure_tx_channel(uint8_t ch, PIO pio, uint sm) { static void apply_config(pio_port_t *pp, const pio_usb_configuration_t *c, root_port_t *port) { - pp->pio_usb_tx = c->pio_tx_num == 0 ? pio0 : pio1; + pp->pio_usb_tx = pio_get_instance(c->pio_tx_num); pp->sm_tx = c->sm_tx; pp->tx_ch = c->tx_ch; - pp->pio_usb_rx = c->pio_rx_num == 0 ? pio0 : pio1; + pp->pio_usb_rx = pio_get_instance(c->pio_rx_num); pp->sm_rx = c->sm_rx; pp->sm_eop = c->sm_eop; port->pin_dp = c->pin_dp; @@ -336,7 +336,7 @@ void pio_usb_bus_init(pio_port_t *pp, const pio_usb_configuration_t *c, root_port_t *root) { memset(root, 0, sizeof(root_port_t)); - pp->pio_usb_tx = c->pio_tx_num == 0 ? pio0 : pio1; + pp->pio_usb_tx = pio_get_instance(c->pio_tx_num); dma_claim_mask(1<tx_ch); configure_tx_channel(c->tx_ch, pp->pio_usb_tx, c->sm_tx); diff --git a/src/pio_usb_device.c b/src/pio_usb_device.c index a11e786..f608d7b 100644 --- a/src/pio_usb_device.c +++ b/src/pio_usb_device.c @@ -291,7 +291,7 @@ usb_device_t *pio_usb_device_init(const pio_usb_configuration_t *c, // configure PIOx_IRQ_0 to detect packet receive start pio_set_irqn_source_enabled(pp->pio_usb_rx, 0, pis_interrupt0 + IRQ_RX_START, true); - pp->device_rx_irq_num = (pp->pio_usb_rx == pio0) ? PIO0_IRQ_0 : PIO1_IRQ_0; + pp->device_rx_irq_num = PIO_IRQ_NUM(pp->pio_usb_rx, 0); irq_set_exclusive_handler(pp->device_rx_irq_num, usb_device_packet_handler); irq_set_enabled(pp->device_rx_irq_num, true); From 7f7ea5b481648153bec264b7faeec8676abeb97d Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sun, 26 Jan 2025 11:01:20 -0600 Subject: [PATCH 5/5] sdk 1.5 compat --- src/sdk_compat.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/sdk_compat.h b/src/sdk_compat.h index 935dce2..cc610f4 100644 --- a/src/sdk_compat.h +++ b/src/sdk_compat.h @@ -6,6 +6,17 @@ static __always_inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint jmp_pin) { (pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS) | (jmp_pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB); } + +static_assert(PIO1_BASE - PIO0_BASE == (1u << 20), "hardware layout mismatch"); +#define PIO_INSTANCE(instance) ((pio_hw_t *)(PIO0_BASE + (instance) * (1u << 20))) +static __always_inline PIO pio_get_instance(uint instance) { + return PIO_INSTANCE(instance); +} + +#define PIO_NUM(pio) (((uintptr_t)(pio) - PIO0_BASE) >> 20) +#define NUM_PIO_IRQS (2u) +#define PIO_IRQ_NUM(pio, irqn) (PIO0_IRQ_0 + NUM_PIO_IRQS * PIO_NUM(pio) + (irqn)) + #endif #if PICO_SDK_VERSION_MAJOR < 2 || (PICO_SDK_VERSION_MAJOR == 2 && PICO_SDK_VERSION_MINOR < 1)