|
| 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