Skip to content

Commit 5b89972

Browse files
committed
rp2: Support for dynamic pins.
Support configuring wireless on arbitrary GPIO pins. e.g. import network wlan = network.WLAN(network.STA_IF, pin_on=2, pin_cs=3, pin_dat=4, pin_clock=5, div_int=3) Signed-off-by: Peter Harper <[email protected]>
1 parent 5558411 commit 5b89972

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

ports/rp2/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,12 @@ set(MICROPY_SOURCE_QSTR
195195
${CMAKE_BINARY_DIR}/pins_${MICROPY_BOARD}.c
196196
)
197197

198+
if (MICROPY_PY_NETWORK_CYW43)
199+
list(APPEND MICROPY_SOURCE_QSTR
200+
${MICROPY_PORT_DIR}/rp2_network_cyw43.c
201+
)
202+
endif()
203+
198204
set(PICO_SDK_COMPONENTS
199205
boot_bootrom_headers
200206
hardware_adc
@@ -403,6 +409,7 @@ if (MICROPY_PY_NETWORK_CYW43)
403409

404410
list(APPEND MICROPY_SOURCE_PORT
405411
machine_pin_cyw43.c
412+
rp2_network_cyw43.c
406413
)
407414

408415
target_link_libraries(${MICROPY_TARGET}

ports/rp2/mpconfigport.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,10 @@ extern const struct _mp_obj_type_t mp_network_cyw43_type;
223223
{ MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(CYW43_LINK_NONET) }, \
224224
{ MP_ROM_QSTR(MP_QSTR_STAT_CONNECT_FAIL), MP_ROM_INT(CYW43_LINK_FAIL) }, \
225225
{ MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(CYW43_LINK_UP) },
226+
227+
// Override network_cyw43_make_new
228+
#define MICROPY_PY_NETWORK_CYW43_MAKE_NEW rp2_network_cyw43_make_new
229+
226230
#else
227231
#define MICROPY_HW_NIC_CYW43
228232
#endif

ports/rp2/mpnetworkport.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ void cyw43_irq_init(void) {
7777
NVIC_SetPriority(PendSV_IRQn, IRQ_PRI_PENDSV);
7878
}
7979

80+
void cyw43_irq_deinit(void) {
81+
gpio_remove_raw_irq_handler(CYW43_PIN_WL_HOST_WAKE, gpio_irq_handler);
82+
}
83+
8084
void cyw43_post_poll_hook(void) {
8185
cyw43_has_pending = 0;
8286
gpio_set_irq_enabled(CYW43_PIN_WL_HOST_WAKE, CYW43_IRQ_LEVEL, true);

ports/rp2/rp2_network_cyw43.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include "py/runtime.h"
2+
#include "extmod/network_cyw43.h"
3+
#include "extmod/modnetwork.h"
4+
#include "lib/cyw43-driver/src/cyw43.h"
5+
6+
void cyw43_irq_deinit(void);
7+
void cyw43_irq_init(void);
8+
9+
#if CYW43_PIN_WL_DYNAMIC
10+
// Defined in cyw43_bus_pio_spi.c
11+
extern int cyw43_set_pins_wl(uint pins[CYW43_PIN_INDEX_WL_COUNT]);
12+
#endif
13+
14+
#if CYW43_PIO_CLOCK_DIV_DYNAMIC
15+
// Defined in cyw43_bus_pio_spi.c
16+
extern void cyw43_set_pio_clock_divisor(uint16_t clock_div_int, uint8_t clock_div_frac);
17+
#endif
18+
19+
mp_obj_t rp2_network_cyw43_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
20+
enum { ARG_interface, ARG_pin_on, ARG_pin_out, ARG_pin_in, ARG_pin_wake, ARG_pin_clock, ARG_pin_cs, ARG_pin_dat, ARG_div_int, ARG_div_frac };
21+
static const mp_arg_t allowed_args[] = {
22+
{ MP_QSTR_interface, MP_ARG_INT, {.u_int = MOD_NETWORK_STA_IF} },
23+
#if CYW43_PIN_WL_DYNAMIC
24+
{ MP_QSTR_pin_on, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
25+
{ MP_QSTR_pin_out, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
26+
{ MP_QSTR_pin_in, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
27+
{ MP_QSTR_pin_wake, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
28+
{ MP_QSTR_pin_clock, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
29+
{ MP_QSTR_pin_cs, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
30+
{ MP_QSTR_pin_dat, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
31+
#endif
32+
#if CYW43_PIO_CLOCK_DIV_DYNAMIC
33+
{ MP_QSTR_div_int, MP_ARG_KW_ONLY | MP_ARG_INT, { .u_int = 0 } },
34+
{ MP_QSTR_div_frac, MP_ARG_KW_ONLY | MP_ARG_INT, { .u_int = 0 } },
35+
#endif
36+
};
37+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
38+
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
39+
40+
// Set the pins
41+
#if CYW43_PIN_WL_DYNAMIC
42+
#define SET_PIN_ARG(ARG_ENUM, DEFAULT) args[ARG_ENUM].u_obj != MP_OBJ_NULL ? mp_hal_get_pin_obj(args[ARG_ENUM].u_obj) : (DEFAULT)
43+
uint pins[CYW43_PIN_INDEX_WL_COUNT] = {
44+
SET_PIN_ARG(ARG_pin_on, CYW43_DEFAULT_PIN_WL_REG_ON),
45+
SET_PIN_ARG(ARG_pin_out, SET_PIN_ARG(ARG_pin_dat, CYW43_DEFAULT_PIN_WL_DATA_OUT)),
46+
SET_PIN_ARG(ARG_pin_in, SET_PIN_ARG(ARG_pin_dat, CYW43_DEFAULT_PIN_WL_DATA_IN)),
47+
SET_PIN_ARG(ARG_pin_wake, SET_PIN_ARG(ARG_pin_dat, CYW43_DEFAULT_PIN_WL_HOST_WAKE)),
48+
SET_PIN_ARG(ARG_pin_clock, CYW43_DEFAULT_PIN_WL_CLOCK),
49+
SET_PIN_ARG(ARG_pin_cs, CYW43_DEFAULT_PIN_WL_CS),
50+
};
51+
52+
// re-initialise cyw43
53+
cyw43_irq_deinit();
54+
cyw43_set_pins_wl(pins);
55+
cyw43_irq_init();
56+
#endif
57+
58+
#if CYW43_PIO_CLOCK_DIV_DYNAMIC
59+
// set the pio clock divisor
60+
if (args[ARG_div_int].u_int > 0) {
61+
cyw43_set_pio_clock_divisor((uint16_t)args[ARG_div_int].u_int, (uint16_t)args[ARG_div_frac].u_int);
62+
}
63+
#endif
64+
65+
if (n_args == 0 || mp_obj_get_int(all_args[ARG_interface]) == MOD_NETWORK_STA_IF) {
66+
return network_cyw43_get_interface(MOD_NETWORK_STA_IF);
67+
} else {
68+
return network_cyw43_get_interface(MOD_NETWORK_AP_IF);
69+
}
70+
}

0 commit comments

Comments
 (0)