Skip to content

Commit 9a47835

Browse files
committed
rp2: Support for dynamic pins.
Support configuring wireless on arbitrary GPIO pins.
1 parent 3a0028e commit 9a47835

File tree

4 files changed

+75
-0
lines changed

4 files changed

+75
-0
lines changed

ports/rp2/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ set(MICROPY_SOURCE_QSTR
193193
${MICROPY_PORT_DIR}/rp2_pio.c
194194
${MICROPY_PORT_DIR}/rp2_dma.c
195195
${CMAKE_BINARY_DIR}/pins_${MICROPY_BOARD}.c
196+
${MICROPY_PORT_DIR}/rp2_network_cyw43.c
196197
)
197198

198199
set(PICO_SDK_COMPONENTS
@@ -403,6 +404,7 @@ if (MICROPY_PY_NETWORK_CYW43)
403404

404405
list(APPEND MICROPY_SOURCE_PORT
405406
machine_pin_cyw43.c
407+
rp2_network_cyw43.c
406408
)
407409

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

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy