|
| 1 | +#include"py/runtime.h" |
| 2 | +#include"extmod/network_cyw43.h" |
| 3 | +#include"extmod/modnetwork.h" |
| 4 | + |
| 5 | +voidcyw43_irq_deinit(void); |
| 6 | +voidcyw43_irq_init(void); |
| 7 | + |
| 8 | +#ifCYW43_PIN_WL_DYNAMIC |
| 9 | +// Defined in cyw43_bus_pio_spi.c |
| 10 | +externintcyw43_set_pins_wl(uintpins[CYW43_PIN_INDEX_WL_COUNT]); |
| 11 | +#endif |
| 12 | + |
| 13 | +#ifCYW43_PIO_CLOCK_DIV_DYNAMIC |
| 14 | +// Defined in cyw43_bus_pio_spi.c |
| 15 | +externvoidcyw43_set_pio_clock_divisor(uint16_tclock_div_int,uint8_tclock_div_frac); |
| 16 | +#endif |
| 17 | + |
| 18 | +mp_obj_trp2_network_cyw43_make_new(constmp_obj_type_t*type,size_tn_args,size_tn_kw,constmp_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 | +staticconstmp_arg_tallowed_args[]= { |
| 21 | + {MP_QSTR_interface,MP_ARG_INT, {.u_int=MOD_NETWORK_STA_IF} }, |
| 22 | +#ifCYW43_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 | +#ifCYW43_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_targs[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 | +#ifCYW43_PIN_WL_DYNAMIC |
| 40 | +uintpins[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 | +#ifCYW43_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 | +returnnetwork_cyw43_get_interface(MOD_NETWORK_STA_IF); |
| 62 | + }else { |
| 63 | +returnnetwork_cyw43_get_interface(MOD_NETWORK_AP_IF); |
| 64 | + } |
| 65 | +} |