diff --git a/docs/library/network.WLAN.rst b/docs/library/network.WLAN.rst index c673194700e59..d1e620ef09f9b 100644 --- a/docs/library/network.WLAN.rst +++ b/docs/library/network.WLAN.rst @@ -130,7 +130,7 @@ Methods hidden Whether SSID is hidden (boolean) security Security protocol supported (enumeration, see module constants) key Access key (string) - hostname The hostname that will be sent to DHCP (STA interfaces) and mDNS (if supported, both STA and AP) + hostname The hostname that will be sent to DHCP (STA interfaces) and mDNS (if supported, both STA and AP). (Deprecated, use :func:`network.hostname` instead) reconnects Number of reconnect attempts to make (integer, 0=none, -1=unlimited) txpower Maximum transmit power in dBm (integer or float) ============= =========== diff --git a/docs/library/network.rst b/docs/library/network.rst index 0a6f5506ea411..b13c84123ce7f 100644 --- a/docs/library/network.rst +++ b/docs/library/network.rst @@ -158,12 +158,39 @@ Network functions The following are functions available in the network module. +.. function:: country([code]) + + Get or set the two-letter ISO 3166-1 Alpha-2 country code to be used for + radio compliance. + + If the *code* parameter is provided, the country will be set to this value. + If the function is called without parameters, it returns the current + country. + + The default code ``"XX"`` represents the "worldwide" region. + +.. function:: hostname([name]) + + Get or set the hostname that will identify this device on the network. It is + applied to all interfaces. + + This hostname is used for: + * Sending to the DHCP server in the client request. (If using DHCP) + * Broadcasting via mDNS. (If enabled) + + If the *name* parameter is provided, the hostname will be set to this value. + If the function is called without parameters, it returns the current + hostname. + + The default hostname is typically the name of the board. + .. function:: phy_mode([mode]) Get or set the PHY mode. - If the *mode* parameter is provided, sets the mode to its value. If - the function is called without parameters, returns the current mode. + If the *mode* parameter is provided, the PHY mode will be set to this value. + If the function is called without parameters, it returns the current PHY + mode. The possible modes are defined as constants: * ``MODE_11B`` -- IEEE 802.11b, diff --git a/drivers/cyw43/cyw43.h b/drivers/cyw43/cyw43.h deleted file mode 100644 index 5ca4898318a3c..0000000000000 --- a/drivers/cyw43/cyw43.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef MICROPY_INCLUDED_STM32_CYW43_H -#define MICROPY_INCLUDED_STM32_CYW43_H - -#include "lwip/netif.h" -#include "lwip/dhcp.h" -#include "shared/netutils/dhcpserver.h" -#include "drivers/cyw43/cyw43_ll.h" - -// For trace_flags -#define CYW43_TRACE_ASYNC_EV (0x0001) -#define CYW43_TRACE_ETH_TX (0x0002) -#define CYW43_TRACE_ETH_RX (0x0004) -#define CYW43_TRACE_ETH_FULL (0x0008) -#define CYW43_TRACE_MAC (0x0010) - -// Return value of cyw43_wifi_link_status -#define CYW43_LINK_DOWN (0) -#define CYW43_LINK_JOIN (1) -#define CYW43_LINK_NOIP (2) -#define CYW43_LINK_UP (3) -#define CYW43_LINK_FAIL (-1) -#define CYW43_LINK_NONET (-2) -#define CYW43_LINK_BADAUTH (-3) - -#ifndef MICROPY_BOARD_HOSTNAME -#define MICROPY_BOARD_HOSTNAME "PYBD" -#endif - -#ifndef MICROPY_BOARD_HOSTNAME_LENGTH -#define MICROPY_BOARD_HOSTNAME_LENGTH 16 -#endif - -typedef struct _cyw43_t { - cyw43_ll_t cyw43_ll; - - uint8_t itf_state; - uint32_t trace_flags; - - // State for async events - volatile uint32_t wifi_scan_state; - uint32_t wifi_join_state; - void *wifi_scan_env; - int (*wifi_scan_cb)(void*, const cyw43_ev_scan_result_t*); - - // Pending things to do - bool pend_disassoc; - bool pend_rejoin; - bool pend_rejoin_wpa; - - // AP settings - uint8_t ap_channel; - uint8_t ap_auth; - uint8_t ap_ssid_len; - uint8_t ap_key_len; - uint8_t ap_ssid[32]; - uint8_t ap_key[64]; - - // lwIP data - struct netif netif[2]; - struct dhcp dhcp_client; - dhcp_server_t dhcp_server; - char hostname[MICROPY_BOARD_HOSTNAME_LENGTH]; -} cyw43_t; - -extern cyw43_t cyw43_state; -extern void (*cyw43_poll)(void); -extern uint32_t cyw43_sleep; - -void cyw43_init(cyw43_t *self); -void cyw43_deinit(cyw43_t *self); - -int cyw43_ioctl(cyw43_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface); -int cyw43_send_ethernet(cyw43_t *self, int itf, size_t len, const void *buf, bool is_pbuf); - -int cyw43_wifi_pm(cyw43_t *self, uint32_t pm); -int cyw43_wifi_link_status(cyw43_t *self, int itf); -void cyw43_wifi_set_up(cyw43_t *self, int itf, bool up); -int cyw43_wifi_get_mac(cyw43_t *self, int itf, uint8_t mac[6]); -int cyw43_wifi_scan(cyw43_t *self, cyw43_wifi_scan_options_t *opts, void *env, int (*result_cb)(void*, const cyw43_ev_scan_result_t*)); - -static inline bool cyw43_wifi_scan_active(cyw43_t *self) { - return self->wifi_scan_state == 1; -} - -int cyw43_wifi_join(cyw43_t *self, size_t ssid_len, const uint8_t *ssid, size_t key_len, const uint8_t *key, uint32_t auth_type, const uint8_t *bssid, uint32_t channel); -int cyw43_wifi_leave(cyw43_t *self, int itf); - -static inline void cyw43_wifi_ap_get_ssid(cyw43_t *self, size_t *len, const uint8_t **buf) { - *len = self->ap_ssid_len; - *buf = self->ap_ssid; -} - -static inline void cyw43_wifi_ap_set_channel(cyw43_t *self, uint32_t channel) { - self->ap_channel = channel; -} - -static inline void cyw43_wifi_ap_set_ssid(cyw43_t *self, size_t len, const uint8_t *buf) { - self->ap_ssid_len = MIN(len, sizeof(self->ap_ssid)); - memcpy(self->ap_ssid, buf, self->ap_ssid_len); -} - -static inline void cyw43_wifi_ap_set_password(cyw43_t *self, size_t len, const uint8_t *buf) { - self->ap_key_len = MIN(len, sizeof(self->ap_key)); - memcpy(self->ap_key, buf, self->ap_key_len); -} - -static inline void cyw43_wifi_ap_set_auth(cyw43_t *self, uint32_t auth) { - self->ap_auth = auth; -} - -void cyw43_wifi_ap_get_stas(cyw43_t *self, int *num_stas, uint8_t *macs); - -void cyw43_tcpip_init(cyw43_t *self, int itf); -void cyw43_tcpip_deinit(cyw43_t *self, int itf); -void cyw43_tcpip_set_link_up(cyw43_t *self, int itf); -void cyw43_tcpip_set_link_down(cyw43_t *self, int itf); -int cyw43_tcpip_link_status(cyw43_t *self, int itf); - -#endif // MICROPY_INCLUDED_STM32_CYW43_H diff --git a/drivers/cyw43/cyw43_ctrl.c b/drivers/cyw43/cyw43_ctrl.c deleted file mode 100644 index 73e6e5895779e..0000000000000 --- a/drivers/cyw43/cyw43_ctrl.c +++ /dev/null @@ -1,595 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include - -#include "py/mperrno.h" -#include "py/mphal.h" -#include "drivers/cyw43/cyw43.h" -#include "pendsv.h" -#include "sdio.h" - -#define CYW_ENTER MICROPY_PY_LWIP_ENTER -#define CYW_EXIT MICROPY_PY_LWIP_EXIT - -#ifdef pyb_pin_WL_HOST_WAKE -#define USE_SDIOIT (0) -#else -#define USE_SDIOIT (1) -#endif - -#define CYW43_SLEEP_MAX (50) - -#define WIFI_JOIN_STATE_ACTIVE (0x0001) -#define WIFI_JOIN_STATE_FAIL (0x0002) -#define WIFI_JOIN_STATE_NONET (0x0003) -#define WIFI_JOIN_STATE_BADAUTH (0x0004) -#define WIFI_JOIN_STATE_AUTH (0x0200) -#define WIFI_JOIN_STATE_LINK (0x0400) -#define WIFI_JOIN_STATE_KEYED (0x0800) -#define WIFI_JOIN_STATE_ALL (0x0e01) - -#define CYW43_STA_IS_ACTIVE(self) (((self)->itf_state >> CYW43_ITF_STA) & 1) -#define CYW43_AP_IS_ACTIVE(self) (((self)->itf_state >> CYW43_ITF_AP) & 1) - -cyw43_t cyw43_state; -void (*cyw43_poll)(void); -uint32_t cyw43_sleep; - -STATIC void cyw43_poll_func(void); -STATIC void cyw43_wifi_ap_init(cyw43_t *self); -STATIC void cyw43_wifi_ap_set_up(cyw43_t *self, bool up); - -static inline uint32_t cyw43_get_be16(const uint8_t *buf) { - return buf[0] << 8 | buf[1]; -} - -static inline uint32_t cyw43_get_be32(const uint8_t *buf) { - return buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]; -} - -static inline void cyw43_delay_ms(uint32_t ms) { - mp_hal_delay_ms(ms); -} - -/*******************************************************************************/ -// Initialisation and polling - -void cyw43_init(cyw43_t *self) { - #ifdef pyb_pin_WL_HOST_WAKE - mp_hal_pin_config(pyb_pin_WL_HOST_WAKE, MP_HAL_PIN_MODE_INPUT, MP_HAL_PIN_PULL_NONE, 0); - #endif - mp_hal_pin_config(pyb_pin_WL_REG_ON, MP_HAL_PIN_MODE_OUTPUT, MP_HAL_PIN_PULL_NONE, 0); - mp_hal_pin_low(pyb_pin_WL_REG_ON); - #ifdef pyb_pin_WL_RFSW_VDD - mp_hal_pin_config(pyb_pin_WL_RFSW_VDD, MP_HAL_PIN_MODE_OUTPUT, MP_HAL_PIN_PULL_NONE, 0); // RF-switch power - mp_hal_pin_low(pyb_pin_WL_RFSW_VDD); - #endif - - cyw43_ll_init(&self->cyw43_ll, self); - - self->itf_state = 0; - self->wifi_scan_state = 0; - self->wifi_join_state = 0; - self->pend_disassoc = false; - self->pend_rejoin= false; - self->pend_rejoin_wpa = false; - self->ap_channel = 3; - self->ap_ssid_len = 0; - self->ap_key_len = 0; - strncpy(self->hostname, MICROPY_BOARD_HOSTNAME, MICROPY_BOARD_HOSTNAME_LENGTH); - self->hostname[MICROPY_BOARD_HOSTNAME_LENGTH - 1] = 0; - - cyw43_poll = NULL; -} - -void cyw43_deinit(cyw43_t *self) { - if (cyw43_poll == NULL) { - return; - } - - CYW_ENTER - - // Stop the TCP/IP network interfaces. - cyw43_tcpip_deinit(self, 0); - cyw43_tcpip_deinit(self, 1); - - // Turn off the SDIO bus. - #if USE_SDIOIT - sdio_enable_irq(false); - #endif - sdio_deinit(); - - // Power off the WLAN chip and make sure all state is reset. - cyw43_init(self); - - CYW_EXIT -} - -STATIC int cyw43_ensure_up(cyw43_t *self) { - if (cyw43_poll != NULL) { - cyw43_ll_bus_sleep(&self->cyw43_ll, false); - return 0; - } - - CYW_ENTER - - // Disable the netif if it was previously up - cyw43_tcpip_deinit(self, CYW43_ITF_STA); - cyw43_tcpip_deinit(self, CYW43_ITF_AP); - self->itf_state = 0; - - // Reset and power up the WL chip - mp_hal_pin_low(pyb_pin_WL_REG_ON); - cyw43_delay_ms(20); - mp_hal_pin_high(pyb_pin_WL_REG_ON); - cyw43_delay_ms(50); - - // Initialise SDIO bus - // IRQ priority only needs to be higher than CYW_ENTER/EXIT protection (PENDSV) - sdio_init(NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 14, 0)); - - // Initialise the low-level driver - uint8_t mac[6]; - mp_hal_get_mac(MP_HAL_MAC_WLAN0, mac); - int ret = cyw43_ll_bus_init(&self->cyw43_ll, mac); - - if (ret != 0) { - CYW_EXIT - return ret; - } - - // Enable async events from low-level driver - cyw43_sleep = CYW43_SLEEP_MAX; - cyw43_poll = cyw43_poll_func; - #if USE_SDIOIT - sdio_enable_irq(true); - #else - extern void extint_set(const pin_obj_t *pin, uint32_t mode); - extint_set(pyb_pin_WL_HOST_WAKE, GPIO_MODE_IT_FALLING); - #endif - - CYW_EXIT - - return ret; -} - -// This function must always be executed at the level where CYW_ENTER is effectively active -STATIC void cyw43_poll_func(void) { - if (cyw43_poll == NULL) { - // Poll scheduled during deinit, just ignore it - return; - } - - cyw43_t *self = &cyw43_state; - cyw43_ll_process_packets(&self->cyw43_ll); - - if (self->pend_disassoc) { - self->pend_disassoc = false; - cyw43_ll_ioctl(&self->cyw43_ll, CYW43_IOCTL_SET_DISASSOC, 0, NULL, CYW43_ITF_STA); - } - - if (self->pend_rejoin_wpa) { - self->pend_rejoin_wpa = false; - cyw43_ll_wifi_set_wpa_auth(&self->cyw43_ll); - } - - if (self->pend_rejoin) { - self->pend_rejoin = false; - cyw43_ll_wifi_rejoin(&self->cyw43_ll); - self->wifi_join_state = WIFI_JOIN_STATE_ACTIVE; - } - - if (cyw43_sleep == 0) { - cyw43_ll_bus_sleep(&self->cyw43_ll, true); - #if !USE_SDIOIT - sdio_deinit(); // save power while WLAN bus sleeps - #endif - } - - #if USE_SDIOIT - sdio_enable_irq(true); - #endif -} - -/*******************************************************************************/ -// Callback interface to low-level driver - -int cyw43_cb_read_host_interrupt_pin(void *cb_data) { - #ifdef pyb_pin_WL_HOST_WAKE - return mp_hal_pin_read(pyb_pin_WL_HOST_WAKE); - #else - return mp_hal_pin_read(pyb_pin_WL_SDIO_1); - #endif -} - -void cyw43_cb_ensure_awake(void *cb_data) { - cyw43_sleep = CYW43_SLEEP_MAX; - #if !USE_SDIOIT - sdio_reenable(); - #endif -} - -STATIC const char *cyw43_async_event_name_table[89] = { - [0 ... 88] = NULL, - [CYW43_EV_SET_SSID] = "SET_SSID", - [CYW43_EV_JOIN] = "JOIN", - [CYW43_EV_AUTH] = "AUTH", - [CYW43_EV_DEAUTH_IND] = "DEAUTH_IND", - [CYW43_EV_ASSOC] = "ASSOC", - [CYW43_EV_DISASSOC] = "DISASSOC", - [CYW43_EV_DISASSOC_IND] = "DISASSOC_IND", - [CYW43_EV_LINK] = "LINK", - [CYW43_EV_PSK_SUP] = "PSK_SUP", - [CYW43_EV_ESCAN_RESULT] = "ESCAN_RESULT", - [CYW43_EV_CSA_COMPLETE_IND] = "CSA_COMPLETE_IND", - [CYW43_EV_ASSOC_REQ_IE] = "ASSOC_REQ_IE", - [CYW43_EV_ASSOC_RESP_IE] = "ASSOC_RESP_IE", -}; - -STATIC void cyw43_dump_async_event(const cyw43_async_event_t *ev) { - printf("[% 8d] ASYNC(%04x,", - (int)mp_hal_ticks_ms(), - (unsigned int)ev->flags - ); - if (ev->event_type < MP_ARRAY_SIZE(cyw43_async_event_name_table) - && cyw43_async_event_name_table[ev->event_type] != NULL) { - printf("%s", cyw43_async_event_name_table[ev->event_type]); - } else { - printf("%u", (unsigned int)ev->event_type); - } - printf(",%u,%u,%u)\n", - (unsigned int)ev->status, - (unsigned int)ev->reason, - (unsigned int)ev->interface - ); -} - -void cyw43_cb_process_async_event(void *cb_data, const cyw43_async_event_t *ev) { - cyw43_t *self = cb_data; - - if (self->trace_flags & CYW43_TRACE_ASYNC_EV) { - cyw43_dump_async_event(ev); - } - - if (ev->event_type == CYW43_EV_ESCAN_RESULT && self->wifi_scan_state == 1) { - // Escan result event - if (ev->status == 8) { - // Partial result - int ret = self->wifi_scan_cb(self->wifi_scan_env, &ev->u.scan_result); - if (ret != 0) { - // TODO need to abort scan, or just ignore any more results - } - } else if (ev->status == 0) { - // Scan complete - self->wifi_scan_state = 2; - } - - } else if (ev->event_type == CYW43_EV_DISASSOC) { - cyw43_tcpip_set_link_down(self, CYW43_ITF_STA); - self->wifi_join_state = 0x0000; - - /* - } else if (ev->event_type == CYW43_EV_DISASSOC_IND) { - if (ev->interface == CYW43_ITF_AP) { - // Station disassociated with our AP, let DHCP server know so it can free the IP address - dhcp_server_disassoc(&self->dhcp_server, buf + 24); - } - */ - - // WiFi join events - } else if (ev->event_type == CYW43_EV_PRUNE) { - if (ev->status == 0 && ev->reason == 8) { - // RSN mismatch, retry join with WPA auth - self->pend_rejoin = true; - self->pend_rejoin_wpa = true; - pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll_func); - } - } else if (ev->event_type == CYW43_EV_SET_SSID) { - if (ev->status == 0) { - // Success setting SSID - } else if (ev->status == 3 && ev->reason == 0) { - self->wifi_join_state = WIFI_JOIN_STATE_NONET; - // No matching SSID found (could be out of range, or down) - } else { - // Other failure setting SSID - self->wifi_join_state = WIFI_JOIN_STATE_FAIL; - } - } else if (ev->event_type == CYW43_EV_AUTH) { - if (ev->status == 0) { - self->wifi_join_state |= WIFI_JOIN_STATE_AUTH; - } else if (ev->status == 6) { - // Unsolicited auth packet, ignore it - } else { - // Cannot authenticate - self->wifi_join_state = WIFI_JOIN_STATE_BADAUTH; - } - } else if (ev->event_type == CYW43_EV_DEAUTH_IND) { - if (ev->status == 0 && ev->reason == 2) { - // Deauth, probably because password was wrong; disassociate - self->pend_disassoc = true; - pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll_func); - } - } else if (ev->event_type == CYW43_EV_LINK) { - if (ev->status == 0) { - if (ev->flags & 1) { - // Link is up - if (ev->interface == CYW43_ITF_STA) { - self->wifi_join_state |= WIFI_JOIN_STATE_LINK; - } else { - cyw43_tcpip_set_link_up(self, ev->interface); - } - } else { - // Link is down - cyw43_tcpip_set_link_down(self, ev->interface); - } - } - } else if (ev->event_type == CYW43_EV_PSK_SUP) { - if (ev->status == 6) { // WLC_SUP_KEYED - self->wifi_join_state |= WIFI_JOIN_STATE_KEYED; - } else if ((ev->status == 4 || ev->status == 8 || ev->status == 11) && ev->reason == 15) { - // Timeout waiting for key exchange M1/M3/G1 - // Probably at edge of the cell, retry - self->pend_rejoin = true; - pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, cyw43_poll_func); - } else { - // PSK_SUP failure - self->wifi_join_state = WIFI_JOIN_STATE_BADAUTH; - } - } - - if (self->wifi_join_state == WIFI_JOIN_STATE_ALL) { - // STA connected - self->wifi_join_state = WIFI_JOIN_STATE_ACTIVE; - cyw43_tcpip_set_link_up(self, CYW43_ITF_STA); - } -} - -/*******************************************************************************/ -// Ioctl and Ethernet interface - -int cyw43_ioctl(cyw43_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface) { - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - CYW_ENTER - ret = cyw43_ll_ioctl(&self->cyw43_ll, cmd, len, buf, iface); - CYW_EXIT - - return ret; -} - -int cyw43_send_ethernet(cyw43_t *self, int itf, size_t len, const void *buf, bool is_pbuf) { - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - CYW_ENTER - ret = cyw43_ll_send_ethernet(&self->cyw43_ll, itf, len, buf, is_pbuf); - CYW_EXIT - - return ret; -} - -/*******************************************************************************/ -// WiFi control - -STATIC int cyw43_wifi_on(cyw43_t *self, uint32_t country) { - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - #ifdef pyb_pin_WL_RFSW_VDD - // Turn the RF-switch on - mp_hal_pin_high(pyb_pin_WL_RFSW_VDD); - #endif - - CYW_ENTER - ret = cyw43_ll_wifi_on(&self->cyw43_ll, country); - CYW_EXIT - - return ret; -} - -int cyw43_wifi_pm(cyw43_t *self, uint32_t pm_in) { - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - // pm_in: 0x00adbrrm - uint32_t pm = pm_in & 0xf; - uint32_t pm_sleep_ret = (pm_in >> 4) & 0xff; - uint32_t li_bcn = (pm_in >> 12) & 0xf; - uint32_t li_dtim = (pm_in >> 16) & 0xf; - uint32_t li_assoc = (pm_in >> 20) & 0xf; - - CYW_ENTER - ret = cyw43_ll_wifi_pm(&self->cyw43_ll, pm, pm_sleep_ret, li_bcn, li_dtim, li_assoc); - CYW_EXIT - - return ret; -} - -int cyw43_wifi_get_mac(cyw43_t *self, int itf, uint8_t mac[6]) { - mp_hal_get_mac(MP_HAL_MAC_WLAN0, &mac[0]); - return 0; -} - -#define MAKE_COUNTRY(a, b, rev) ((a) | (b) << 8 | (rev) << 16) - -void cyw43_wifi_set_up(cyw43_t *self, int itf, bool up) { - if (up) { - if (self->itf_state == 0) { - uint32_t country; - extern char pyb_country_code[2]; - if (pyb_country_code[0] == '\0' || pyb_country_code[1] == '\0') { - country = MAKE_COUNTRY('X', 'X', 17); // default to world-wide (passive ch 12-14) - } else { - country = MAKE_COUNTRY(pyb_country_code[0], pyb_country_code[1], 0); - } - if (cyw43_wifi_on(self, country) != 0) { - return; - } - cyw43_wifi_pm(self, 10 << 20 | 1 << 16 | 1 << 12 | 20 << 4 | 2); - } - if (itf == CYW43_ITF_AP) { - cyw43_wifi_ap_init(self); - cyw43_wifi_ap_set_up(self, true); - } - if ((self->itf_state & (1 << itf)) == 0) { - CYW_ENTER - cyw43_tcpip_deinit(self, itf); - cyw43_tcpip_init(self, itf); - self->itf_state |= 1 << itf; - CYW_EXIT - } - } else { - if (itf == CYW43_ITF_AP) { - cyw43_wifi_ap_set_up(self, false); - } - } -} - -int cyw43_wifi_scan(cyw43_t *self, cyw43_wifi_scan_options_t *opts, void *env, int (*result_cb)(void*, const cyw43_ev_scan_result_t*)) { - if (self->itf_state == 0) { - return -MP_EPERM; - } - - cyw43_ensure_up(self); - - CYW_ENTER - - // Set state and callback data - self->wifi_scan_state = 1; - self->wifi_scan_env = env; - self->wifi_scan_cb = result_cb; - - // Start the scan - int ret = cyw43_ll_wifi_scan(&self->cyw43_ll, opts); - - CYW_EXIT - - return ret; -} - -int cyw43_wifi_link_status(cyw43_t *self, int itf) { - if (itf == CYW43_ITF_STA) { - int s = self->wifi_join_state & 0xf; - if (s == WIFI_JOIN_STATE_ACTIVE) { - return CYW43_LINK_JOIN; - } else if (s == WIFI_JOIN_STATE_FAIL) { - return CYW43_LINK_FAIL; - } else if (s == WIFI_JOIN_STATE_NONET) { - return CYW43_LINK_NONET; - } else if (s == WIFI_JOIN_STATE_BADAUTH) { - return CYW43_LINK_BADAUTH; - } else { - return CYW43_LINK_DOWN; - } - } else { - return CYW43_LINK_DOWN; - } -} - -/*******************************************************************************/ -// WiFi STA - -int cyw43_wifi_join(cyw43_t *self, size_t ssid_len, const uint8_t *ssid, size_t key_len, const uint8_t *key, uint32_t auth_type, const uint8_t *bssid, uint32_t channel) { - if (!CYW43_STA_IS_ACTIVE(self)) { - return -MP_EPERM; - } - - int ret = cyw43_ensure_up(self); - if (ret) { - return ret; - } - - CYW_ENTER - - ret = cyw43_ll_wifi_join(&self->cyw43_ll, ssid_len, ssid, key_len, key, auth_type, bssid, channel); - - if (ret == 0) { - // Wait for responses: EV_AUTH, EV_LINK, EV_SET_SSID, EV_PSK_SUP - // Will get EV_DEAUTH_IND if password is invalid - self->wifi_join_state = WIFI_JOIN_STATE_ACTIVE; - - if (auth_type == 0) { - // For open security we don't need EV_PSK_SUP, so set that flag indicator now - self->wifi_join_state |= WIFI_JOIN_STATE_KEYED; - } - } - - CYW_EXIT - - return ret; -} - -int cyw43_wifi_leave(cyw43_t *self, int itf) { - // Disassociate with SSID - return cyw43_ioctl(self, CYW43_IOCTL_SET_DISASSOC, 0, NULL, itf); -} - -/*******************************************************************************/ -// WiFi AP - -STATIC void cyw43_wifi_ap_init(cyw43_t *self) { - int ret = cyw43_ensure_up(self); - if (ret) { - return; - } - - CYW_ENTER - cyw43_ll_wifi_ap_init(&self->cyw43_ll, self->ap_ssid_len, self->ap_ssid, self->ap_auth, self->ap_key_len, self->ap_key, self->ap_channel); - CYW_EXIT -} - -STATIC void cyw43_wifi_ap_set_up(cyw43_t *self, bool up) { - int ret = cyw43_ensure_up(self); - if (ret) { - return; - } - - CYW_ENTER - cyw43_ll_wifi_ap_set_up(&self->cyw43_ll, up); - CYW_EXIT -} - -void cyw43_wifi_ap_get_stas(cyw43_t *self, int *num_stas, uint8_t *macs) { - int ret = cyw43_ensure_up(self); - if (ret) { - return; - } - - CYW_ENTER - cyw43_ll_wifi_ap_get_stas(&self->cyw43_ll, num_stas, macs); - CYW_EXIT -} diff --git a/drivers/cyw43/cyw43_ll.h b/drivers/cyw43/cyw43_ll.h deleted file mode 100644 index 879367a2edd9e..0000000000000 --- a/drivers/cyw43/cyw43_ll.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef MICROPY_INCLUDED_STM32_CYW43_LL_H -#define MICROPY_INCLUDED_STM32_CYW43_LL_H - -// IOCTL commands -#define CYW43_IOCTL_GET_SSID (0x32) -#define CYW43_IOCTL_GET_CHANNEL (0x3a) -#define CYW43_IOCTL_SET_DISASSOC (0x69) -#define CYW43_IOCTL_GET_ANTDIV (0x7e) -#define CYW43_IOCTL_SET_ANTDIV (0x81) -#define CYW43_IOCTL_SET_MONITOR (0xd9) -#define CYW43_IOCTL_GET_VAR (0x20c) -#define CYW43_IOCTL_SET_VAR (0x20f) - -// Async events, event_type field -#define CYW43_EV_SET_SSID (0) -#define CYW43_EV_JOIN (1) -#define CYW43_EV_AUTH (3) -#define CYW43_EV_DEAUTH_IND (6) -#define CYW43_EV_ASSOC (7) -#define CYW43_EV_DISASSOC (11) -#define CYW43_EV_DISASSOC_IND (12) -#define CYW43_EV_LINK (16) -#define CYW43_EV_PRUNE (23) -#define CYW43_EV_PSK_SUP (46) -#define CYW43_EV_ESCAN_RESULT (69) -#define CYW43_EV_CSA_COMPLETE_IND (80) -#define CYW43_EV_ASSOC_REQ_IE (87) -#define CYW43_EV_ASSOC_RESP_IE (88) - -enum { - CYW43_ITF_STA, - CYW43_ITF_AP, -}; - -typedef struct _cyw43_ev_scan_result_t { - uint32_t _0[5]; - uint8_t bssid[6]; - uint16_t _1[2]; - uint8_t ssid_len; - uint8_t ssid[32]; - uint32_t _2[5]; - uint16_t channel; - uint16_t _3; - uint8_t auth_mode; - int16_t rssi; -} cyw43_ev_scan_result_t; - -typedef struct _cyw43_async_event_t { - uint16_t _0; - uint16_t flags; - uint32_t event_type; - uint32_t status; - uint32_t reason; - uint8_t _1[30]; - uint8_t interface; - uint8_t _2; - union { - cyw43_ev_scan_result_t scan_result; - } u; -} cyw43_async_event_t; - -typedef struct _cyw43_wifi_scan_options_t { - uint32_t version; - uint16_t action; - uint16_t _; - uint32_t ssid_len; // 0 to select all - uint8_t ssid[32]; - uint8_t bssid[6]; - int8_t bss_type; // fill with 0xff to select all - int8_t scan_type; // 0=active, 1=passive - int32_t nprobes; - int32_t active_time; - int32_t passive_time; - int32_t home_time; - int32_t channel_num; - uint16_t channel_list[1]; -} cyw43_wifi_scan_options_t; - -typedef struct _cyw43_ll_t { - uint32_t opaque[528]; -} cyw43_ll_t; - -void cyw43_ll_init(cyw43_ll_t *self, void *cb_data); -void cyw43_ll_deinit(cyw43_ll_t *self); - -int cyw43_ll_bus_init(cyw43_ll_t *self, const uint8_t *mac); -void cyw43_ll_bus_sleep(cyw43_ll_t *self, bool can_sleep); -void cyw43_ll_process_packets(cyw43_ll_t *self); -int cyw43_ll_ioctl(cyw43_ll_t *self, uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface); -int cyw43_ll_send_ethernet(cyw43_ll_t *self, int itf, size_t len, const void *buf, bool is_pbuf); - -int cyw43_ll_wifi_on(cyw43_ll_t *self, uint32_t country); -int cyw43_ll_wifi_pm(cyw43_ll_t *self, uint32_t pm, uint32_t pm_sleep_ret, uint32_t li_bcn, uint32_t li_dtim, uint32_t li_assoc); -int cyw43_ll_wifi_scan(cyw43_ll_t *self, cyw43_wifi_scan_options_t *opts); - -int cyw43_ll_wifi_join(cyw43_ll_t *self, size_t ssid_len, const uint8_t *ssid, size_t key_len, const uint8_t *key, uint32_t auth_type, const uint8_t *bssid, uint32_t channel); -void cyw43_ll_wifi_set_wpa_auth(cyw43_ll_t *self); -void cyw43_ll_wifi_rejoin(cyw43_ll_t *self); - -int cyw43_ll_wifi_ap_init(cyw43_ll_t *self, size_t ssid_len, const uint8_t *ssid, uint32_t auth, size_t key_len, const uint8_t *key, uint32_t channel); -int cyw43_ll_wifi_ap_set_up(cyw43_ll_t *self, bool up); -int cyw43_ll_wifi_ap_get_stas(cyw43_ll_t *self, int *num_stas, uint8_t *macs); - -// Callbacks to be provided by mid-level interface -int cyw43_cb_read_host_interrupt_pin(void *cb_data); -void cyw43_cb_ensure_awake(void *cb_data); -void cyw43_cb_process_async_event(void *cb_data, const cyw43_async_event_t *ev); -void cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len, const uint8_t *buf); - -#endif // MICROPY_INCLUDED_STM32_CYW43_LL_H diff --git a/drivers/cyw43/cyw43_lwip.c b/drivers/cyw43/cyw43_lwip.c deleted file mode 100644 index f12a378c5da6d..0000000000000 --- a/drivers/cyw43/cyw43_lwip.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 Damien P. George - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include - -#include "py/mphal.h" -#include "shared/netutils/netutils.h" -#include "lwip/etharp.h" -#include "lwip/dns.h" -#include "lwip/apps/mdns.h" -#include "drivers/cyw43/cyw43.h" - -STATIC void cyw43_ethernet_trace(cyw43_t *self, struct netif *netif, size_t len, const void *data, unsigned int flags) { - bool is_tx = flags & NETUTILS_TRACE_IS_TX; - if ((is_tx && (self->trace_flags & CYW43_TRACE_ETH_TX)) - || (!is_tx && (self->trace_flags & CYW43_TRACE_ETH_RX))) { - const uint8_t *buf; - if (len == (size_t)-1) { - // data is a pbuf - const struct pbuf *pbuf = data; - buf = pbuf->payload; - len = pbuf->len; // restricted to print only the first chunk of the pbuf - } else { - // data is actual data buffer - buf = data; - } - - if (self->trace_flags & CYW43_TRACE_MAC) { - printf("[% 8d] ETH%cX itf=%c%c len=%u", (int)mp_hal_ticks_ms(), is_tx ? 'T' : 'R', netif->name[0], netif->name[1], len); - printf(" MAC type=%d subtype=%d data=", buf[0] >> 2 & 3, buf[0] >> 4); - for (size_t i = 0; i < len; ++i) { - printf(" %02x", buf[i]); - } - printf("\n"); - return; - } - - if (self->trace_flags & CYW43_TRACE_ETH_FULL) { - flags |= NETUTILS_TRACE_PAYLOAD; - } - netutils_ethernet_trace(MP_PYTHON_PRINTER, len, buf, flags); - } -} - -STATIC err_t cyw43_netif_output(struct netif *netif, struct pbuf *p) { - cyw43_t *self = netif->state; - if (self->trace_flags != 0) { - cyw43_ethernet_trace(self, netif, (size_t)-1, p, NETUTILS_TRACE_IS_TX | NETUTILS_TRACE_NEWLINE); - } - int itf = netif->name[1] - '0'; - int ret = cyw43_send_ethernet(self, itf, p->tot_len, (void*)p, true); - if (ret) { - printf("[CYW43] send_ethernet failed: %d\n", ret); - return ERR_IF; - } - return ERR_OK; -} - -STATIC err_t cyw43_netif_init(struct netif *netif) { - netif->linkoutput = cyw43_netif_output; - netif->output = etharp_output; - netif->mtu = 1500; - netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP; - cyw43_wifi_get_mac(netif->state, netif->name[1] - '0', netif->hwaddr); - netif->hwaddr_len = sizeof(netif->hwaddr); - return ERR_OK; -} - -void cyw43_tcpip_init(cyw43_t *self, int itf) { - ip_addr_t ipconfig[4]; - #if LWIP_IPV6 - #define IP(x) ((x).u_addr.ip4) - #else - #define IP(x) (x) - #endif - if (itf == 0) { - // need to zero out to get isconnected() working - IP4_ADDR(&IP(ipconfig[0]), 0, 0, 0, 0); - IP4_ADDR(&IP(ipconfig[2]), 192, 168, 0, 1); - } else { - IP4_ADDR(&IP(ipconfig[0]), 192, 168, 4, 1); - IP4_ADDR(&IP(ipconfig[2]), 192, 168, 4, 1); - } - IP4_ADDR(&IP(ipconfig[1]), 255, 255, 255, 0); - IP4_ADDR(&IP(ipconfig[3]), 8, 8, 8, 8); - #undef IP - - struct netif *n = &self->netif[itf]; - n->name[0] = 'w'; - n->name[1] = '0' + itf; - #if LWIP_IPV6 - netif_add(n, &ipconfig[0].u_addr.ip4, &ipconfig[1].u_addr.ip4, &ipconfig[2].u_addr.ip4, self, cyw43_netif_init, ethernet_input); - #else - netif_add(n, &ipconfig[0], &ipconfig[1], &ipconfig[2], self, cyw43_netif_init, netif_input); - #endif - netif_set_hostname(n, self->hostname); - netif_set_default(n); - netif_set_up(n); - - if (itf == CYW43_ITF_STA) { - dns_setserver(0, &ipconfig[3]); - dhcp_set_struct(n, &self->dhcp_client); - dhcp_start(n); - } else { - dhcp_server_init(&self->dhcp_server, &ipconfig[0], &ipconfig[1]); - } - - #if LWIP_MDNS_RESPONDER - // TODO better to call after IP address is set - char mdns_hostname[9]; - int len = MIN(strlen(self->hostname), 4); - memcpy(&mdns_hostname[0], self->hostname, len); - mp_hal_get_mac_ascii(MP_HAL_MAC_WLAN0, 4 + len, 8 - len, &mdns_hostname[len]); - mdns_hostname[8] = '\0'; - mdns_resp_add_netif(n, mdns_hostname, 60); - #endif -} - -void cyw43_tcpip_deinit(cyw43_t *self, int itf) { - struct netif *n = &self->netif[itf]; - if (itf == CYW43_ITF_STA) { - dhcp_stop(n); - } else { - dhcp_server_deinit(&self->dhcp_server); - } - #if LWIP_MDNS_RESPONDER - mdns_resp_remove_netif(n); - #endif - for (struct netif *netif = netif_list; netif != NULL; netif = netif->next) { - if (netif == n) { - netif_remove(netif); - netif->ip_addr.addr = 0; - netif->flags = 0; - } - } -} - -void cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len, const uint8_t *buf) { - cyw43_t *self = cb_data; - struct netif *netif = &self->netif[itf]; - if (self->trace_flags) { - cyw43_ethernet_trace(self, netif, len, buf, NETUTILS_TRACE_NEWLINE); - } - if (netif->flags & NETIF_FLAG_LINK_UP) { - struct pbuf *p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); - if (p != NULL) { - pbuf_take(p, buf, len); - if (netif->input(p, netif) != ERR_OK) { - pbuf_free(p); - } - } - } -} - -void cyw43_tcpip_set_link_up(cyw43_t *self, int itf) { - netif_set_link_up(&self->netif[itf]); -} - -void cyw43_tcpip_set_link_down(cyw43_t *self, int itf) { - netif_set_link_down(&self->netif[itf]); -} - -int cyw43_tcpip_link_status(cyw43_t *self, int itf) { - struct netif *netif = &self->netif[itf]; - if ((netif->flags & (NETIF_FLAG_UP | NETIF_FLAG_LINK_UP)) - == (NETIF_FLAG_UP | NETIF_FLAG_LINK_UP)) { - if (netif->ip_addr.addr != 0) { - return CYW43_LINK_UP; - } else { - return CYW43_LINK_NOIP; - } - } else { - return cyw43_wifi_link_status(self, itf); - } -} diff --git a/drivers/cyw43/cywbt.c b/drivers/cyw43/cywbt.c index e394e02b33f9e..d0e0aac009c7b 100644 --- a/drivers/cyw43/cywbt.c +++ b/drivers/cyw43/cywbt.c @@ -35,8 +35,7 @@ #if MICROPY_PY_NETWORK_CYW43 -extern const char fw_4343WA1_7_45_98_50_start; -#define CYWBT_FW_ADDR (&fw_4343WA1_7_45_98_50_start + 749 * 512 + 29 * 256) +#include "lib/cyw43-driver/firmware/cyw43_btfw_4343A1.h" // Provided by the port. extern pyb_uart_obj_t mp_bluetooth_hci_uart_obj; @@ -195,7 +194,7 @@ int mp_bluetooth_hci_controller_init(void) { cywbt_set_baudrate(MICROPY_HW_BLE_UART_BAUDRATE_SECONDARY); mp_bluetooth_hci_uart_set_baudrate(MICROPY_HW_BLE_UART_BAUDRATE_SECONDARY); - cywbt_download_firmware((const uint8_t*)CYWBT_FW_ADDR); + cywbt_download_firmware((const uint8_t*)&cyw43_btfw_4343A1[0]); // Reset cywbt_hci_cmd(0x03, 0x0003, 0, NULL); diff --git a/drivers/cyw43/libcyw43.a b/drivers/cyw43/libcyw43.a deleted file mode 100644 index 7d0ff93dcbe68..0000000000000 Binary files a/drivers/cyw43/libcyw43.a and /dev/null differ diff --git a/extmod/extmod.cmake b/extmod/extmod.cmake index ed7d16d1b5ca9..0e5ed942260f0 100644 --- a/extmod/extmod.cmake +++ b/extmod/extmod.cmake @@ -37,6 +37,10 @@ set(MICROPY_SOURCE_EXTMOD ${MICROPY_EXTMOD_DIR}/moduwebsocket.c ${MICROPY_EXTMOD_DIR}/moduzlib.c ${MICROPY_EXTMOD_DIR}/modwebrepl.c + ${MICROPY_EXTMOD_DIR}/network_cyw43.c + ${MICROPY_EXTMOD_DIR}/network_lwip.c + ${MICROPY_EXTMOD_DIR}/network_ninaw10.c + ${MICROPY_EXTMOD_DIR}/network_wiznet5k.c ${MICROPY_EXTMOD_DIR}/uos_dupterm.c ${MICROPY_EXTMOD_DIR}/utime_mphal.c ${MICROPY_EXTMOD_DIR}/vfs.c diff --git a/extmod/extmod.mk b/extmod/extmod.mk index 08138ead56a17..5aecedc2281b2 100644 --- a/extmod/extmod.mk +++ b/extmod/extmod.mk @@ -37,6 +37,7 @@ SRC_EXTMOD_C += \ extmod/moduzlib.c \ extmod/modwebrepl.c \ extmod/network_cyw43.c \ + extmod/network_lwip.c \ extmod/network_ninaw10.c \ extmod/network_wiznet5k.c \ extmod/uos_dupterm.c \ @@ -300,11 +301,23 @@ endif # networking ifeq ($(MICROPY_PY_NETWORK_CYW43),1) +CYW43_DIR = lib/cyw43-driver +GIT_SUBMODULES += $(CYW43_DIR) CFLAGS_EXTMOD += -DMICROPY_PY_NETWORK_CYW43=1 -DRIVERS_SRC_C += drivers/cyw43/cyw43_ctrl.c drivers/cyw43/cyw43_lwip.c -LIBS += $(TOP)/drivers/cyw43/libcyw43.a +SRC_THIRDPARTY_C += $(addprefix $(CYW43_DIR)/src/,\ + cyw43_ctrl.c \ + cyw43_lwip.c \ + cyw43_ll.c \ + cyw43_sdio.c \ + cyw43_stats.c \ + ) +ifeq ($(MICROPY_PY_BLUETOOTH),1) +DRIVERS_SRC_C += drivers/cyw43/cywbt.c endif +$(BUILD)/$(CYW43_DIR)/src/cyw43_%.o: CFLAGS += -std=c11 +endif # MICROPY_PY_NETWORK_CYW43 + ifneq ($(MICROPY_PY_NETWORK_WIZNET5K),) ifneq ($(MICROPY_PY_NETWORK_WIZNET5K),0) WIZNET5K_DIR=lib/wiznet5k diff --git a/extmod/modnetwork.c b/extmod/modnetwork.c index d5c8f83ea4718..7c1b91de45d04 100644 --- a/extmod/modnetwork.c +++ b/extmod/modnetwork.c @@ -37,23 +37,29 @@ #include "shared/netutils/netutils.h" #include "modnetwork.h" -#if MICROPY_PY_LWIP -#include "lwip/netif.h" -#include "lwip/timeouts.h" -#include "lwip/dns.h" -#include "lwip/dhcp.h" -#include "lwip/apps/mdns.h" -#endif - -#if MICROPY_PY_NETWORK_CYW43 && MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER +#if MICROPY_PY_NETWORK_CYW43 // So that CYW43_LINK_xxx constants are available to MICROPY_PORT_NETWORK_INTERFACES. #include "lib/cyw43-driver/src/cyw43.h" #endif +#ifdef MICROPY_PY_NETWORK_INCLUDEFILE +#include MICROPY_PY_NETWORK_INCLUDEFILE +#endif + /// \module network - network configuration /// /// This module provides network drivers and routing configuration. +char mod_network_country_code[2] = "XX"; + +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#error "MICROPY_PY_NETWORK_HOSTNAME_DEFAULT must be set in mpconfigport.h or mpconfigboard.h" +#endif + +char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN] = MICROPY_PY_NETWORK_HOSTNAME_DEFAULT; + +#ifdef MICROPY_PORT_NETWORK_INTERFACES + void mod_network_init(void) { mp_obj_list_init(&MP_STATE_PORT(mod_network_nic_list), 0); } @@ -89,16 +95,61 @@ STATIC mp_obj_t network_route(void) { } STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_route_obj, network_route); +MP_REGISTER_ROOT_POINTER(mp_obj_list_t mod_network_nic_list); + +#endif // MICROPY_PORT_NETWORK_INTERFACES + +STATIC mp_obj_t network_country(size_t n_args, const mp_obj_t *args) { + if (n_args == 0) { + return mp_obj_new_str(mod_network_country_code, 2); + } else { + size_t len; + const char *str = mp_obj_str_get_data(args[0], &len); + if (len != 2) { + mp_raise_ValueError(NULL); + } + mod_network_country_code[0] = str[0]; + mod_network_country_code[1] = str[1]; + return mp_const_none; + } +} +// TODO: Non-static to allow backwards-compatible pyb.country. +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj, 0, 1, network_country); + +STATIC mp_obj_t network_hostname(size_t n_args, const mp_obj_t *args) { + if (n_args == 0) { + return mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname)); + } else { + size_t len; + const char *str = mp_obj_str_get_data(args[0], &len); + if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + mp_raise_ValueError(NULL); + } + strcpy(mod_network_hostname, str); + return mp_const_none; + } +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_hostname_obj, 0, 1, network_hostname); + STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) }, - { MP_ROM_QSTR(MP_QSTR_route), MP_ROM_PTR(&network_route_obj) }, + { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&mod_network_country_obj) }, + { MP_ROM_QSTR(MP_QSTR_hostname), MP_ROM_PTR(&mod_network_hostname_obj) }, // Defined per port in mpconfigport.h + #ifdef MICROPY_PORT_NETWORK_INTERFACES + { MP_ROM_QSTR(MP_QSTR_route), MP_ROM_PTR(&network_route_obj) }, MICROPY_PORT_NETWORK_INTERFACES + #endif + // Allow a port to take mostly full control of the network module. + #ifdef MICROPY_PY_NETWORK_MODULE_GLOBALS_INCLUDEFILE + #include MICROPY_PY_NETWORK_MODULE_GLOBALS_INCLUDEFILE + #else // Constants { MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(MOD_NETWORK_STA_IF) }, { MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(MOD_NETWORK_AP_IF) }, + #endif }; STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table); @@ -110,60 +161,4 @@ const mp_obj_module_t mp_module_network = { MP_REGISTER_MODULE(MP_QSTR_network, mp_module_network); -/*******************************************************************************/ -// Implementations of network methods that can be used by any interface - -#if MICROPY_PY_LWIP - -mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_obj_t *args) { - if (n_args == 0) { - // Get IP addresses - const ip_addr_t *dns = dns_getserver(0); - mp_obj_t tuple[4] = { - netutils_format_ipv4_addr((uint8_t *)&netif->ip_addr, NETUTILS_BIG), - netutils_format_ipv4_addr((uint8_t *)&netif->netmask, NETUTILS_BIG), - netutils_format_ipv4_addr((uint8_t *)&netif->gw, NETUTILS_BIG), - netutils_format_ipv4_addr((uint8_t *)dns, NETUTILS_BIG), - }; - return mp_obj_new_tuple(4, tuple); - } else if (args[0] == MP_OBJ_NEW_QSTR(MP_QSTR_dhcp)) { - // Start the DHCP client - if (dhcp_supplied_address(netif)) { - dhcp_renew(netif); - } else { - dhcp_stop(netif); - dhcp_start(netif); - } - - // Wait for DHCP to get IP address - uint32_t start = mp_hal_ticks_ms(); - while (!dhcp_supplied_address(netif)) { - if (mp_hal_ticks_ms() - start > 10000) { - mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("timeout waiting for DHCP to get IP address")); - } - mp_hal_delay_ms(100); - } - - return mp_const_none; - } else { - // Release and stop any existing DHCP - dhcp_release(netif); - dhcp_stop(netif); - // Set static IP addresses - mp_obj_t *items; - mp_obj_get_array_fixed_n(args[0], 4, &items); - netutils_parse_ipv4_addr(items[0], (uint8_t *)&netif->ip_addr, NETUTILS_BIG); - netutils_parse_ipv4_addr(items[1], (uint8_t *)&netif->netmask, NETUTILS_BIG); - netutils_parse_ipv4_addr(items[2], (uint8_t *)&netif->gw, NETUTILS_BIG); - ip_addr_t dns; - netutils_parse_ipv4_addr(items[3], (uint8_t *)&dns, NETUTILS_BIG); - dns_setserver(0, &dns); - return mp_const_none; - } -} - -#endif - -MP_REGISTER_ROOT_POINTER(mp_obj_list_t mod_network_nic_list); - #endif // MICROPY_PY_NETWORK diff --git a/extmod/modnetwork.h b/extmod/modnetwork.h index a28ec6e420cb6..11691140fd6f1 100644 --- a/extmod/modnetwork.h +++ b/extmod/modnetwork.h @@ -52,12 +52,20 @@ #define MOD_NETWORK_SS_CONNECTED (2) #define MOD_NETWORK_SS_CLOSED (3) +extern char mod_network_country_code[2]; + +#ifndef MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN +#define MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN (16) +#endif + +extern char mod_network_hostname[MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN]; + #if MICROPY_PY_LWIP struct netif; void mod_network_lwip_init(void); void mod_network_lwip_poll_wrapper(uint32_t ticks_ms); mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_obj_t *args); -#else +#elif defined(MICROPY_PORT_NETWORK_INTERFACES) struct _mod_network_socket_obj_t; @@ -99,11 +107,13 @@ typedef struct _mod_network_socket_obj_t { #endif } mod_network_socket_obj_t; -#endif // MICROPY_PY_LWIP +#endif // MICROPY_PY_LWIP / MICROPY_PORT_NETWORK_INTERFACES +#ifdef MICROPY_PORT_NETWORK_INTERFACES void mod_network_init(void); void mod_network_deinit(void); void mod_network_register_nic(mp_obj_t nic); mp_obj_t mod_network_find_nic(const uint8_t *ip); +#endif #endif // MICROPY_INCLUDED_MODNETWORK_H diff --git a/extmod/network_cyw43.c b/extmod/network_cyw43.c index 90d964a67b123..5204c4ebd6f04 100644 --- a/extmod/network_cyw43.c +++ b/extmod/network_cyw43.c @@ -36,11 +36,8 @@ #include "extmod/network_cyw43.h" #include "modnetwork.h" -#if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER #include "lib/cyw43-driver/src/cyw43.h" -#else -#include "drivers/cyw43/cyw43.h" -#endif +#include "lib/cyw43-driver/src/cyw43_country.h" typedef struct _network_cyw43_obj_t { mp_obj_base_t base; @@ -124,11 +121,8 @@ STATIC mp_obj_t network_cyw43_active(size_t n_args, const mp_obj_t *args) { if (n_args == 1) { return mp_obj_new_bool(cyw43_tcpip_link_status(self->cyw, self->itf)); } else { - #if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER - cyw43_wifi_set_up(self->cyw, self->itf, mp_obj_is_true(args[1]), MICROPY_CYW43_COUNTRY); - #else - cyw43_wifi_set_up(self->cyw, self->itf, mp_obj_is_true(args[1])); - #endif + uint32_t country = CYW43_COUNTRY(mod_network_country_code[0], mod_network_country_code[1], 0); + cyw43_wifi_set_up(self->cyw, self->itf, mp_obj_is_true(args[1]), country); return mp_const_none; } } @@ -232,7 +226,7 @@ STATIC mp_obj_t network_cyw43_connect(size_t n_args, const mp_obj_t *pos_args, m { MP_QSTR_auth, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} }, { MP_QSTR_security, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} }, { MP_QSTR_bssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} }, - { MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} }, + { MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = CYW43_CHANNEL_NONE} }, }; network_cyw43_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); @@ -269,13 +263,12 @@ STATIC mp_obj_t network_cyw43_connect(size_t n_args, const mp_obj_t *pos_args, m uint32_t auth_type; if (args[ARG_security].u_int == -1) { if (key.buf == NULL || key.len == 0) { - auth_type = 0; // open security + // Default to open when no password set. + auth_type = CYW43_AUTH_OPEN; } else { - #if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER + // Default to WPA2 otherwise. All other modes require the security + // kwarg to be set explicitly. auth_type = CYW43_AUTH_WPA2_MIXED_PSK; - #else - auth_type = 0x008006; // WPA2_MIXED_PSK - #endif } } else { auth_type = args[ARG_security].u_int; @@ -388,11 +381,9 @@ STATIC mp_obj_t network_cyw43_config(size_t n_args, const mp_obj_t *args, mp_map return mp_obj_new_str((const char *)buf, len); } } - #if MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER case MP_QSTR_security: { return MP_OBJ_NEW_SMALL_INT(cyw43_wifi_ap_get_auth(self->cyw)); } - #endif case MP_QSTR_mac: { uint8_t buf[6]; cyw43_wifi_get_mac(self->cyw, self->itf, buf); @@ -404,11 +395,10 @@ STATIC mp_obj_t network_cyw43_config(size_t n_args, const mp_obj_t *args, mp_map cyw43_ioctl(self->cyw, CYW43_IOCTL_GET_VAR, 13, buf, self->itf); return MP_OBJ_NEW_SMALL_INT(nw_get_le32(buf) / 4); } - #if !MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER case MP_QSTR_hostname: { - return mp_obj_new_str(self->cyw->hostname, strlen(self->cyw->hostname)); + // TODO: Deprecated. Use network.hostname() instead. + return mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname)); } - #endif default: mp_raise_ValueError(MP_ERROR_TEXT("unknown config param")); } @@ -481,14 +471,16 @@ STATIC mp_obj_t network_cyw43_config(size_t n_args, const mp_obj_t *args, mp_map cyw43_ioctl(self->cyw, CYW43_IOCTL_SET_VAR, 9 + 4, buf, self->itf); break; } - #if !MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER case MP_QSTR_hostname: { - const char *hostname = mp_obj_str_get_str(e->value); - strncpy(self->cyw->hostname, hostname, MICROPY_BOARD_HOSTNAME_LENGTH); - self->cyw->hostname[MICROPY_BOARD_HOSTNAME_LENGTH - 1] = 0; + // TODO: Deprecated. Use network.hostname(name) instead. + size_t len; + const char *str = mp_obj_str_get_data(args[0], &len); + if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + mp_raise_ValueError(NULL); + } + strcpy(mod_network_hostname, str); break; } - #endif default: mp_raise_ValueError(MP_ERROR_TEXT("unknown config param")); } diff --git a/extmod/network_lwip.c b/extmod/network_lwip.c new file mode 100644 index 0000000000000..caa30f6fff4d2 --- /dev/null +++ b/extmod/network_lwip.c @@ -0,0 +1,95 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Damien P. George + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/runtime.h" +#include "py/mphal.h" + +#if MICROPY_PY_NETWORK && MICROPY_PY_LWIP + +#include "shared/netutils/netutils.h" +#include "extmod/modnetwork.h" + +#include "lwip/init.h" + +#if LWIP_VERSION_MAJOR >= 2 + +#include "lwip/netif.h" +#include "lwip/timeouts.h" +#include "lwip/dns.h" +#include "lwip/dhcp.h" + +// Implementations of network methods that can be used by any interface. + +mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_obj_t *args) { + if (n_args == 0) { + // Get IP addresses + const ip_addr_t *dns = dns_getserver(0); + mp_obj_t tuple[4] = { + netutils_format_ipv4_addr((uint8_t *)&netif->ip_addr, NETUTILS_BIG), + netutils_format_ipv4_addr((uint8_t *)&netif->netmask, NETUTILS_BIG), + netutils_format_ipv4_addr((uint8_t *)&netif->gw, NETUTILS_BIG), + netutils_format_ipv4_addr((uint8_t *)dns, NETUTILS_BIG), + }; + return mp_obj_new_tuple(4, tuple); + } else if (args[0] == MP_OBJ_NEW_QSTR(MP_QSTR_dhcp)) { + // Start the DHCP client + if (dhcp_supplied_address(netif)) { + dhcp_renew(netif); + } else { + dhcp_stop(netif); + dhcp_start(netif); + } + + // Wait for DHCP to get IP address + uint32_t start = mp_hal_ticks_ms(); + while (!dhcp_supplied_address(netif)) { + if (mp_hal_ticks_ms() - start > 10000) { + mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("timeout waiting for DHCP to get IP address")); + } + mp_hal_delay_ms(100); + } + + return mp_const_none; + } else { + // Release and stop any existing DHCP + dhcp_release(netif); + dhcp_stop(netif); + // Set static IP addresses + mp_obj_t *items; + mp_obj_get_array_fixed_n(args[0], 4, &items); + netutils_parse_ipv4_addr(items[0], (uint8_t *)&netif->ip_addr, NETUTILS_BIG); + netutils_parse_ipv4_addr(items[1], (uint8_t *)&netif->netmask, NETUTILS_BIG); + netutils_parse_ipv4_addr(items[2], (uint8_t *)&netif->gw, NETUTILS_BIG); + ip_addr_t dns; + netutils_parse_ipv4_addr(items[3], (uint8_t *)&dns, NETUTILS_BIG); + dns_setserver(0, &dns); + return mp_const_none; + } +} + +#endif // LWIP_VERSION_MAJOR >= 2 + +#endif // MICROPY_PY_NETWORK && MICROPY_PY_LWIP diff --git a/ports/esp32/boards/LILYGO_TTGO_LORA32/mpconfigboard.h b/ports/esp32/boards/LILYGO_TTGO_LORA32/mpconfigboard.h index 1c7b6fd557672..6be22dd0ffc40 100644 --- a/ports/esp32/boards/LILYGO_TTGO_LORA32/mpconfigboard.h +++ b/ports/esp32/boards/LILYGO_TTGO_LORA32/mpconfigboard.h @@ -1,2 +1,3 @@ #define MICROPY_HW_BOARD_NAME "LILYGO TTGO LoRa32" #define MICROPY_HW_MCU_NAME "ESP32" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-ttgo-lora32" diff --git a/ports/esp32/boards/LOLIN_C3_MINI/mpconfigboard.h b/ports/esp32/boards/LOLIN_C3_MINI/mpconfigboard.h index 5872bdc8ae5ef..12fd285da1753 100644 --- a/ports/esp32/boards/LOLIN_C3_MINI/mpconfigboard.h +++ b/ports/esp32/boards/LOLIN_C3_MINI/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "LOLIN_C3_MINI" #define MICROPY_HW_MCU_NAME "ESP32-C3FH4" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-c3-mini" #define MICROPY_HW_ENABLE_SDCARD (0) #define MICROPY_PY_MACHINE_DAC (0) diff --git a/ports/esp32/boards/LOLIN_S2_MINI/mpconfigboard.h b/ports/esp32/boards/LOLIN_S2_MINI/mpconfigboard.h index e0ef10d1db928..9776b7b478aa1 100644 --- a/ports/esp32/boards/LOLIN_S2_MINI/mpconfigboard.h +++ b/ports/esp32/boards/LOLIN_S2_MINI/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "LOLIN_S2_MINI" #define MICROPY_HW_MCU_NAME "ESP32-S2FN4R2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-s2-mini" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/LOLIN_S2_PICO/mpconfigboard.h b/ports/esp32/boards/LOLIN_S2_PICO/mpconfigboard.h index 549dd9847c7f3..9241280dec6a3 100644 --- a/ports/esp32/boards/LOLIN_S2_PICO/mpconfigboard.h +++ b/ports/esp32/boards/LOLIN_S2_PICO/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "LOLIN_S2_PICO" #define MICROPY_HW_MCU_NAME "ESP32-S2FN4R2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-s2-pico" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/M5STACK_ATOM/mpconfigboard.h b/ports/esp32/boards/M5STACK_ATOM/mpconfigboard.h index 4270b19caf966..18a59b15a50a6 100644 --- a/ports/esp32/boards/M5STACK_ATOM/mpconfigboard.h +++ b/ports/esp32/boards/M5STACK_ATOM/mpconfigboard.h @@ -1,2 +1,3 @@ #define MICROPY_HW_BOARD_NAME "M5Stack ATOM" #define MICROPY_HW_MCU_NAME "ESP32-PICO-D4" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "m5stack-atom" diff --git a/ports/esp32/boards/UM_FEATHERS2/mpconfigboard.h b/ports/esp32/boards/UM_FEATHERS2/mpconfigboard.h index 8d0c9f78c83ae..d8529b6342fe2 100644 --- a/ports/esp32/boards/UM_FEATHERS2/mpconfigboard.h +++ b/ports/esp32/boards/UM_FEATHERS2/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "FeatherS2" #define MICROPY_HW_MCU_NAME "ESP32-S2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "FeatherS2" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/UM_FEATHERS2NEO/mpconfigboard.h b/ports/esp32/boards/UM_FEATHERS2NEO/mpconfigboard.h index 5ee6874b87bab..e7e4d37ece95a 100644 --- a/ports/esp32/boards/UM_FEATHERS2NEO/mpconfigboard.h +++ b/ports/esp32/boards/UM_FEATHERS2NEO/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "FeatherS2 Neo" #define MICROPY_HW_MCU_NAME "ESP32-S2FN4R2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "FeatherS2-Neo" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/UM_FEATHERS3/mpconfigboard.h b/ports/esp32/boards/UM_FEATHERS3/mpconfigboard.h index 738b32ca1e841..91ea5056d17b7 100644 --- a/ports/esp32/boards/UM_FEATHERS3/mpconfigboard.h +++ b/ports/esp32/boards/UM_FEATHERS3/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "FeatherS3" #define MICROPY_HW_MCU_NAME "ESP32-S3" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "FeatherS3" #define MICROPY_PY_MACHINE_DAC (0) diff --git a/ports/esp32/boards/UM_PROS3/mpconfigboard.h b/ports/esp32/boards/UM_PROS3/mpconfigboard.h index 1522e2aee3adc..ecff1e6570666 100644 --- a/ports/esp32/boards/UM_PROS3/mpconfigboard.h +++ b/ports/esp32/boards/UM_PROS3/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "ProS3" #define MICROPY_HW_MCU_NAME "ESP32-S3" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "ProS3" #define MICROPY_PY_MACHINE_DAC (0) diff --git a/ports/esp32/boards/UM_TINYPICO/mpconfigboard.h b/ports/esp32/boards/UM_TINYPICO/mpconfigboard.h index 6bf70cc13b580..0bb3fa6184155 100644 --- a/ports/esp32/boards/UM_TINYPICO/mpconfigboard.h +++ b/ports/esp32/boards/UM_TINYPICO/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "TinyPICO" #define MICROPY_HW_MCU_NAME "ESP32-PICO-D4" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "TinyPICO" #define MICROPY_HW_I2C0_SCL (22) #define MICROPY_HW_I2C0_SDA (21) diff --git a/ports/esp32/boards/UM_TINYS2/mpconfigboard.h b/ports/esp32/boards/UM_TINYS2/mpconfigboard.h index 1052f6d79ca2b..e0bde417c8a2a 100644 --- a/ports/esp32/boards/UM_TINYS2/mpconfigboard.h +++ b/ports/esp32/boards/UM_TINYS2/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "TinyS2" #define MICROPY_HW_MCU_NAME "ESP32-S2FN4R2" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "TinyS2" #define MICROPY_PY_BLUETOOTH (0) #define MICROPY_HW_ENABLE_SDCARD (0) diff --git a/ports/esp32/boards/UM_TINYS3/mpconfigboard.h b/ports/esp32/boards/UM_TINYS3/mpconfigboard.h index b2638a9847882..c0f81f0c447c8 100644 --- a/ports/esp32/boards/UM_TINYS3/mpconfigboard.h +++ b/ports/esp32/boards/UM_TINYS3/mpconfigboard.h @@ -1,5 +1,6 @@ #define MICROPY_HW_BOARD_NAME "TinyS3" #define MICROPY_HW_MCU_NAME "ESP32-S3-FN8" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "TinyS3" #define MICROPY_PY_MACHINE_DAC (0) diff --git a/ports/esp32/main/CMakeLists.txt b/ports/esp32/main/CMakeLists.txt index fccfd6b7c7a9f..f8acfa90524f4 100644 --- a/ports/esp32/main/CMakeLists.txt +++ b/ports/esp32/main/CMakeLists.txt @@ -68,7 +68,7 @@ set(MICROPY_SOURCE_PORT ${PROJECT_DIR}/machine_i2s.c ${PROJECT_DIR}/machine_uart.c ${PROJECT_DIR}/modmachine.c - ${PROJECT_DIR}/modnetwork.c + ${PROJECT_DIR}/network_common.c ${PROJECT_DIR}/network_lan.c ${PROJECT_DIR}/network_ppp.c ${PROJECT_DIR}/network_wlan.c diff --git a/ports/esp32/modnetwork.h b/ports/esp32/modnetwork.h index d90679fa8a4e3..5f2767ac8d4fd 100644 --- a/ports/esp32/modnetwork.h +++ b/ports/esp32/modnetwork.h @@ -45,11 +45,13 @@ typedef struct _wlan_if_obj_t { int if_id; } wlan_if_obj_t; -MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(get_wlan_obj); -MP_DECLARE_CONST_FUN_OBJ_KW(get_lan_obj); -MP_DECLARE_CONST_FUN_OBJ_1(ppp_make_new_obj); -MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_ifconfig_obj); -MP_DECLARE_CONST_FUN_OBJ_KW(esp_config_obj); +MP_DECLARE_CONST_FUN_OBJ_0(esp_network_initialize_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_get_wlan_obj); +MP_DECLARE_CONST_FUN_OBJ_KW(esp_network_get_lan_obj); +MP_DECLARE_CONST_FUN_OBJ_1(esp_network_ppp_make_new_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_ifconfig_obj); +MP_DECLARE_CONST_FUN_OBJ_KW(esp_network_config_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj); NORETURN void esp_exceptions_helper(esp_err_t e); diff --git a/ports/esp32/modnetwork_globals.h b/ports/esp32/modnetwork_globals.h new file mode 100644 index 0000000000000..72d1ff3afbbc9 --- /dev/null +++ b/ports/esp32/modnetwork_globals.h @@ -0,0 +1,77 @@ +{ MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&esp_network_initialize_obj) }, + +#if MICROPY_PY_NETWORK_WLAN +{ MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&esp_network_get_wlan_obj) }, +#endif + +#if MICROPY_PY_NETWORK_LAN +{ MP_ROM_QSTR(MP_QSTR_LAN), MP_ROM_PTR(&esp_network_get_lan_obj) }, +#endif +{ MP_ROM_QSTR(MP_QSTR_PPP), MP_ROM_PTR(&esp_network_ppp_make_new_obj) }, +{ MP_ROM_QSTR(MP_QSTR_phy_mode), MP_ROM_PTR(&esp_network_phy_mode_obj) }, + +#if MICROPY_PY_NETWORK_WLAN +{ MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(WIFI_IF_STA)}, +{ MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(WIFI_IF_AP)}, + +{ MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(WIFI_PROTOCOL_11B) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(WIFI_PROTOCOL_11G) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(WIFI_PROTOCOL_11N) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_LR), MP_ROM_INT(WIFI_PROTOCOL_LR) }, + +{ MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(WIFI_AUTH_OPEN) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(WIFI_AUTH_WEP) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(WIFI_AUTH_WPA_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(WIFI_AUTH_WPA_WPA2_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_ENTERPRISE), MP_ROM_INT(WIFI_AUTH_WPA2_ENTERPRISE) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA3_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_WPA3_PSK) }, +#if ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 3, 0) +{ MP_ROM_QSTR(MP_QSTR_AUTH_WAPI_PSK), MP_ROM_INT(WIFI_AUTH_WAPI_PSK) }, +#endif +{ MP_ROM_QSTR(MP_QSTR_AUTH_MAX), MP_ROM_INT(WIFI_AUTH_MAX) }, +#endif + +#if MICROPY_PY_NETWORK_LAN +{ MP_ROM_QSTR(MP_QSTR_PHY_LAN8710), MP_ROM_INT(PHY_LAN8710) }, +{ MP_ROM_QSTR(MP_QSTR_PHY_LAN8720), MP_ROM_INT(PHY_LAN8720) }, +{ MP_ROM_QSTR(MP_QSTR_PHY_IP101), MP_ROM_INT(PHY_IP101) }, +{ MP_ROM_QSTR(MP_QSTR_PHY_RTL8201), MP_ROM_INT(PHY_RTL8201) }, +{ MP_ROM_QSTR(MP_QSTR_PHY_DP83848), MP_ROM_INT(PHY_DP83848) }, +#if ESP_IDF_VERSION_MINOR >= 3 +// PHY_KSZ8041 is new in ESP-IDF v4.3 +{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8041), MP_ROM_INT(PHY_KSZ8041) }, +#endif +#if ESP_IDF_VERSION_MINOR >= 4 +// PHY_KSZ8081 is new in ESP-IDF v4.4 +{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8081), MP_ROM_INT(PHY_KSZ8081) }, +#endif + +#if CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL +{ MP_ROM_QSTR(MP_QSTR_PHY_KSZ8851SNL), MP_ROM_INT(PHY_KSZ8851SNL) }, +#endif +#if CONFIG_ETH_SPI_ETHERNET_DM9051 +{ MP_ROM_QSTR(MP_QSTR_PHY_DM9051), MP_ROM_INT(PHY_DM9051) }, +#endif +#if CONFIG_ETH_SPI_ETHERNET_W5500 +{ MP_ROM_QSTR(MP_QSTR_PHY_W5500), MP_ROM_INT(PHY_W5500) }, +#endif + +{ MP_ROM_QSTR(MP_QSTR_ETH_INITIALIZED), MP_ROM_INT(ETH_INITIALIZED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_STARTED), MP_ROM_INT(ETH_STARTED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_STOPPED), MP_ROM_INT(ETH_STOPPED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_CONNECTED), MP_ROM_INT(ETH_CONNECTED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_DISCONNECTED), MP_ROM_INT(ETH_DISCONNECTED)}, +{ MP_ROM_QSTR(MP_QSTR_ETH_GOT_IP), MP_ROM_INT(ETH_GOT_IP)}, +#endif + +{ MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STAT_IDLE)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STAT_CONNECTING)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STAT_GOT_IP)}, +// Errors from the ESP-IDF +{ MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(WIFI_REASON_NO_AP_FOUND)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(WIFI_REASON_AUTH_FAIL)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_BEACON_TIMEOUT), MP_ROM_INT(WIFI_REASON_BEACON_TIMEOUT)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_ASSOC_FAIL), MP_ROM_INT(WIFI_REASON_ASSOC_FAIL)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_HANDSHAKE_TIMEOUT), MP_ROM_INT(WIFI_REASON_HANDSHAKE_TIMEOUT)}, diff --git a/ports/esp32/mpconfigport.h b/ports/esp32/mpconfigport.h index 38468cf9cfbb3..94daa2caa175d 100644 --- a/ports/esp32/mpconfigport.h +++ b/ports/esp32/mpconfigport.h @@ -110,6 +110,20 @@ #ifndef MICROPY_PY_MACHINE_I2S #define MICROPY_PY_MACHINE_I2S (1) #endif +#define MICROPY_PY_NETWORK (1) +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#if CONFIG_IDF_TARGET_ESP32 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp32" +#elif CONFIG_IDF_TARGET_ESP32S2 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp32s2" +#elif CONFIG_IDF_TARGET_ESP32S3 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp32s3" +#elif CONFIG_IDF_TARGET_ESP32C3 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp32c3" +#endif +#endif +#define MICROPY_PY_NETWORK_INCLUDEFILE "ports/esp32/modnetwork.h" +#define MICROPY_PY_NETWORK_MODULE_GLOBALS_INCLUDEFILE "ports/esp32/modnetwork_globals.h" #ifndef MICROPY_PY_NETWORK_WLAN #define MICROPY_PY_NETWORK_WLAN (1) #endif diff --git a/ports/esp32/modnetwork.c b/ports/esp32/network_common.c similarity index 66% rename from ports/esp32/modnetwork.c rename to ports/esp32/network_common.c index 3f56fcfae2639..1e76d679db046 100644 --- a/ports/esp32/modnetwork.c +++ b/ports/esp32/network_common.c @@ -48,8 +48,6 @@ #define DNS_MAIN ESP_NETIF_DNS_MAIN #endif -#define MODNETWORK_INCLUDE_CONSTANTS (1) - NORETURN void esp_exceptions_helper(esp_err_t e) { switch (e) { case ESP_ERR_WIFI_NOT_INIT: @@ -144,7 +142,7 @@ STATIC mp_obj_t esp_initialize() { } return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_0(esp_initialize_obj, esp_initialize); +MP_DEFINE_CONST_FUN_OBJ_0(esp_network_initialize_obj, esp_initialize); STATIC mp_obj_t esp_ifconfig(size_t n_args, const mp_obj_t *args) { wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -207,12 +205,12 @@ STATIC mp_obj_t esp_ifconfig(size_t n_args, const mp_obj_t *args) { return mp_const_none; } } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_ifconfig_obj, 1, 2, esp_ifconfig); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_ifconfig_obj, 1, 2, esp_ifconfig); STATIC mp_obj_t esp_phy_mode(size_t n_args, const mp_obj_t *args) { return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_phy_mode_obj, 0, 1, esp_phy_mode); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj, 0, 1, esp_phy_mode); #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0) #define TEST_WIFI_AUTH_MAX 9 @@ -220,98 +218,3 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_phy_mode_obj, 0, 1, esp_phy_mode) #define TEST_WIFI_AUTH_MAX 8 #endif _Static_assert(WIFI_AUTH_MAX == TEST_WIFI_AUTH_MAX, "Synchronize WIFI_AUTH_XXX constants with the ESP-IDF. Look at esp-idf/components/esp_wifi/include/esp_wifi_types.h"); - -STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) }, - { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&esp_initialize_obj) }, - - #if MICROPY_PY_NETWORK_WLAN - { MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&get_wlan_obj) }, - #endif - - #if MICROPY_PY_NETWORK_LAN - { MP_ROM_QSTR(MP_QSTR_LAN), MP_ROM_PTR(&get_lan_obj) }, - #endif - { MP_ROM_QSTR(MP_QSTR_PPP), MP_ROM_PTR(&ppp_make_new_obj) }, - { MP_ROM_QSTR(MP_QSTR_phy_mode), MP_ROM_PTR(&esp_phy_mode_obj) }, - - #if MODNETWORK_INCLUDE_CONSTANTS - - #if MICROPY_PY_NETWORK_WLAN - { MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(WIFI_IF_STA)}, - { MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(WIFI_IF_AP)}, - - { MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(WIFI_PROTOCOL_11B) }, - { MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(WIFI_PROTOCOL_11G) }, - { MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(WIFI_PROTOCOL_11N) }, - { MP_ROM_QSTR(MP_QSTR_MODE_LR), MP_ROM_INT(WIFI_PROTOCOL_LR) }, - - { MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(WIFI_AUTH_OPEN) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(WIFI_AUTH_WEP) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(WIFI_AUTH_WPA_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(WIFI_AUTH_WPA_WPA2_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_ENTERPRISE), MP_ROM_INT(WIFI_AUTH_WPA2_ENTERPRISE) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA3_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_WPA3_PSK), MP_ROM_INT(WIFI_AUTH_WPA2_WPA3_PSK) }, - #if ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(4, 3, 0) - { MP_ROM_QSTR(MP_QSTR_AUTH_WAPI_PSK), MP_ROM_INT(WIFI_AUTH_WAPI_PSK) }, - #endif - { MP_ROM_QSTR(MP_QSTR_AUTH_MAX), MP_ROM_INT(WIFI_AUTH_MAX) }, - #endif - - #if MICROPY_PY_NETWORK_LAN - { MP_ROM_QSTR(MP_QSTR_PHY_LAN8710), MP_ROM_INT(PHY_LAN8710) }, - { MP_ROM_QSTR(MP_QSTR_PHY_LAN8720), MP_ROM_INT(PHY_LAN8720) }, - { MP_ROM_QSTR(MP_QSTR_PHY_IP101), MP_ROM_INT(PHY_IP101) }, - { MP_ROM_QSTR(MP_QSTR_PHY_RTL8201), MP_ROM_INT(PHY_RTL8201) }, - { MP_ROM_QSTR(MP_QSTR_PHY_DP83848), MP_ROM_INT(PHY_DP83848) }, - #if ESP_IDF_VERSION_MINOR >= 3 - // PHY_KSZ8041 is new in ESP-IDF v4.3 - { MP_ROM_QSTR(MP_QSTR_PHY_KSZ8041), MP_ROM_INT(PHY_KSZ8041) }, - #endif - #if ESP_IDF_VERSION_MINOR >= 4 - // PHY_KSZ8081 is new in ESP-IDF v4.4 - { MP_ROM_QSTR(MP_QSTR_PHY_KSZ8081), MP_ROM_INT(PHY_KSZ8081) }, - #endif - - #if CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL - { MP_ROM_QSTR(MP_QSTR_PHY_KSZ8851SNL), MP_ROM_INT(PHY_KSZ8851SNL) }, - #endif - #if CONFIG_ETH_SPI_ETHERNET_DM9051 - { MP_ROM_QSTR(MP_QSTR_PHY_DM9051), MP_ROM_INT(PHY_DM9051) }, - #endif - #if CONFIG_ETH_SPI_ETHERNET_W5500 - { MP_ROM_QSTR(MP_QSTR_PHY_W5500), MP_ROM_INT(PHY_W5500) }, - #endif - - { MP_ROM_QSTR(MP_QSTR_ETH_INITIALIZED), MP_ROM_INT(ETH_INITIALIZED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_STARTED), MP_ROM_INT(ETH_STARTED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_STOPPED), MP_ROM_INT(ETH_STOPPED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_CONNECTED), MP_ROM_INT(ETH_CONNECTED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_DISCONNECTED), MP_ROM_INT(ETH_DISCONNECTED)}, - { MP_ROM_QSTR(MP_QSTR_ETH_GOT_IP), MP_ROM_INT(ETH_GOT_IP)}, - #endif - - { MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STAT_IDLE)}, - { MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STAT_CONNECTING)}, - { MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STAT_GOT_IP)}, - // Errors from the ESP-IDF - { MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(WIFI_REASON_NO_AP_FOUND)}, - { MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(WIFI_REASON_AUTH_FAIL)}, - { MP_ROM_QSTR(MP_QSTR_STAT_BEACON_TIMEOUT), MP_ROM_INT(WIFI_REASON_BEACON_TIMEOUT)}, - { MP_ROM_QSTR(MP_QSTR_STAT_ASSOC_FAIL), MP_ROM_INT(WIFI_REASON_ASSOC_FAIL)}, - { MP_ROM_QSTR(MP_QSTR_STAT_HANDSHAKE_TIMEOUT), MP_ROM_INT(WIFI_REASON_HANDSHAKE_TIMEOUT)}, - #endif -}; - -STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table); - -const mp_obj_module_t mp_module_network = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&mp_module_network_globals, -}; - -// Note: This port doesn't define MICROPY_PY_NETWORK so this will not conflict -// with the common implementation provided by extmod/modnetwork.c. -MP_REGISTER_MODULE(MP_QSTR_network, mp_module_network); diff --git a/ports/esp32/network_lan.c b/ports/esp32/network_lan.c index d4d630e345697..9b7a31cc4f9d3 100644 --- a/ports/esp32/network_lan.c +++ b/ports/esp32/network_lan.c @@ -331,7 +331,7 @@ STATIC mp_obj_t get_lan(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar return MP_OBJ_FROM_PTR(&lan_obj); } -MP_DEFINE_CONST_FUN_OBJ_KW(get_lan_obj, 0, get_lan); +MP_DEFINE_CONST_FUN_OBJ_KW(esp_network_get_lan_obj, 0, get_lan); STATIC mp_obj_t lan_active(size_t n_args, const mp_obj_t *args) { lan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -423,7 +423,7 @@ STATIC const mp_rom_map_elem_t lan_if_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&lan_isconnected_obj) }, { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&lan_status_obj) }, { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&lan_config_obj) }, - { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_ifconfig_obj) }, + { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_network_ifconfig_obj) }, }; STATIC MP_DEFINE_CONST_DICT(lan_if_locals_dict, lan_if_locals_dict_table); diff --git a/ports/esp32/network_ppp.c b/ports/esp32/network_ppp.c index 703cdc7889fdc..b3cab835981e1 100644 --- a/ports/esp32/network_ppp.c +++ b/ports/esp32/network_ppp.c @@ -91,7 +91,7 @@ STATIC mp_obj_t ppp_make_new(mp_obj_t stream) { return MP_OBJ_FROM_PTR(self); } -MP_DEFINE_CONST_FUN_OBJ_1(ppp_make_new_obj, ppp_make_new); +MP_DEFINE_CONST_FUN_OBJ_1(esp_network_ppp_make_new_obj, ppp_make_new); static u32_t ppp_output_callback(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) { ppp_if_obj_t *self = ctx; diff --git a/ports/esp32/network_wlan.c b/ports/esp32/network_wlan.c index e4b34b2204fab..aefc4394c2ac3 100644 --- a/ports/esp32/network_wlan.c +++ b/ports/esp32/network_wlan.c @@ -36,6 +36,7 @@ #include "py/objlist.h" #include "py/runtime.h" #include "py/mphal.h" +#include "extmod/modnetwork.h" #include "modnetwork.h" #include "esp_wifi.h" @@ -91,12 +92,8 @@ void network_wlan_event_handler(system_event_t *event) { if (!mdns_initialised) { mdns_init(); #if MICROPY_HW_ENABLE_MDNS_RESPONDER - const char *hostname = NULL; - if (tcpip_adapter_get_hostname(WIFI_IF_STA, &hostname) != ESP_OK || hostname == NULL) { - hostname = "esp32"; - } - mdns_hostname_set(hostname); - mdns_instance_name_set(hostname); + mdns_hostname_set(mod_network_hostname); + mdns_instance_name_set(mod_network_hostname); #endif mdns_initialised = true; } @@ -182,7 +179,7 @@ STATIC mp_obj_t get_wlan(size_t n_args, const mp_obj_t *args) { mp_raise_ValueError(MP_ERROR_TEXT("invalid WLAN interface identifier")); } } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(get_wlan_obj, 0, 1, get_wlan); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_get_wlan_obj, 0, 1, get_wlan); STATIC mp_obj_t network_wlan_active(size_t n_args, const mp_obj_t *args) { wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -260,6 +257,8 @@ STATIC mp_obj_t network_wlan_connect(size_t n_args, const mp_obj_t *pos_args, mp esp_exceptions(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_sta_config)); } + esp_exceptions(tcpip_adapter_set_hostname(TCPIP_ADAPTER_IF_STA, mod_network_hostname)); + wifi_sta_reconnects = 0; // connect to the WiFi AP MP_THREAD_GIL_EXIT(); @@ -474,8 +473,13 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_ } case MP_QSTR_hostname: case MP_QSTR_dhcp_hostname: { - const char *s = mp_obj_str_get_str(kwargs->table[i].value); - esp_exceptions(tcpip_adapter_set_hostname(self->if_id, s)); + // TODO: Deprecated. Use network.hostname(name) instead. + size_t len; + const char *str = mp_obj_str_get_data(kwargs->table[i].value, &len); + if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + mp_raise_ValueError(NULL); + } + strcpy(mod_network_hostname, str); break; } case MP_QSTR_max_clients: { @@ -568,9 +572,9 @@ STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_ } case MP_QSTR_hostname: case MP_QSTR_dhcp_hostname: { - const char *s; - esp_exceptions(tcpip_adapter_get_hostname(self->if_id, &s)); - val = mp_obj_new_str(s, strlen(s)); + // TODO: Deprecated. Use network.hostname() instead. + req_if = WIFI_IF_STA; + val = mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname)); break; } case MP_QSTR_max_clients: { @@ -618,7 +622,7 @@ STATIC const mp_rom_map_elem_t wlan_if_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&network_wlan_scan_obj) }, { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&network_wlan_isconnected_obj) }, { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&network_wlan_config_obj) }, - { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_ifconfig_obj) }, + { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&esp_network_ifconfig_obj) }, }; STATIC MP_DEFINE_CONST_DICT(wlan_if_locals_dict, wlan_if_locals_dict_table); diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile index c5eb63fad6ff6..fb994c752ed71 100644 --- a/ports/esp8266/Makefile +++ b/ports/esp8266/Makefile @@ -106,8 +106,8 @@ SRC_C = \ machine_wdt.c \ machine_hspi.c \ modesp.c \ - modnetwork.c \ modutime.c \ + network_wlan.c \ ets_alt_task.c \ fatfs_port.c \ posix_helpers.c \ diff --git a/ports/esp8266/boards/esp8266_common.ld b/ports/esp8266/boards/esp8266_common.ld index c2d62e9dd4ce6..bccfaa261f998 100644 --- a/ports/esp8266/boards/esp8266_common.ld +++ b/ports/esp8266/boards/esp8266_common.ld @@ -163,12 +163,12 @@ SECTIONS *machine_hspi.o(.literal*, .text*) *hspi.o(.literal*, .text*) *modesp.o(.literal* .text*) - *modnetwork.o(.literal* .text*) *moduos.o(.literal* .text*) *modutime.o(.literal* .text*) *modlwip.o(.literal* .text*) *modsocket.o(.literal* .text*) *modonewire.o(.literal* .text*) + *network_wlan.o(.literal* .text*) *esp_mphal.o(.literal* .text*) /* we put as much rodata as possible in this section */ diff --git a/ports/esp8266/modnetwork.h b/ports/esp8266/modnetwork.h new file mode 100644 index 0000000000000..dc9203b0fb917 --- /dev/null +++ b/ports/esp8266/modnetwork.h @@ -0,0 +1,2 @@ +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_get_wlan_obj); +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj); diff --git a/ports/esp8266/modnetwork_globals.h b/ports/esp8266/modnetwork_globals.h new file mode 100644 index 0000000000000..f977cd14e4958 --- /dev/null +++ b/ports/esp8266/modnetwork_globals.h @@ -0,0 +1,22 @@ +{ MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&esp_network_get_wlan_obj) }, +{ MP_ROM_QSTR(MP_QSTR_phy_mode), MP_ROM_PTR(&esp_network_phy_mode_obj) }, + +{ MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(STATION_IF)}, +{ MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(SOFTAP_IF)}, + +{ MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STATION_IDLE)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STATION_CONNECTING)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(STATION_WRONG_PASSWORD)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(STATION_NO_AP_FOUND)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_CONNECT_FAIL), MP_ROM_INT(STATION_CONNECT_FAIL)}, +{ MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STATION_GOT_IP)}, + +{ MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(PHY_MODE_11B) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(PHY_MODE_11G) }, +{ MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(PHY_MODE_11N) }, + +{ MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(AUTH_OPEN) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(AUTH_WEP) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(AUTH_WPA_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(AUTH_WPA2_PSK) }, +{ MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(AUTH_WPA_WPA2_PSK) }, diff --git a/ports/esp8266/mpconfigport.h b/ports/esp8266/mpconfigport.h index ded56663b32bf..7576c99a87753 100644 --- a/ports/esp8266/mpconfigport.h +++ b/ports/esp8266/mpconfigport.h @@ -71,6 +71,12 @@ #define MICROPY_PY_MACHINE_SOFTI2C (1) #define MICROPY_PY_MACHINE_SPI (1) #define MICROPY_PY_MACHINE_SOFTSPI (1) +#define MICROPY_PY_NETWORK (1) +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-esp8266" +#endif +#define MICROPY_PY_NETWORK_INCLUDEFILE "ports/esp8266/modnetwork.h" +#define MICROPY_PY_NETWORK_MODULE_GLOBALS_INCLUDEFILE "ports/esp8266/modnetwork_globals.h" #define MICROPY_PY_UWEBSOCKET (1) #define MICROPY_PY_ONEWIRE (1) #define MICROPY_PY_WEBREPL (1) diff --git a/ports/esp8266/modnetwork.c b/ports/esp8266/network_wlan.c similarity index 88% rename from ports/esp8266/modnetwork.c rename to ports/esp8266/network_wlan.c index 29bdd3a1b7eac..9f89b126f62da 100644 --- a/ports/esp8266/modnetwork.c +++ b/ports/esp8266/network_wlan.c @@ -31,6 +31,7 @@ #include "py/objlist.h" #include "py/runtime.h" #include "py/mphal.h" +#include "extmod/modnetwork.h" #include "shared/netutils/netutils.h" #include "queue.h" #include "user_interface.h" @@ -39,8 +40,6 @@ #include "ets_alt_task.h" #include "lwip/dns.h" -#define MODNETWORK_INCLUDE_CONSTANTS (1) - typedef struct _wlan_if_obj_t { mp_obj_base_t base; int if_id; @@ -71,7 +70,7 @@ STATIC mp_obj_t get_wlan(size_t n_args, const mp_obj_t *args) { } return MP_OBJ_FROM_PTR(&wlan_objs[idx]); } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(get_wlan_obj, 0, 1, get_wlan); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_get_wlan_obj, 0, 1, get_wlan); STATIC mp_obj_t esp_active(size_t n_args, const mp_obj_t *args) { wlan_if_obj_t *self = MP_OBJ_TO_PTR(args[0]); @@ -152,6 +151,9 @@ STATIC mp_obj_t esp_connect(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k if (set_config) { error_check(wifi_station_set_config(&config), "Cannot set STA config"); } + + wifi_station_set_hostname(mod_network_hostname); + error_check(wifi_station_connect(), "Cannot connect to AP"); return mp_const_none; @@ -399,11 +401,13 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs } case MP_QSTR_hostname: case MP_QSTR_dhcp_hostname: { - req_if = STATION_IF; - if (self->if_id == STATION_IF) { - const char *s = mp_obj_str_get_str(kwargs->table[i].value); - wifi_station_set_hostname((char *)s); + // TODO: Deprecated. Use network.hostname(name) instead. + size_t len; + const char *str = mp_obj_str_get_data(kwargs->table[i].value, &len); + if (len >= MICROPY_PY_NETWORK_HOSTNAME_MAX_LEN) { + mp_raise_ValueError(NULL); } + strcpy(mod_network_hostname, str); break; } case MP_QSTR_protocol: { @@ -474,12 +478,8 @@ STATIC mp_obj_t esp_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs case MP_QSTR_hostname: case MP_QSTR_dhcp_hostname: { req_if = STATION_IF; - char *s = wifi_station_get_hostname(); - if (s == NULL) { - val = MP_OBJ_NEW_QSTR(MP_QSTR_); - } else { - val = mp_obj_new_str(s, strlen(s)); - } + // TODO: Deprecated. Use network.hostname() instead. + val = mp_obj_new_str(mod_network_hostname, strlen(mod_network_hostname)); break; } case MP_QSTR_protocol: { @@ -530,43 +530,4 @@ STATIC mp_obj_t esp_phy_mode(size_t n_args, const mp_obj_t *args) { return mp_const_none; } } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_phy_mode_obj, 0, 1, esp_phy_mode); - -STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) }, - { MP_ROM_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&get_wlan_obj) }, - { MP_ROM_QSTR(MP_QSTR_phy_mode), MP_ROM_PTR(&esp_phy_mode_obj) }, - - #if MODNETWORK_INCLUDE_CONSTANTS - { MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(STATION_IF)}, - { MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(SOFTAP_IF)}, - - { MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(STATION_IDLE)}, - { MP_ROM_QSTR(MP_QSTR_STAT_CONNECTING), MP_ROM_INT(STATION_CONNECTING)}, - { MP_ROM_QSTR(MP_QSTR_STAT_WRONG_PASSWORD), MP_ROM_INT(STATION_WRONG_PASSWORD)}, - { MP_ROM_QSTR(MP_QSTR_STAT_NO_AP_FOUND), MP_ROM_INT(STATION_NO_AP_FOUND)}, - { MP_ROM_QSTR(MP_QSTR_STAT_CONNECT_FAIL), MP_ROM_INT(STATION_CONNECT_FAIL)}, - { MP_ROM_QSTR(MP_QSTR_STAT_GOT_IP), MP_ROM_INT(STATION_GOT_IP)}, - - { MP_ROM_QSTR(MP_QSTR_MODE_11B), MP_ROM_INT(PHY_MODE_11B) }, - { MP_ROM_QSTR(MP_QSTR_MODE_11G), MP_ROM_INT(PHY_MODE_11G) }, - { MP_ROM_QSTR(MP_QSTR_MODE_11N), MP_ROM_INT(PHY_MODE_11N) }, - - { MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(AUTH_OPEN) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(AUTH_WEP) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(AUTH_WPA_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(AUTH_WPA2_PSK) }, - { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(AUTH_WPA_WPA2_PSK) }, - #endif -}; - -STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table); - -const mp_obj_module_t network_module = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&mp_module_network_globals, -}; - -// Note: This port doesn't define MICROPY_PY_NETWORK so this will not conflict -// with the common implementation provided by extmod/modnetwork.c. -MP_REGISTER_MODULE(MP_QSTR_network, network_module); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(esp_network_phy_mode_obj, 0, 1, esp_phy_mode); diff --git a/ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h index 9a9befa126cd8..390e91814d16a 100644 --- a/ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1020 EVK" #define MICROPY_HW_MCU_NAME "MIMXRT1021DAG5A" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1020evk" + // i.MX RT1020 EVK has 1 board LED // Todo: think about replacing the define with searching in the generated pins? #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_05) diff --git a/ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h index 9cc740b1a631c..134c9637ea57e 100644 --- a/ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1050 EVKB-A1" #define MICROPY_HW_MCU_NAME "MIMXRT1052DVL6B" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1050evk" + // MIMXRT1050_EVKB has 1 user LED #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin)) diff --git a/ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h index 7eecb1f6b4db9..01ae3ba303c68 100644 --- a/ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1060 EVK" #define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1060evk" + // MIMXRT1060_EVK has 1 user LED #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin)) diff --git a/ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h index 367b4a780bde9..b6752c3e1ba3e 100644 --- a/ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1064 EVK" #define MICROPY_HW_MCU_NAME "MIMXRT1064DVL6A" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1064evk" + // MIMXRT1064_EVK has 1 user LED #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin)) diff --git a/ports/mimxrt/boards/MIMXRT1170_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1170_EVK/mpconfigboard.h index 0ec7ed7778432..d37050eb56041 100644 --- a/ports/mimxrt/boards/MIMXRT1170_EVK/mpconfigboard.h +++ b/ports/mimxrt/boards/MIMXRT1170_EVK/mpconfigboard.h @@ -1,5 +1,8 @@ #define MICROPY_HW_BOARD_NAME "i.MX RT1170 EVK" #define MICROPY_HW_MCU_NAME "MIMXRT1176DVMAA" + +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-1070evk" + #define MICROPY_EVENT_POLL_HOOK \ do { \ extern void mp_handle_pending(bool); \ diff --git a/ports/mimxrt/boards/SEEED_ARCH_MIX/mpconfigboard.h b/ports/mimxrt/boards/SEEED_ARCH_MIX/mpconfigboard.h index 37ff6a94c2bf2..c98cdcb0a7492 100644 --- a/ports/mimxrt/boards/SEEED_ARCH_MIX/mpconfigboard.h +++ b/ports/mimxrt/boards/SEEED_ARCH_MIX/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "Seeed ARCH MIX" #define MICROPY_HW_MCU_NAME "MIMXRT1052DVL5B" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-arch-mix" + // MIMXRT1050_EVKB has 1 user LED #define MICROPY_HW_LED1_PIN (pin_GPIO_AD_B0_09) #define MICROPY_HW_LED2_PIN (pin_GPIO_AD_B0_10) diff --git a/ports/mimxrt/boards/TEENSY41/mpconfigboard.h b/ports/mimxrt/boards/TEENSY41/mpconfigboard.h index 7fe97fd9ccf61..56740f48ea3d0 100644 --- a/ports/mimxrt/boards/TEENSY41/mpconfigboard.h +++ b/ports/mimxrt/boards/TEENSY41/mpconfigboard.h @@ -1,6 +1,8 @@ #define MICROPY_HW_BOARD_NAME "Teensy 4.1" #define MICROPY_HW_MCU_NAME "MIMXRT1062DVJ6A" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-teensy41" + // Teensy 4.1 has 1 board LED #define MICROPY_HW_LED1_PIN (pin_GPIO_B0_03) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin)) diff --git a/ports/mimxrt/eth.c b/ports/mimxrt/eth.c index ad015941a220b..f1814286e621a 100644 --- a/ports/mimxrt/eth.c +++ b/ports/mimxrt/eth.c @@ -559,7 +559,7 @@ STATIC void eth_lwip_init(eth_t *self) { n->name[0] = 'e'; n->name[1] = (self == ð_instance0 ? '0' : '1'); netif_add(n, &ipconfig[0], &ipconfig[1], &ipconfig[2], self, eth_netif_init, ethernet_input); - netif_set_hostname(n, "MPY"); + netif_set_hostname(n, mod_network_hostname); netif_set_default(n); netif_set_up(n); diff --git a/ports/mimxrt/mpconfigport.h b/ports/mimxrt/mpconfigport.h index 2e955fd06aae4..772f080a9264c 100644 --- a/ports/mimxrt/mpconfigport.h +++ b/ports/mimxrt/mpconfigport.h @@ -118,6 +118,10 @@ uint32_t trng_random_u32(void); #define MICROPY_PY_LWIP_REENTER MICROPY_PY_PENDSV_REENTER #define MICROPY_PY_LWIP_EXIT MICROPY_PY_PENDSV_EXIT +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-mimxrt" +#endif + #endif // For regular code that wants to prevent "background tasks" from running. diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt index 357125e734c3a..ab09ab51482bd 100644 --- a/ports/rp2/CMakeLists.txt +++ b/ports/rp2/CMakeLists.txt @@ -250,7 +250,6 @@ if (MICROPY_PY_NETWORK_CYW43) target_compile_definitions(${MICROPY_TARGET} PRIVATE MICROPY_PY_NETWORK_CYW43=1 - MICROPY_PY_NETWORK_CYW43_USE_LIB_DRIVER=1 MICROPY_PY_SOCKET_DEFAULT_TIMEOUT_MS=30000 # default socket timeout ) if (CMAKE_BUILD_TYPE MATCHES Debug) @@ -263,10 +262,6 @@ if (MICROPY_PY_NETWORK_CYW43) machine_pin_cyw43.c ) - list(APPEND MICROPY_SOURCE_EXTMOD - ${MICROPY_DIR}/extmod/network_cyw43.c - ) - target_link_libraries(${MICROPY_TARGET} cyw43_driver_picow cmsis_core @@ -289,10 +284,6 @@ if (MICROPY_PY_NETWORK_NINAW10) ${MICROPY_DIR}/drivers/ninaw10/nina_wifi_bsp.c ${MICROPY_DIR}/drivers/ninaw10/machine_pin_nina.c ) - - list(APPEND MICROPY_SOURCE_EXTMOD - ${MICROPY_DIR}/extmod/network_ninaw10.c - ) endif() if (MICROPY_PY_NETWORK_WIZNET5K) @@ -331,10 +322,6 @@ if (MICROPY_PY_NETWORK_WIZNET5K) ${MICROPY_DIR}/lib/wiznet5k/Internet/DNS/dns.c ${MICROPY_DIR}/lib/wiznet5k/Internet/DHCP/dhcp.c ) - - list(APPEND MICROPY_SOURCE_EXTMOD - ${MICROPY_DIR}/extmod/network_wiznet5k.c - ) endif() # Add qstr sources for extmod and usermod, in case they are modified by components above. diff --git a/ports/rp2/boards/PICO_W/mpconfigboard.h b/ports/rp2/boards/PICO_W/mpconfigboard.h index 227e7e3ff4c06..ef812b6301356 100644 --- a/ports/rp2/boards/PICO_W/mpconfigboard.h +++ b/ports/rp2/boards/PICO_W/mpconfigboard.h @@ -6,6 +6,7 @@ // Enable networking. #define MICROPY_PY_NETWORK 1 +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "PicoW" // CYW43 driver configuration. #define CYW43_USE_SPI (1) diff --git a/ports/rp2/boards/W5100S_EVB_PICO/mpconfigboard.h b/ports/rp2/boards/W5100S_EVB_PICO/mpconfigboard.h index ca2f7d0cea94d..323cee7a69f5f 100644 --- a/ports/rp2/boards/W5100S_EVB_PICO/mpconfigboard.h +++ b/ports/rp2/boards/W5100S_EVB_PICO/mpconfigboard.h @@ -1,19 +1,20 @@ // Board config for Wiznet W5100S-EVB-Pico. // Board and hardware specific configuration -#define MICROPY_HW_BOARD_NAME "W5100S-EVB-Pico" -#define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024) +#define MICROPY_HW_BOARD_NAME "W5100S-EVB-Pico" +#define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024) // Enable networking. -#define MICROPY_PY_NETWORK (1) +#define MICROPY_PY_NETWORK (1) +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "W5100S-EVB" // Wiznet HW config. -#define MICROPY_HW_WIZNET_SPI_ID (0) -#define MICROPY_HW_WIZNET_SPI_BAUDRATE (20 * 1000 * 1000) -#define MICROPY_HW_WIZNET_SPI_SCK (18) -#define MICROPY_HW_WIZNET_SPI_MOSI (19) -#define MICROPY_HW_WIZNET_SPI_MISO (16) -#define MICROPY_HW_WIZNET_PIN_CS (17) -#define MICROPY_HW_WIZNET_PIN_RST (20) +#define MICROPY_HW_WIZNET_SPI_ID (0) +#define MICROPY_HW_WIZNET_SPI_BAUDRATE (20 * 1000 * 1000) +#define MICROPY_HW_WIZNET_SPI_SCK (18) +#define MICROPY_HW_WIZNET_SPI_MOSI (19) +#define MICROPY_HW_WIZNET_SPI_MISO (16) +#define MICROPY_HW_WIZNET_PIN_CS (17) +#define MICROPY_HW_WIZNET_PIN_RST (20) // Connecting the INTN pin enables RECV interrupt handling of incoming data. -#define MICROPY_HW_WIZNET_PIN_INTN (21) +#define MICROPY_HW_WIZNET_PIN_INTN (21) diff --git a/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.h b/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.h index 1ad7a0e905327..e8526cdba491f 100644 --- a/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.h +++ b/ports/rp2/boards/W5500_EVB_PICO/mpconfigboard.h @@ -1,19 +1,20 @@ // Board config for Wiznet W5500-EVB-Pico. // Board and hardware specific configuration -#define MICROPY_HW_BOARD_NAME "W5500-EVB-Pico" -#define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024) +#define MICROPY_HW_BOARD_NAME "W5500-EVB-Pico" +#define MICROPY_HW_FLASH_STORAGE_BYTES (1408 * 1024) // Enable networking. -#define MICROPY_PY_NETWORK (1) +#define MICROPY_PY_NETWORK (1) +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "W5500-EVB" // Wiznet HW config. -#define MICROPY_HW_WIZNET_SPI_ID (0) -#define MICROPY_HW_WIZNET_SPI_BAUDRATE (20 * 1000 * 1000) -#define MICROPY_HW_WIZNET_SPI_SCK (18) -#define MICROPY_HW_WIZNET_SPI_MOSI (19) -#define MICROPY_HW_WIZNET_SPI_MISO (16) -#define MICROPY_HW_WIZNET_PIN_CS (17) -#define MICROPY_HW_WIZNET_PIN_RST (20) +#define MICROPY_HW_WIZNET_SPI_ID (0) +#define MICROPY_HW_WIZNET_SPI_BAUDRATE (20 * 1000 * 1000) +#define MICROPY_HW_WIZNET_SPI_SCK (18) +#define MICROPY_HW_WIZNET_SPI_MOSI (19) +#define MICROPY_HW_WIZNET_SPI_MISO (16) +#define MICROPY_HW_WIZNET_PIN_CS (17) +#define MICROPY_HW_WIZNET_PIN_RST (20) // Connecting the INTN pin enables RECV interrupt handling of incoming data. -#define MICROPY_HW_WIZNET_PIN_INTN (21) +#define MICROPY_HW_WIZNET_PIN_INTN (21) diff --git a/ports/rp2/cyw43_configport.h b/ports/rp2/cyw43_configport.h index c17b7a5c523c1..08cded6f1f156 100644 --- a/ports/rp2/cyw43_configport.h +++ b/ports/rp2/cyw43_configport.h @@ -30,6 +30,7 @@ #include "py/mpconfig.h" #include "py/mperrno.h" #include "py/mphal.h" +#include "extmod/modnetwork.h" #include "pendsv.h" #define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "w43439A0_7_95_49_00_combined.h" @@ -48,6 +49,8 @@ #define CYW43_THREAD_EXIT MICROPY_PY_LWIP_EXIT #define CYW43_THREAD_LOCK_CHECK +#define CYW43_HOST_NAME mod_network_hostname + #define CYW43_SDPCM_SEND_COMMON_WAIT \ if (get_core_num() == 0) { \ cyw43_yield(); \ diff --git a/ports/rp2/main.c b/ports/rp2/main.c index c5b50374912c3..570c4302f0e61 100644 --- a/ports/rp2/main.c +++ b/ports/rp2/main.c @@ -42,6 +42,7 @@ #include "modmachine.h" #include "modrp2.h" #include "mpbthciport.h" +#include "mpnetworkport.h" #include "genhdr/mpversion.h" #include "mp_usbd.h" diff --git a/ports/rp2/modrp2.c b/ports/rp2/modrp2.c index 2601a7f443de4..5dfedb9929f4a 100644 --- a/ports/rp2/modrp2.c +++ b/ports/rp2/modrp2.c @@ -29,25 +29,11 @@ #include "modrp2.h" #if MICROPY_PY_NETWORK_CYW43 -#include "lib/cyw43-driver/src/cyw43_country.h" - -extern uint32_t cyw43_country_code; +#include "extmod/modnetwork.h" +#endif -STATIC mp_obj_t rp2_country(size_t n_args, const mp_obj_t *args) { - if (n_args == 0) { - char code[2] = {cyw43_country_code, cyw43_country_code >> 8}; - return mp_obj_new_str(code, 2); - } else { - size_t len; - const char *str = mp_obj_str_get_data(args[0], &len); - if (len != 2) { - mp_raise_ValueError(NULL); - } - cyw43_country_code = CYW43_COUNTRY(str[0], str[1], 0); - return mp_const_none; - } -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(rp2_country_obj, 0, 1, rp2_country); +#if MICROPY_PY_NETWORK_CYW43 +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj); #endif STATIC const mp_rom_map_elem_t rp2_module_globals_table[] = { @@ -57,7 +43,8 @@ STATIC const mp_rom_map_elem_t rp2_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_StateMachine), MP_ROM_PTR(&rp2_state_machine_type) }, #if MICROPY_PY_NETWORK_CYW43 - { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&rp2_country_obj) }, + // Deprecated (use network.country instead). + { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&mod_network_country_obj) }, #endif }; STATIC MP_DEFINE_CONST_DICT(rp2_module_globals, rp2_module_globals_table); diff --git a/ports/rp2/mpconfigport.h b/ports/rp2/mpconfigport.h index 35bc22e55a305..f5391b5a7800b 100644 --- a/ports/rp2/mpconfigport.h +++ b/ports/rp2/mpconfigport.h @@ -141,6 +141,10 @@ // By default networking should include sockets, ssl, websockets, webrepl, dupterm. #if MICROPY_PY_NETWORK +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-rp2" +#endif + #ifndef MICROPY_PY_USOCKET #define MICROPY_PY_USOCKET (1) #endif @@ -263,10 +267,3 @@ typedef intptr_t mp_off_t; extern uint32_t rosc_random_u32(void); extern void lwip_lock_acquire(void); extern void lwip_lock_release(void); - -extern uint32_t cyw43_country_code; -extern void cyw43_irq_init(void); -extern void cyw43_post_poll_hook(void); - -#define CYW43_POST_POLL_HOOK cyw43_post_poll_hook(); -#define MICROPY_CYW43_COUNTRY cyw43_country_code diff --git a/ports/rp2/mpnetworkport.c b/ports/rp2/mpnetworkport.c index 96cd16af0f594..d8e33e229d9f8 100644 --- a/ports/rp2/mpnetworkport.c +++ b/ports/rp2/mpnetworkport.c @@ -40,14 +40,12 @@ static alarm_id_t lwip_alarm_id = -1; #if MICROPY_PY_NETWORK_CYW43 #include "lib/cyw43-driver/src/cyw43.h" -#include "lib/cyw43-driver/src/cyw43_country.h" #include "lib/cyw43-driver/src/cyw43_stats.h" #include "hardware/irq.h" #define CYW43_IRQ_LEVEL GPIO_IRQ_LEVEL_HIGH #define CYW43_SHARED_IRQ_HANDLER_PRIORITY PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY -uint32_t cyw43_country_code = CYW43_COUNTRY_WORLDWIDE; volatile int cyw43_has_pending = 0; static void gpio_irq_handler(void) { diff --git a/ports/rp2/mpnetworkport.h b/ports/rp2/mpnetworkport.h new file mode 100644 index 0000000000000..88c190f45e27d --- /dev/null +++ b/ports/rp2/mpnetworkport.h @@ -0,0 +1,33 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Jim Mussared + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_RP2_MPNETWORKPORT_H +#define MICROPY_INCLUDED_RP2_MPNETWORKPORT_H + +#if MICROPY_PY_NETWORK_CYW43 +extern void cyw43_irq_init(void); +#endif + +#endif // MICROPY_INCLUDED_RP2_MPNETWORKPORT_H diff --git a/ports/stm32/Makefile b/ports/stm32/Makefile index 1fd2757c4ada1..db89b2f4f135f 100644 --- a/ports/stm32/Makefile +++ b/ports/stm32/Makefile @@ -487,10 +487,7 @@ SRC_C += mpbtstackport.c MICROPY_BLUETOOTH_BTSTACK_H4 ?= 1 endif -ifeq ($(MICROPY_PY_NETWORK_CYW43),1) -DRIVERS_SRC_C += drivers/cyw43/cywbt.c -endif -endif +endif # MICROPY_PY_BLUETOOTH # SRC_O should be placed first to work around this LTO bug with binutils <2.35: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83967 diff --git a/ports/stm32/boards/ARDUINO_PORTENTA_H7/mpconfigboard.h b/ports/stm32/boards/ARDUINO_PORTENTA_H7/mpconfigboard.h index a2981352a1b80..986ed2b877c72 100644 --- a/ports/stm32/boards/ARDUINO_PORTENTA_H7/mpconfigboard.h +++ b/ports/stm32/boards/ARDUINO_PORTENTA_H7/mpconfigboard.h @@ -9,6 +9,8 @@ #define MICROPY_PY_SYS_PLATFORM "Portenta" #define MICROPY_HW_FLASH_FS_LABEL "portenta" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "Portenta" + #define MICROPY_OBJ_REPR (MICROPY_OBJ_REPR_C) #define UINT_FMT "%u" #define INT_FMT "%d" diff --git a/ports/stm32/boards/ARDUINO_PORTENTA_H7/stm32h747.ld b/ports/stm32/boards/ARDUINO_PORTENTA_H7/stm32h747.ld index 7a973289cb6bb..d5bd9598f9820 100644 --- a/ports/stm32/boards/ARDUINO_PORTENTA_H7/stm32h747.ld +++ b/ports/stm32/boards/ARDUINO_PORTENTA_H7/stm32h747.ld @@ -44,24 +44,4 @@ _micropy_hw_internal_flash_storage_ram_cache_end = ORIGIN(DTCM) + LENGTH(DTCM); _micropy_hw_internal_flash_storage_start = ORIGIN(FLASH_FS); _micropy_hw_internal_flash_storage_end = ORIGIN(FLASH_FS) + LENGTH(FLASH_FS); -REGION_ALIAS("FLASH_COMMON", FLASH_TEXT); - -/* define output sections */ -SECTIONS -{ - INCLUDE common_isr.ld - - .text : - { - . = ALIGN(4); - *(.text*) - *(.rodata*) - . = ALIGN(512); - *(.big_const*) - . = ALIGN(4); - _etext = .; - } >FLASH_TEXT - - INCLUDE common_extratext_data_in_flash.ld - INCLUDE common_bss_heap_stack.ld -} +INCLUDE common_blifs.ld diff --git a/ports/stm32/boards/PYBD_SF2/f722_qspi.ld b/ports/stm32/boards/PYBD_SF2/f722_qspi.ld index 85145b22a326d..6ce4c74c3f34f 100644 --- a/ports/stm32/boards/PYBD_SF2/f722_qspi.ld +++ b/ports/stm32/boards/PYBD_SF2/f722_qspi.ld @@ -7,7 +7,7 @@ FLASH_APP .text FLASH_APP .data - FLASH_EXT .big_const + FLASH_EXT .text_ext RAM .data RAM .bss @@ -40,10 +40,6 @@ _ram_end = ORIGIN(RAM) + LENGTH(RAM); _heap_start = _ebss; /* heap starts just after statically allocated memory */ _heap_end = _sstack; -ENTRY(Reset_Handler) - -REGION_ALIAS("FLASH_COMMON", FLASH_APP); - /* Define output sections */ SECTIONS { @@ -53,13 +49,10 @@ SECTIONS *lib/btstack/*(.text* .rodata*) *lib/mbedtls/*(.text* .rodata*) *lib/mynewt-nimble/*(.text* .rodata*) - . = ALIGN(512); - *(.big_const*) + *lib/cyw43-driver/*(.rodata.w4343*_combined) + *drivers/cyw43/*(.rodata.cyw43_btfw_*) . = ALIGN(4); } >FLASH_EXT - - INCLUDE common_isr.ld - INCLUDE common_text.ld - INCLUDE common_extratext_data_in_flash.ld - INCLUDE common_bss_heap_stack.ld } + +INCLUDE common_bl.ld diff --git a/ports/stm32/boards/PYBD_SF2/mpconfigboard.h b/ports/stm32/boards/PYBD_SF2/mpconfigboard.h index 6dfb8c38d23a2..09736d8bd78f2 100644 --- a/ports/stm32/boards/PYBD_SF2/mpconfigboard.h +++ b/ports/stm32/boards/PYBD_SF2/mpconfigboard.h @@ -27,6 +27,8 @@ #define MICROPY_HW_BOARD_NAME "PYBD-SF2W" #define MICROPY_HW_MCU_NAME "STM32F722IEK" +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "PYBD" + #define MICROPY_PY_PYB_LEGACY (1) #define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0) #define MICROPY_HW_HAS_SWITCH (1) diff --git a/ports/stm32/boards/PYBD_SF6/f767.ld b/ports/stm32/boards/PYBD_SF6/f767.ld index cbe74696e8830..167d2c6a1e411 100644 --- a/ports/stm32/boards/PYBD_SF6/f767.ld +++ b/ports/stm32/boards/PYBD_SF6/f767.ld @@ -5,7 +5,6 @@ FLASH_APP .isr_vector FLASH_APP .text - FLASH_APP .big_const FLASH_APP .data RAM .data @@ -39,26 +38,4 @@ _ram_end = ORIGIN(RAM) + LENGTH(RAM); _heap_start = _ebss; /* heap starts just after statically allocated memory */ _heap_end = _sstack; -ENTRY(Reset_Handler) - -REGION_ALIAS("FLASH_COMMON", FLASH_APP); - -/* Define output sections */ -SECTIONS -{ - INCLUDE common_isr.ld - - .text : - { - . = ALIGN(4); - *(.text*) - *(.rodata*) - . = ALIGN(512); - *(.big_const*) - . = ALIGN(4); - _etext = .; - } >FLASH_APP - - INCLUDE common_extratext_data_in_flash.ld - INCLUDE common_bss_heap_stack.ld -} +INCLUDE common_bl.ld diff --git a/ports/stm32/cyw43_configport.h b/ports/stm32/cyw43_configport.h new file mode 100644 index 0000000000000..666dfc43e27e4 --- /dev/null +++ b/ports/stm32/cyw43_configport.h @@ -0,0 +1,135 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Damien P. George + * Copyright (c) 2022 Jim Mussared + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_STM32_CYW43_CONFIGPORT_H +#define MICROPY_INCLUDED_STM32_CYW43_CONFIGPORT_H + +// The board-level config will be included here, so it can set some CYW43 values. +#include "py/mpconfig.h" +#include "py/mperrno.h" +#include "py/mphal.h" +#include "extmod/modnetwork.h" +#include "pendsv.h" +#include "sdio.h" + +#define CYW43_USE_SPI (0) +#define CYW43_LWIP (1) +#define CYW43_USE_STATS (0) + +#define CYW43_CHIPSET_FIRMWARE_INCLUDE_FILE "lib/cyw43-driver/firmware/w4343WA1_7_45_98_50_combined.h" +#define CYW43_WIFI_NVRAM_INCLUDE_FILE "lib/cyw43-driver/firmware/wifi_nvram_1dx.h" +#define CYW43_IOCTL_TIMEOUT_US (1000000) +#define CYW43_SLEEP_MAX (50) +#define CYW43_NETUTILS (1) +#define CYW43_CLEAR_SDIO_INT (1) + +#define CYW43_EPERM MP_EPERM // Operation not permitted +#define CYW43_EIO MP_EIO // I/O error +#define CYW43_EINVAL MP_EINVAL // Invalid argument +#define CYW43_ETIMEDOUT MP_ETIMEDOUT // Connection timed out + +#define CYW43_THREAD_ENTER MICROPY_PY_LWIP_ENTER +#define CYW43_THREAD_EXIT MICROPY_PY_LWIP_EXIT +#define CYW43_THREAD_LOCK_CHECK + +#define CYW43_HOST_NAME mod_network_hostname + +#define CYW43_SDPCM_SEND_COMMON_WAIT __WFI(); +#define CYW43_DO_IOCTL_WAIT __WFI(); + +#define CYW43_ARRAY_SIZE(a) MP_ARRAY_SIZE(a) + +#define CYW43_HAL_PIN_MODE_INPUT MP_HAL_PIN_MODE_INPUT +#define CYW43_HAL_PIN_MODE_OUTPUT MP_HAL_PIN_MODE_OUTPUT +#define CYW43_HAL_PIN_PULL_NONE MP_HAL_PIN_PULL_NONE +#define CYW43_HAL_PIN_PULL_UP MP_HAL_PIN_PULL_UP +#define CYW43_HAL_PIN_PULL_DOWN MP_HAL_PIN_PULL_DOWN + +#define CYW43_HAL_MAC_WLAN0 MP_HAL_MAC_WLAN0 + +#define cyw43_hal_ticks_us mp_hal_ticks_us +#define cyw43_hal_ticks_ms mp_hal_ticks_ms + +#define cyw43_hal_pin_obj_t mp_hal_pin_obj_t +#define cyw43_hal_pin_config mp_hal_pin_config +#define cyw43_hal_pin_read mp_hal_pin_read +#define cyw43_hal_pin_low mp_hal_pin_low +#define cyw43_hal_pin_high mp_hal_pin_high + +#define cyw43_hal_get_mac mp_hal_get_mac +#define cyw43_hal_get_mac_ascii mp_hal_get_mac_ascii +#define cyw43_hal_generate_laa_mac mp_hal_generate_laa_mac + +#define CYW43_PIN_WL_REG_ON pyb_pin_WL_REG_ON +#define CYW43_PIN_WL_HOST_WAKE pyb_pin_WL_HOST_WAKE +#define CYW43_PIN_WL_RFSW_VDD pyb_pin_WL_RFSW_VDD +#define CYW43_PIN_WL_SDIO_1 pyb_pin_WL_SDIO_1 + +#define cyw43_schedule_internal_poll_dispatch(func) pendsv_schedule_dispatch(PENDSV_DISPATCH_CYW43, func) + +void cyw43_post_poll_hook(void); + +static inline void cyw43_delay_us(uint32_t us) { + uint32_t start = mp_hal_ticks_us(); + while (mp_hal_ticks_us() - start < us) { + } +} + +static inline void cyw43_delay_ms(uint32_t ms) { + uint32_t us = ms * 1000; + uint32_t start = mp_hal_ticks_us(); + while (mp_hal_ticks_us() - start < us) { + MICROPY_EVENT_POLL_HOOK; + } +} + +static inline void cyw43_sdio_init(void) { + sdio_init(NVIC_EncodePriority(NVIC_PRIORITYGROUP_4, 14, 0)); +} + +static inline void cyw43_sdio_reinit(void) { + sdio_reenable(); +} + +static inline void cyw43_sdio_deinit(void) { + sdio_deinit(); +} + +static inline void cyw43_sdio_set_irq(bool enable) { + sdio_enable_irq(enable); +} + +static inline int cyw43_sdio_transfer(uint32_t cmd, uint32_t arg, uint32_t *resp) { + return sdio_transfer(cmd, arg, resp); +} + +static inline int cyw43_sdio_transfer_cmd53(bool write, uint32_t block_size, uint32_t arg, size_t len, uint8_t *buf) { + return sdio_transfer_cmd53(write, block_size, arg, len, buf); +} + +#define CYW43_EVENT_POLL_HOOK MICROPY_EVENT_POLL_HOOK + +#endif // MICROPY_INCLUDED_STM32_CYW43_CONFIGPORT_H diff --git a/ports/stm32/eth.c b/ports/stm32/eth.c index be418235e13d4..1207a728c388a 100644 --- a/ports/stm32/eth.c +++ b/ports/stm32/eth.c @@ -737,7 +737,7 @@ STATIC void eth_lwip_init(eth_t *self) { n->name[0] = 'e'; n->name[1] = '0'; netif_add(n, &ipconfig[0], &ipconfig[1], &ipconfig[2], self, eth_netif_init, ethernet_input); - netif_set_hostname(n, "MPY"); + netif_set_hostname(n, mod_network_hostname); netif_set_default(n); netif_set_up(n); diff --git a/ports/stm32/extint.c b/ports/stm32/extint.c index fd7950de3e953..e2605609254a8 100644 --- a/ports/stm32/extint.c +++ b/ports/stm32/extint.c @@ -36,6 +36,11 @@ #include "extint.h" #include "irq.h" +#if MICROPY_PY_NETWORK_CYW43 && defined(pyb_pin_WL_HOST_WAKE) +#include "lib/cyw43-driver/src/cyw43.h" +#include "lib/cyw43-driver/src/cyw43_stats.h" +#endif + /// \moduleref pyb /// \class ExtInt - configure I/O pins to interrupt on external events /// @@ -690,9 +695,9 @@ void Handle_EXTI_Irq(uint32_t line) { 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); + CYW43_STAT_INC(IRQ_COUNT); } return; } diff --git a/ports/stm32/factoryreset.c b/ports/stm32/factoryreset.c index 10eb3a17a7eb3..2ac656db5950f 100644 --- a/ports/stm32/factoryreset.c +++ b/ports/stm32/factoryreset.c @@ -42,12 +42,16 @@ static const char fresh_boot_py[] = "\r\n" "import machine\r\n" "import pyb\r\n" - "pyb.country('US') # ISO 3166-1 Alpha-2 code, eg US, GB, DE, AU\r\n" "#pyb.main('main.py') # main script to run after this one\r\n" #if MICROPY_HW_ENABLE_USB "#pyb.usb_mode('VCP+MSC') # act as a serial and a storage device\r\n" "#pyb.usb_mode('VCP+HID') # act as a serial device and a mouse\r\n" #endif +#if MICROPY_PY_NETWORK + "#import network\r\n" + "#network.country('US') # ISO 3166-1 Alpha-2 code, eg US, GB, DE, AU or XX for worldwide\r\n" + "#network.hostname('...') # DHCP/mDNS hostname\r\n" +#endif ; static const char fresh_main_py[] = diff --git a/ports/stm32/main.c b/ports/stm32/main.c index 7f864a018c2ac..66dcb86ddc682 100644 --- a/ports/stm32/main.c +++ b/ports/stm32/main.c @@ -48,7 +48,9 @@ #if MICROPY_PY_LWIP #include "lwip/init.h" #include "lwip/apps/mdns.h" -#include "drivers/cyw43/cyw43.h" +#if MICROPY_PY_NETWORK_CYW43 +#include "lib/cyw43-driver/src/cyw43.h" +#endif #endif #if MICROPY_PY_BLUETOOTH diff --git a/ports/stm32/modpyb.c b/ports/stm32/modpyb.c index 7f87dd5820ec6..94aa6e65d1be6 100644 --- a/ports/stm32/modpyb.c +++ b/ports/stm32/modpyb.c @@ -52,11 +52,10 @@ #include "usb.h" #include "portmodules.h" #include "modmachine.h" +#include "extmod/modnetwork.h" #include "extmod/vfs.h" #include "extmod/utime_mphal.h" -char pyb_country_code[2]; - #if MICROPY_PY_PYB STATIC mp_obj_t pyb_fault_debug(mp_obj_t value) { @@ -115,21 +114,18 @@ STATIC mp_obj_t pyb_repl_uart(size_t n_args, const mp_obj_t *args) { } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_repl_uart_obj, 0, 1, pyb_repl_uart); +#if MICROPY_PY_NETWORK +MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj); +#else +// Provide a no-op version of pyb.country for backwards compatibility on +// boards that don't support networking. STATIC mp_obj_t pyb_country(size_t n_args, const mp_obj_t *args) { - if (n_args == 0) { - return mp_obj_new_str(pyb_country_code, 2); - } else { - size_t len; - const char *str = mp_obj_str_get_data(args[0], &len); - if (len != 2) { - mp_raise_ValueError(NULL); - } - pyb_country_code[0] = str[0]; - pyb_country_code[1] = str[1]; - return mp_const_none; - } + (void)n_args; + (void)args; + return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_country_obj, 0, 1, pyb_country); +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_network_country_obj, 0, 1, pyb_country); +#endif STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_pyb) }, @@ -160,7 +156,9 @@ STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = { #endif { MP_ROM_QSTR(MP_QSTR_main), MP_ROM_PTR(&pyb_main_obj) }, { MP_ROM_QSTR(MP_QSTR_repl_uart), MP_ROM_PTR(&pyb_repl_uart_obj) }, - { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&pyb_country_obj) }, + + // Deprecated (use network.country instead). + { MP_ROM_QSTR(MP_QSTR_country), MP_ROM_PTR(&mod_network_country_obj) }, #if MICROPY_HW_ENABLE_USB { MP_ROM_QSTR(MP_QSTR_usb_mode), MP_ROM_PTR(&pyb_usb_mode_obj) }, diff --git a/ports/stm32/mpconfigport.h b/ports/stm32/mpconfigport.h index 18521ef1d8cdf..ee12ab8140583 100644 --- a/ports/stm32/mpconfigport.h +++ b/ports/stm32/mpconfigport.h @@ -290,6 +290,10 @@ static inline mp_uint_t disable_irq(void) { #define MICROPY_PY_LWIP_REENTER MICROPY_PY_PENDSV_REENTER #define MICROPY_PY_LWIP_EXIT MICROPY_PY_PENDSV_EXIT +#ifndef MICROPY_PY_NETWORK_HOSTNAME_DEFAULT +#define MICROPY_PY_NETWORK_HOSTNAME_DEFAULT "mpy-stm32" +#endif + #if MICROPY_PY_BLUETOOTH_USE_SYNC_EVENTS // Bluetooth code only runs in the scheduler, no locking/mutex required. #define MICROPY_PY_BLUETOOTH_ENTER uint32_t atomic_state = 0; diff --git a/ports/stm32/mpnetworkport.c b/ports/stm32/mpnetworkport.c index 1ce758e7dd78a..62f780a35a042 100644 --- a/ports/stm32/mpnetworkport.c +++ b/ports/stm32/mpnetworkport.c @@ -42,8 +42,11 @@ #include "lwip/dns.h" #include "lwip/dhcp.h" #include "lwip/apps/mdns.h" + +#if MICROPY_PY_NETWORK_CYW43 #include "extmod/network_cyw43.h" -#include "drivers/cyw43/cyw43.h" +#include "lib/cyw43-driver/src/cyw43.h" +#endif // Poll lwIP every 128ms #define LWIP_TICK(tick) (((tick) & ~(SYSTICK_DISPATCH_NUM_SLOTS - 1) & 0x7f) == 0)