summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2019-06-01 16:11:03 +1000
committerDamien George <damien.p.george@gmail.com>2019-06-03 17:14:34 +1000
commit8b7409c295ff243699ed6fa6bab1e18659b064cd (patch)
treea7393302423ebd0e18d75108520c02c067d908d9
parent12ed6f91eeb1d338713b8ec189f6b0110a27dff0 (diff)
stm32: Integrate in the cyw43 driver and network.WLAN class.
Enable it by setting MICROPY_PY_NETWORK_CYW43=1 at the Makefile level.
-rw-r--r--ports/stm32/Makefile9
-rw-r--r--ports/stm32/extint.c10
-rw-r--r--ports/stm32/main.c12
-rw-r--r--ports/stm32/modnetwork.c21
-rw-r--r--ports/stm32/pendsv.h3
5 files changed, 55 insertions, 0 deletions
diff --git a/ports/stm32/Makefile b/ports/stm32/Makefile
index 943acd494..6a44ff30b 100644
--- a/ports/stm32/Makefile
+++ b/ports/stm32/Makefile
@@ -116,6 +116,7 @@ SRC_LIB = $(addprefix lib/,\
mp-readline/readline.c \
netutils/netutils.c \
netutils/trace.c \
+ netutils/dhcpserver.c \
timeutils/timeutils.c \
utils/pyexec.c \
utils/interrupt_char.c \
@@ -351,6 +352,14 @@ SRC_USBDEV = $(addprefix $(USBDEV_DIR)/,\
class/src/usbd_msc_data.c \
)
+ifeq ($(MICROPY_PY_NETWORK_CYW43),1)
+CFLAGS_MOD += -DMICROPY_PY_NETWORK_CYW43=1
+SRC_C += sdio.c
+EXTMOD_SRC_C += extmod/network_cyw43.c
+DRIVERS_SRC_C += drivers/cyw43/cyw43_ctrl.c drivers/cyw43/cyw43_lwip.c
+LIBS += $(TOP)/drivers/cyw43/libcyw43.a
+endif
+
ifneq ($(MICROPY_PY_WIZNET5K),0)
WIZNET5K_DIR=drivers/wiznet5k
INC += -I$(TOP)/$(WIZNET5K_DIR)
diff --git a/ports/stm32/extint.c b/ports/stm32/extint.c
index 1f147d42d..4a67d1824 100644
--- a/ports/stm32/extint.c
+++ b/ports/stm32/extint.c
@@ -31,6 +31,7 @@
#include "py/runtime.h"
#include "py/gc.h"
#include "py/mphal.h"
+#include "pendsv.h"
#include "pin.h"
#include "extint.h"
#include "irq.h"
@@ -613,6 +614,15 @@ void Handle_EXTI_Irq(uint32_t line) {
__HAL_GPIO_EXTI_CLEAR_FLAG(1 << line);
if (line < EXTI_NUM_VECTORS) {
mp_obj_t *cb = &MP_STATE_PORT(pyb_extint_callback)[line];
+ #if MICROPY_PY_NETWORK_CYW43 && defined(pyb_pin_WL_HOST_WAKE)
+ if (pyb_extint_callback_arg[line] == MP_OBJ_FROM_PTR(pyb_pin_WL_HOST_WAKE)) {
+ extern void (*cyw43_poll)(void);
+ if (cyw43_poll) {
+ pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll);
+ }
+ return;
+ }
+ #endif
if (*cb != mp_const_none) {
// If it's a soft IRQ handler then just schedule callback for later
if (!pyb_extint_hard_irq[line]) {
diff --git a/ports/stm32/main.c b/ports/stm32/main.c
index 02449a1b8..5bb425ddf 100644
--- a/ports/stm32/main.c
+++ b/ports/stm32/main.c
@@ -39,6 +39,7 @@
#if MICROPY_PY_LWIP
#include "lwip/init.h"
+#include "drivers/cyw43/cyw43.h"
#endif
#include "systick.h"
@@ -481,6 +482,17 @@ void stm32_main(uint32_t reset_mode) {
systick_enable_dispatch(SYSTICK_DISPATCH_LWIP, mod_network_lwip_poll_wrapper);
#endif
+ #if MICROPY_PY_NETWORK_CYW43
+ {
+ cyw43_init(&cyw43_state);
+ uint8_t buf[8];
+ memcpy(&buf[0], "PYBD", 4);
+ mp_hal_get_mac_ascii(MP_HAL_MAC_WLAN0, 8, 4, (char*)&buf[4]);
+ cyw43_wifi_ap_set_ssid(&cyw43_state, 8, buf);
+ cyw43_wifi_ap_set_password(&cyw43_state, 8, (const uint8_t*)"pybd0123");
+ }
+ #endif
+
#if defined(MICROPY_HW_UART_REPL)
// Set up a UART REPL using a statically allocated object
pyb_uart_repl_obj.base.type = &pyb_uart_type;
diff --git a/ports/stm32/modnetwork.c b/ports/stm32/modnetwork.c
index ea43f7557..9d97ad4a0 100644
--- a/ports/stm32/modnetwork.c
+++ b/ports/stm32/modnetwork.c
@@ -44,6 +44,8 @@
#include "lwip/timeouts.h"
#include "lwip/dns.h"
#include "lwip/dhcp.h"
+#include "extmod/network_cyw43.h"
+#include "drivers/cyw43/cyw43.h"
// Poll lwIP every 128ms
#define LWIP_TICK(tick) (((tick) & ~(SYSTICK_DISPATCH_NUM_SLOTS - 1) & 0x7f) == 0)
@@ -70,6 +72,16 @@ void mod_network_lwip_poll_wrapper(uint32_t ticks_ms) {
if (LWIP_TICK(ticks_ms)) {
pendsv_schedule_dispatch(PENDSV_DISPATCH_LWIP, pyb_lwip_poll);
}
+
+ #if MICROPY_PY_NETWORK_CYW43
+ if (cyw43_poll) {
+ if (cyw43_sleep != 0) {
+ if (--cyw43_sleep == 0) {
+ pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll);
+ }
+ }
+ }
+ #endif
}
#endif
@@ -119,6 +131,9 @@ STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = {
#if defined(MICROPY_HW_ETH_MDC)
{ MP_ROM_QSTR(MP_QSTR_LAN), MP_ROM_PTR(&network_lan_type) },
#endif
+ #if MICROPY_PY_NETWORK_CYW43
+ { MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&mp_network_cyw43_type) },
+ #endif
#if MICROPY_PY_WIZNET5K
{ MP_ROM_QSTR(MP_QSTR_WIZNET5K), MP_ROM_PTR(&mod_network_nic_type_wiznet5k) },
@@ -128,6 +143,12 @@ STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = {
#endif
{ MP_ROM_QSTR(MP_QSTR_route), MP_ROM_PTR(&network_route_obj) },
+
+ // Constants
+ #if MICROPY_PY_NETWORK_CYW43
+ { MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(CYW43_ITF_STA)},
+ { MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(CYW43_ITF_AP)},
+ #endif
};
STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table);
diff --git a/ports/stm32/pendsv.h b/ports/stm32/pendsv.h
index 18ae1d63e..6cbfe8b2e 100644
--- a/ports/stm32/pendsv.h
+++ b/ports/stm32/pendsv.h
@@ -29,6 +29,9 @@
enum {
#if MICROPY_PY_NETWORK && MICROPY_PY_LWIP
PENDSV_DISPATCH_LWIP,
+ #if MICROPY_PY_NETWORK_CYW43
+ PENDSV_DISPATCH_CYW43,
+ #endif
#endif
PENDSV_DISPATCH_MAX
};