Skip to content

Commit d1a779c

Browse files
committed
Some fixes for cyw32 gpio > 32
1 parent 76cb985 commit d1a779c

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

src/rp2_common/pico_cyw43_driver/cyw43_bus_pio_spi.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
#define IRQ_SAMPLE_DELAY_NS 100
2626

27-
#if !CYW43_PIN_WL_DYNAMIC
27+
#if !CYW43_PIN_WL_DYNAMIC && PICO_PIO_USE_GPIO_BASE
2828
// The pins should all work in the same gpio base
2929
static_assert((CYW43_PIN_WL_DATA_OUT < 32 && CYW43_PIN_WL_DATA_IN < 32 && CYW43_PIN_WL_CLOCK < 32) ||
3030
(CYW43_PIN_WL_DATA_OUT >= 16 && CYW43_PIN_WL_DATA_IN >= 16 && CYW43_PIN_WL_CLOCK >= 16), "");
@@ -131,7 +131,7 @@ int cyw43_spi_init(cyw43_int_t *self) {
131131
sm_config_set_sideset_pins(&config, CYW43_PIN_WL_CLOCK);
132132
sm_config_set_in_shift(&config, false, true, 32);
133133
sm_config_set_out_shift(&config, false, true, 32);
134-
hw_set_bits(&bus_data->pio->input_sync_bypass, 1u << CYW43_PIN_WL_DATA_IN);
134+
hw_set_bits(&bus_data->pio->input_sync_bypass, 1u << (CYW43_PIN_WL_DATA_IN - pio_get_gpio_base(bus_data->pio)));
135135
pio_sm_set_config(bus_data->pio, bus_data->pio_sm, &config);
136136
pio_sm_set_consecutive_pindirs(bus_data->pio, bus_data->pio_sm, CYW43_PIN_WL_CLOCK, 1, true);
137137
gpio_set_function(CYW43_PIN_WL_DATA_OUT, pio_get_funcsel(bus_data->pio));
@@ -242,7 +242,9 @@ int cyw43_spi_transfer(cyw43_int_t *self, const uint8_t *tx, size_t tx_length, u
242242
pio_sm_set_enabled(bus_data->pio, bus_data->pio_sm, false);
243243
pio_sm_set_wrap(bus_data->pio, bus_data->pio_sm, bus_data->pio_offset, bus_data->pio_offset + SPI_OFFSET_END - 1);
244244
pio_sm_clear_fifos(bus_data->pio, bus_data->pio_sm);
245-
pio_sm_set_pindirs_with_mask(bus_data->pio, bus_data->pio_sm, 1u << CYW43_PIN_WL_DATA_OUT, 1u << CYW43_PIN_WL_DATA_OUT);
245+
pio_sm_set_pindirs_with_mask(bus_data->pio, bus_data->pio_sm,
246+
1u << (CYW43_PIN_WL_DATA_OUT - pio_get_gpio_base(bus_data->pio)),
247+
1u << (CYW43_PIN_WL_DATA_OUT - pio_get_gpio_base(bus_data->pio)));
246248
pio_sm_restart(bus_data->pio, bus_data->pio_sm);
247249
pio_sm_clkdiv_restart(bus_data->pio, bus_data->pio_sm);
248250
pio_sm_put(bus_data->pio, bus_data->pio_sm, tx_length * 8 - 1);
@@ -284,7 +286,9 @@ int cyw43_spi_transfer(cyw43_int_t *self, const uint8_t *tx, size_t tx_length, u
284286
pio_sm_set_enabled(bus_data->pio, bus_data->pio_sm, false);
285287
pio_sm_set_wrap(bus_data->pio, bus_data->pio_sm, bus_data->pio_offset, bus_data->pio_offset + SPI_OFFSET_LP1_END - 1);
286288
pio_sm_clear_fifos(bus_data->pio, bus_data->pio_sm);
287-
pio_sm_set_pindirs_with_mask(bus_data->pio, bus_data->pio_sm, 1u << CYW43_PIN_WL_DATA_OUT, 1u << CYW43_PIN_WL_DATA_OUT);
289+
pio_sm_set_pindirs_with_mask(bus_data->pio, bus_data->pio_sm,
290+
1u << (CYW43_PIN_WL_DATA_OUT - pio_get_gpio_base(bus_data->pio)),
291+
1u << (CYW43_PIN_WL_DATA_OUT - pio_get_gpio_base(bus_data->pio)));
288292
pio_sm_restart(bus_data->pio, bus_data->pio_sm);
289293
pio_sm_clkdiv_restart(bus_data->pio, bus_data->pio_sm);
290294
pio_sm_put(bus_data->pio, bus_data->pio_sm, tx_length * 8 - 1);
@@ -563,9 +567,13 @@ static bool cyw43_pins_valid(uint pins[CYW43_PIN_INDEX_WL_COUNT]) {
563567
return false;
564568
}
565569
}
570+
#if PICO_PIO_USE_GPIO_BASE
566571
// These pins should use the same gpio base
567572
return (pins[CYW43_PIN_INDEX_WL_DATA_OUT] < 32 && pins[CYW43_PIN_INDEX_WL_DATA_IN] < 32 && pins[CYW43_PIN_INDEX_WL_CLOCK] < 32) ||
568573
(pins[CYW43_PIN_INDEX_WL_DATA_OUT] >= 16 && pins[CYW43_PIN_INDEX_WL_DATA_IN] >= 16 && pins[CYW43_PIN_INDEX_WL_CLOCK] >= 16);
574+
#else
575+
return true;
576+
#endif
569577
}
570578

571579
// Set the gpio pin array

src/rp2_common/pico_cyw43_driver/include/cyw43_configport.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,11 @@ static inline int cyw43_hal_pin_read(cyw43_hal_pin_obj_t pin) {
159159
}
160160

161161
static inline void cyw43_hal_pin_low(cyw43_hal_pin_obj_t pin) {
162-
gpio_clr_mask(1 << pin);
162+
gpio_clr_mask64(1 << pin);
163163
}
164164

165165
static inline void cyw43_hal_pin_high(cyw43_hal_pin_obj_t pin) {
166-
gpio_set_mask(1 << pin);
166+
gpio_set_mask64(1 << pin);
167167
}
168168

169169
#define CYW43_HAL_PIN_MODE_INPUT (GPIO_IN)

0 commit comments

Comments
 (0)