diff options
| author | Glenn Ruben Bakke <glennbakke@gmail.com> | 2017-04-09 18:53:58 +0200 |
|---|---|---|
| committer | Glenn Ruben Bakke <glennbakke@gmail.com> | 2017-04-09 18:53:58 +0200 |
| commit | d7cfae3639b681b1a25db1bec104e04cad07b508 (patch) | |
| tree | 14e39c5ae3f3c61ed6cea58b495144e25a9fd033 | |
| parent | 4dd86178bc7981ca8b8cf4548c61733125f0ff1a (diff) | |
nrf5/usocket: Removing network modules related to Bluetooth 6lowpan implementation as it depends on SDK libraries for now. Will be moved to seperate working branch.
| -rw-r--r-- | nrf5/Makefile | 3 | ||||
| -rw-r--r-- | nrf5/bluetooth/bluetooth_common.mk | 2 | ||||
| -rw-r--r-- | nrf5/bluetooth/iot_0.9.0/build.mk | 118 | ||||
| -rw-r--r-- | nrf5/bluetooth/iot_0.9.0/modnwble6lowpan.c | 217 | ||||
| -rw-r--r-- | nrf5/bluetooth/iot_0.9.0/sdk.mk | 12 | ||||
| -rw-r--r-- | nrf5/bluetooth/iot_0.9.0/sdk_config.h | 46 | ||||
| -rw-r--r-- | nrf5/bluetooth/iot_0.9.0/sdkhelp.c | 256 | ||||
| -rw-r--r-- | nrf5/bluetooth/iot_0.9.0/sdkhelp.h | 27 | ||||
| -rw-r--r-- | nrf5/bluetooth_conf.h | 13 | ||||
| -rw-r--r-- | nrf5/boards/microbit/mpconfigboard.h | 3 | ||||
| -rw-r--r-- | nrf5/boards/nrf52832_512k_64k_s1xx.ld | 27 | ||||
| -rw-r--r-- | nrf5/boards/pca10028/mpconfigboard.h | 3 | ||||
| -rw-r--r-- | nrf5/boards/pca10040/mpconfigboard_s1xx.mk | 6 | ||||
| -rw-r--r-- | nrf5/main.c | 5 | ||||
| -rw-r--r-- | nrf5/modules/network/modnetwork.c | 97 | ||||
| -rw-r--r-- | nrf5/modules/network/modnetwork.h | 81 | ||||
| -rw-r--r-- | nrf5/modules/usocket/modusocket.c | 480 | ||||
| -rw-r--r-- | nrf5/mpconfigport.h | 27 |
18 files changed, 1 insertions, 1422 deletions
diff --git a/nrf5/Makefile b/nrf5/Makefile index 511fe4c46..409a6c4c8 100644 --- a/nrf5/Makefile +++ b/nrf5/Makefile @@ -62,7 +62,6 @@ INC += -I./hal INC += -I./hal/$(MCU_VARIANT) INC += -I./modules/display INC += -I./modules/machine -INC += -I./modules/network INC += -I./modules/ubluepy INC += -I../lib/mp-readline @@ -148,8 +147,6 @@ DRIVERS_SRC_C += $(addprefix modules/,\ machine/pwm.c \ machine/led.c \ machine/temp.c \ - usocket/modusocket.c \ - network/modnetwork.c \ uos/moduos.c \ utime/modutime.c \ pyb/modpyb.c \ diff --git a/nrf5/bluetooth/bluetooth_common.mk b/nrf5/bluetooth/bluetooth_common.mk index 74a367d8e..21aa9bafb 100644 --- a/nrf5/bluetooth/bluetooth_common.mk +++ b/nrf5/bluetooth/bluetooth_common.mk @@ -16,8 +16,6 @@ else ifeq ($(SD), s132) CFLAGS += -DBLUETOOTH_SD_DEBUG=1 CFLAGS += -DBLUETOOTH_SD=132 SOFTDEV_HEX_NAME = s132_nrf52_3.0.0_softdevice.hex -#else ifeq ($(SD), s1xx) -# include bluetooth/iot_0.9.0/sdk.mk else $(error Incorrect softdevice set flag) endif diff --git a/nrf5/bluetooth/iot_0.9.0/build.mk b/nrf5/bluetooth/iot_0.9.0/build.mk deleted file mode 100644 index 763aa5a42..000000000 --- a/nrf5/bluetooth/iot_0.9.0/build.mk +++ /dev/null @@ -1,118 +0,0 @@ -# this file's folder -SDK_DIR := $(SDK_ROOT) - -# -D<define> in CFLAGS -DEFINES += __HEAP_SIZE=0 -DEFINES += BLE_STACK_SUPPORT_REQD -DEFINES += CONFIG_GPIO_AS_PINRESET -DEFINES += NRF52 -DEFINES += NRF52_PAN_12 -DEFINES += NRF52_PAN_15 -DEFINES += NRF52_PAN_20 -DEFINES += NRF52_PAN_30 -DEFINES += NRF52_PAN_31 -DEFINES += NRF52_PAN_36 -DEFINES += NRF52_PAN_51 -DEFINES += NRF52_PAN_53 -DEFINES += NRF52_PAN_54 -DEFINES += NRF52_PAN_55 -DEFINES += NRF52_PAN_58 -DEFINES += NRF52_PAN_62 -DEFINES += NRF52_PAN_63 -DEFINES += NRF52_PAN_64 -DEFINES += s1xx -DEFINES += SOFTDEVICE_PRESENT -DEFINES += SWI_DISABLE0 -DEFINES += NRF_SD_BLE_API_VERSION=3 -DEFINES += PEER_MANAGER_ENABLED=1 -DEFINES += FDS_ENABLED=1 -DEFINES += LWIP_DEBUG=0 - -# nordic SDK C sources (relative path) -SDK_SRC_C += \ - components/ble/common/ble_advdata.c \ - components/ble/common/ble_conn_params.c \ - components/ble/common/ble_srv_common.c \ - components/libraries/fifo/app_fifo.c \ - components/libraries/timer/app_timer.c \ - components/libraries/util/app_util_platform.c \ - components/softdevice/common/softdevice_handler/softdevice_handler.c \ - components/drivers_nrf/clock/nrf_drv_clock.c \ - components/libraries/util/app_error.c \ - components/drivers_nrf/common/nrf_drv_common.c \ - components/libraries/mem_manager/mem_manager.c \ - components/libraries/trace/app_trace.c \ - components/iot/context_manager/iot_context_manager.c \ - components/iot/iot_timer/iot_timer.c \ - external/lwip/src/core/def.c \ - external/lwip/src/core/dhcp.c \ - external/lwip/src/core/ipv6/dhcp6.c \ - external/lwip/src/core/dns.c \ - external/lwip/src/core/ipv4/icmp.c \ - external/lwip/src/core/ipv6/icmp6.c \ - external/lwip/src/core/ipv6/inet6.c \ - external/lwip/src/core/inet_chksum.c \ - external/lwip/src/core/init.c \ - external/lwip/src/core/ipv4/ip4.c \ - external/lwip/src/core/ipv4/ip4_addr.c \ - external/lwip/src/core/ipv6/ip6.c \ - external/lwip/src/core/ipv6/ip6_addr.c \ - external/lwip/src/core/memp.c \ - external/lwip/src/core/ipv6/mld6.c \ - external/lwip/src/core/ipv6/nd6.c \ - external/lwip/src/core/netif.c \ - external/lwip/src/port/nrf_platform_port.c \ - external/lwip/src/core/pbuf.c \ - external/lwip/src/core/raw.c \ - external/lwip/src/core/sys.c \ - external/lwip/src/core/tcp.c \ - external/lwip/src/core/tcp_in.c \ - external/lwip/src/core/tcp_out.c \ - external/lwip/src/core/timers.c \ - external/lwip/src/core/udp.c \ - -# include source folders (sort removes duplicates) -SDK_INC_DIRS += $(sort $(dir $(SDK_SRC_C))) -# nrf_drv_config.h -SDK_INC_DIRS += components/drivers_nrf/config -# app_util.h -SDK_INC_DIRS += components/libraries/util -# nrf_log.h -SDK_INC_DIRS += components/libraries/log/ -# nrf_log_internal.h -SDK_INC_DIRS += components/libraries/log/src -# nrf_clock.h -SDK_INC_DIRS += components/drivers_nrf/hal -# nrf_drv_common.h -SDK_INC_DIRS += components/drivers_nrf/common -# nrf_delay.h -SDK_INC_DIRS += components/drivers_nrf/delay -# ble_6lowpan.h -SDK_INC_DIRS += components/iot/ble_6lowpan -# ble_ipsp.h -SDK_INC_DIRS += components/iot/ble_ipsp -# iot_defines.h -SDK_INC_DIRS += components/iot/common -# SDK lwip includes -SDK_INC_DIRS += external/lwip/src/port/arch -SDK_INC_DIRS += external/lwip/src/include -SDK_INC_DIRS += external/lwip/src/include/netif -SDK_INC_DIRS += external/lwip/src/port -SDK_INC_DIRS += external/lwip/src/include/lwip - -LIBS += $(SDK_ROOT)/components/iot/ble_6lowpan/lib/ble_6lowpan.a - -CFLAGS += $(patsubst %,-D%,${DEFINES}) - -# include full path -INC += $(patsubst %,-I${SDK_DIR}/%, ${SDK_INC_DIRS}) - -# additional SDK source files -SRC_C += $(addprefix ${SDK_ROOT}/, $(SDK_SRC_C)) - -# Wrappers -SRC_C += \ - $(SDK_MODULES_PATH)sdkhelp.c \ - $(SDK_MODULES_PATH)modnwble6lowpan.c \ - - diff --git a/nrf5/bluetooth/iot_0.9.0/modnwble6lowpan.c b/nrf5/bluetooth/iot_0.9.0/modnwble6lowpan.c deleted file mode 100644 index f8b3be89f..000000000 --- a/nrf5/bluetooth/iot_0.9.0/modnwble6lowpan.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2016 Glenn Ruben Bakke - * - * 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 "bluetooth_conf.h" - -#if MICROPY_PY_BLE_6LOWPAN - -#include "lwip/ip6_addr.h" -#include "lwip/udp.h" - -#ifdef MAX -#undef MAX -#endif - -#ifdef MIN -#undef MIN -#endif - -#include <stdio.h> -#include <stdint.h> -#include <string.h> - -#include "py/nlr.h" -#include "py/objlist.h" -#include "py/runtime.h" -#include "py/mperrno.h" -#include "py/mphal.h" -#include "netutils.h" -#include "modnetwork.h" -#include "pin.h" -#include "genhdr/pins.h" -#include "lwip/ip6_addr.h" -#include "lwip/udp.h" - -/// \moduleref network - -typedef struct _ble_6lowpan_obj_t { - mp_obj_base_t base; -} ble_6lowpan_obj_t; - -STATIC ble_6lowpan_obj_t ble_6lowpan_obj; - - - -STATIC int ble_6lowpan_gethostbyname(mp_obj_t nic, const char *name, mp_uint_t len, uint8_t *out_ip) { - return MP_ENOENT; -} - -STATIC int ble_6lowpan_socket_socket(mod_network_socket_obj_t *socket, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -STATIC void ble_6lowpan_socket_close(mod_network_socket_obj_t *socket) { -} - -STATIC int ble_6lowpan_socket_bind(mod_network_socket_obj_t *socket, byte *ip, mp_uint_t port, int *_errno) { - err_t err; - socket->p_socket = udp_new_ip6(); - if (socket->p_socket) { - - - err = udp_bind_ip6(socket->p_socket, ip, port); - if (err != ERR_OK) { - *_errno = err; - udp_remove(socket->p_socket); - } - } - - return 0; -} - -STATIC int ble_6lowpan_socket_listen(mod_network_socket_obj_t *socket, mp_int_t backlog, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -STATIC int ble_6lowpan_socket_accept(mod_network_socket_obj_t *socket, mod_network_socket_obj_t *socket2, byte *ip, mp_uint_t *port, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -STATIC int ble_6lowpan_socket_connect(mod_network_socket_obj_t *socket, byte *ip, mp_uint_t port, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -STATIC mp_uint_t ble_6lowpan_socket_send(mod_network_socket_obj_t *socket, const byte *buf, mp_uint_t len, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -STATIC mp_uint_t ble_6lowpan_socket_recv(mod_network_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -#include "netutils/netutils.h" - -STATIC mp_uint_t ble_6lowpan_socket_sendto(mod_network_socket_obj_t *socket, const byte *buf, mp_uint_t len, byte *ip, mp_uint_t port, int *_errno) { - - struct pbuf * lwip_buffer = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM); - memcpy(lwip_buffer->payload, buf, len); - - printf("Sendto\n"); - - err_t err = udp_sendto_ip6(socket->p_socket, - lwip_buffer, - ip, - port); - - printf("dest: %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", - ip[0], ip[1], ip[2], ip[3], - ip[4], ip[5], ip[6], ip[7], - ip[8], ip[9], ip[10], ip[11], - ip[12], ip[13], ip[14], ip[15]); - - printf("port: %x\n", port); - printf("len: %d\n", len); - - if (err != ERR_OK) { - *_errno = err; - } - - return 0; -} - -STATIC mp_uint_t ble_6lowpan_socket_recvfrom(mod_network_socket_obj_t *socket, byte *buf, mp_uint_t len, byte *ip, mp_uint_t *port, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -STATIC int ble_6lowpan_socket_setsockopt(mod_network_socket_obj_t *socket, mp_uint_t level, mp_uint_t opt, const void *optval, mp_uint_t optlen, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -STATIC int ble_6lowpan_socket_settimeout(mod_network_socket_obj_t *socket, mp_uint_t timeout_ms, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -STATIC int ble_6lowpan_socket_ioctl(mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno) { - *_errno = MP_EINVAL; - return -1; -} - -#include "sdkhelp.h" - -/******************************************************************************/ -// Micro Python bindings - -/// \classmethod \constructor -/// Create and return a BLE 6LoWPAN object. -STATIC mp_obj_t ble_6lowpan_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { - // check arguments - //mp_arg_check_num(n_args, n_kw, 0, 0, false); - - // init the BLE 6lowpan object - ble_6lowpan_obj.base.type = (mp_obj_type_t*)&mod_network_nic_type_ble_6lowpan; - - // blocking call to wait for connection with peer. - transport_init(); - - // regiser NIC with network module - mod_network_register_nic(&ble_6lowpan_obj); - - // return BLE 6LoWPAN object - return &ble_6lowpan_obj; -} - -const mod_network_nic_type_t mod_network_nic_type_ble_6lowpan = { - .base = { - { &mp_type_type }, - .name = MP_QSTR_BLE6LOWPAN, - .make_new = ble_6lowpan_make_new, - }, - .gethostbyname = ble_6lowpan_gethostbyname, - .socket = ble_6lowpan_socket_socket, - .close = ble_6lowpan_socket_close, - .bind = ble_6lowpan_socket_bind, - .listen = ble_6lowpan_socket_listen, - .accept = ble_6lowpan_socket_accept, - .connect = ble_6lowpan_socket_connect, - .send = ble_6lowpan_socket_send, - .recv = ble_6lowpan_socket_recv, - .sendto = ble_6lowpan_socket_sendto, - .recvfrom = ble_6lowpan_socket_recvfrom, - .setsockopt = ble_6lowpan_socket_setsockopt, - .settimeout = ble_6lowpan_socket_settimeout, - .ioctl = ble_6lowpan_socket_ioctl, -}; - -#endif diff --git a/nrf5/bluetooth/iot_0.9.0/sdk.mk b/nrf5/bluetooth/iot_0.9.0/sdk.mk deleted file mode 100644 index 26544f2fc..000000000 --- a/nrf5/bluetooth/iot_0.9.0/sdk.mk +++ /dev/null @@ -1,12 +0,0 @@ - -INC += -I./$(SDK_MODULES_PATH) - -include $(SDK_MODULES_PATH)build.mk - -INC += -I$(SDK_ROOT)components/softdevice/s1xx_iot/headers -INC += -I$(SDK_ROOT)components/softdevice/s1xx_iot/headers/nrf52 -CFLAGS += -DBLUETOOTH_SD=100 -CFLAGS += -DBLUETOOTH_SD_DEBUG=1 - -# softdevice .hex file -SOFTDEV_HEX ?= $(lastword $(wildcard $(SDK_ROOT)/components/softdevice/s1xx_iot/s1xx*softdevice.hex)) diff --git a/nrf5/bluetooth/iot_0.9.0/sdk_config.h b/nrf5/bluetooth/iot_0.9.0/sdk_config.h deleted file mode 100644 index fa851f540..000000000 --- a/nrf5/bluetooth/iot_0.9.0/sdk_config.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2016 Glenn Ruben Bakke - * - * 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 SDK_CONFIG_H__ -#define SDK_CONFIG_H__ - -#define MEMORY_MANAGER_SMALL_BLOCK_COUNT (8) -#define MEMORY_MANAGER_SMALL_BLOCK_SIZE (128) -#define MEMORY_MANAGER_MEDIUM_BLOCK_COUNT (4) -#define MEMORY_MANAGER_MEDIUM_BLOCK_SIZE (256) -#define MEMORY_MANAGER_LARGE_BLOCK_COUNT (3) -#define MEMORY_MANAGER_LARGE_BLOCK_SIZE (1024) -#define MEM_MANAGER_ENABLE_LOGS (0) -#define MEM_MANAGER_DISABLE_API_PARAM_CHECK (0) -#define IOT_CONTEXT_MANAGER_ENABLE_LOGS (0) -#define IOT_CONTEXT_MANAGER_DISABLE_API_PARAM_CHECK (0) -#define IOT_CONTEXT_MANAGER_MAX_CONTEXTS (16) -#define IOT_CONTEXT_MANAGER_MAX_TABLES (1) -#define NRF_LWIP_DRIVER_ENABLE_LOGS (0) -#define IOT_TIMER_RESOLUTION_IN_MS (100) -#define IOT_TIMER_DISABLE_API_PARAM_CHECK (0) - -#endif // SDK_CONFIG_H__ diff --git a/nrf5/bluetooth/iot_0.9.0/sdkhelp.c b/nrf5/bluetooth/iot_0.9.0/sdkhelp.c deleted file mode 100644 index f3b1bf799..000000000 --- a/nrf5/bluetooth/iot_0.9.0/sdkhelp.c +++ /dev/null @@ -1,256 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2016 Glenn Ruben Bakke - * - * 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 <stdbool.h> - -#include "softdevice_handler.h" -#include "app_trace.h" -#include "app_timer_appsh.h" -#include "ble_advdata.h" -#include "ble_srv_common.h" -#include "ble_ipsp.h" -#include "ble_6lowpan.h" -#include "mem_manager.h" -#include "app_trace.h" -#include "lwip/init.h" -#include "lwip/inet6.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/netif.h" -#include "lwip/timers.h" -#include "nrf_platform_port.h" -#include "app_util_platform.h" -#include "ble_gap.h" -#include "sdkhelp.h" -#include "mpconfigport.h" -#include "app_timer_appsh.h" -#include "iot_timer.h" - -#include "iot_defines.h" - -eui64_t eui64_local_iid; - -bool m_interface_up = false; - -void nrf_driver_interface_up(void) -{ - // sys_check_timeouts(); - m_interface_up = true; -} - -void nrf_driver_interface_down(void) -{ - m_interface_up = false; -} - -#define DEVICE_NAME "MPY_IPv6" -#define APP_ADV_TIMEOUT (0) // disable timeout -#define APP_ADV_ADV_INTERVAL MSEC_TO_UNITS(333, UNIT_0_625_MS) -#define IOT_TIMER_RESOLUTION_IN_MS 100 -#define LWIP_SYS_TICK_MS 100 -#define APP_TIMER_PRESCALER 31 // Value of the RTC1 PRESCALER register. */ -#define APP_TIMER_MAX_TIMERS 1 -#define APP_TIMER_OP_QUEUE_SIZE 5 - -APP_TIMER_DEF(m_iot_timer_tick_src_id); - -static ble_gap_adv_params_t m_adv_params; -static ble_gap_addr_t m_local_ble_addr; - -static void app_lwip_time_tick(iot_timer_time_in_ms_t wall_clock_value) -{ - sys_check_timeouts(); -} - -static void iot_timer_init(void) -{ - uint32_t err_code; - - static const iot_timer_client_t list_of_clients[] = - { - {app_lwip_time_tick, LWIP_SYS_TICK_MS} - }; - - // The list of IoT Timer clients is declared as a constant. - static const iot_timer_clients_list_t iot_timer_clients = - { - (sizeof(list_of_clients) / sizeof(iot_timer_client_t)), - &(list_of_clients[0]), - }; - - // Passing the list of clients to the IoT Timer module. - err_code = iot_timer_client_list_set(&iot_timer_clients); - APP_ERROR_CHECK(err_code); - - // Starting the app timer instance that is the tick source for the IoT Timer. - err_code = app_timer_start(m_iot_timer_tick_src_id, \ - APP_TIMER_TICKS(IOT_TIMER_RESOLUTION_IN_MS, APP_TIMER_PRESCALER), \ - NULL); - APP_ERROR_CHECK(err_code); -} - -static void iot_timer_tick_callback(void * p_context) -{ - UNUSED_VARIABLE(p_context); - uint32_t err_code = iot_timer_update(); - APP_ERROR_CHECK(err_code); -} - -static void timers_init(void) -{ - uint32_t err_code; - - // Initialize timer module, making it use the scheduler - APP_TIMER_APPSH_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, false); - - // Create a sys timer. - err_code = app_timer_create(&m_iot_timer_tick_src_id, - APP_TIMER_MODE_REPEATED, - iot_timer_tick_callback); - APP_ERROR_CHECK(err_code); -} - -static void on_ble_evt(ble_evt_t * p_ble_evt) -{ - switch (p_ble_evt->header.evt_id) - { - case BLE_GAP_EVT_CONNECTED: - break; - case BLE_GAP_EVT_DISCONNECTED: - sd_ble_gap_adv_start(&m_adv_params); - break; - default: - break; - } -} - -static void ble_evt_dispatch(ble_evt_t * p_ble_evt) -{ - ble_ipsp_evt_handler(p_ble_evt); - on_ble_evt(p_ble_evt); -} - -void transport_init(void) { - - // if interface is already up, return - if (m_interface_up) { - return; - } - - uint32_t err_code; - - timers_init(); - - // Initialize the SoftDevice handler module. - SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, false); - printf("Softdevice init done\n"); - - // Enable BLE stack. - ble_enable_params_t ble_enable_params; - memset(&ble_enable_params, 0x00, sizeof(ble_enable_params)); - ble_enable_params.gatts_enable_params.attr_tab_size = BLE_GATTS_ATTR_TAB_SIZE_DEFAULT; - ble_enable_params.gatts_enable_params.service_changed = false; - err_code = sd_ble_enable(&ble_enable_params); - printf("Softdevice enable:" UINT_FMT "\n", (uint16_t)err_code); - - // Register with the SoftDevice handler module for BLE events. - err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch); - printf("Softdevice evt handler set:" UINT_FMT "\n", (uint16_t)err_code); - APP_ERROR_CHECK(err_code); - - ble_advdata_t advdata; - uint8_t flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED; - ble_gap_conn_sec_mode_t sec_mode; - - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); - - err_code = sd_ble_gap_device_name_set(&sec_mode, - (const uint8_t *)DEVICE_NAME, - strlen(DEVICE_NAME)); - printf("Device name set:" UINT_FMT "\n", (uint16_t)err_code); - APP_ERROR_CHECK(err_code); - - err_code = sd_ble_gap_address_get(&m_local_ble_addr); - APP_ERROR_CHECK(err_code); - printf("GAP address get:" UINT_FMT "\n", (uint16_t)err_code); - - m_local_ble_addr.addr[5] = 0x00; - m_local_ble_addr.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC; - - err_code = sd_ble_gap_address_set(BLE_GAP_ADDR_CYCLE_MODE_NONE, &m_local_ble_addr); - APP_ERROR_CHECK(err_code); - printf("GAP address set:" UINT_FMT "\n", (uint16_t)err_code); - IPV6_EUI64_CREATE_FROM_EUI48(eui64_local_iid.identifier, - m_local_ble_addr.addr, - m_local_ble_addr.addr_type); - - ble_uuid_t adv_uuids[] = - { - {BLE_UUID_IPSP_SERVICE, BLE_UUID_TYPE_BLE} - }; - - // build and set advertising data - memset(&advdata, 0, sizeof(advdata)); - - advdata.name_type = BLE_ADVDATA_FULL_NAME; - advdata.flags = flags; - advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]); - advdata.uuids_complete.p_uuids = adv_uuids; - - err_code = ble_advdata_set(&advdata, NULL); - APP_ERROR_CHECK(err_code); - printf("Adv data set:" UINT_FMT "\n", (uint16_t)err_code); - // initialize advertising parameters (used when starting advertising) - memset(&m_adv_params, 0, sizeof(m_adv_params)); - - m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_IND; - m_adv_params.p_peer_addr = NULL; // undirected advertisement - m_adv_params.fp = BLE_GAP_ADV_FP_ANY; - m_adv_params.interval = APP_ADV_ADV_INTERVAL; - m_adv_params.timeout = APP_ADV_TIMEOUT; - - // initialize memory manager - err_code = nrf_mem_init(); - APP_ERROR_CHECK(err_code); - printf("mem init:" UINT_FMT "\n", (uint16_t)err_code); - // initialize lwip stack driver - err_code = nrf_driver_init(); - APP_ERROR_CHECK(err_code); - printf("driver init:" UINT_FMT "\n", (uint16_t)err_code); - // initialize lwip stack - lwip_init(); - printf("lwip init:" UINT_FMT "\n", (uint16_t)err_code); - - iot_timer_init(); - - printf("Starting adv:" UINT_FMT "\n", (uint16_t)err_code); - err_code = sd_ble_gap_adv_start(&m_adv_params); - - while (!m_interface_up) { - ; - } -} - diff --git a/nrf5/bluetooth/iot_0.9.0/sdkhelp.h b/nrf5/bluetooth/iot_0.9.0/sdkhelp.h deleted file mode 100644 index c3e8a122f..000000000 --- a/nrf5/bluetooth/iot_0.9.0/sdkhelp.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2016 Glenn Ruben Bakke - * - * 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. - */ - -void transport_init(void); diff --git a/nrf5/bluetooth_conf.h b/nrf5/bluetooth_conf.h index 5e62c9796..701cc13a6 100644 --- a/nrf5/bluetooth_conf.h +++ b/nrf5/bluetooth_conf.h @@ -3,14 +3,7 @@ // SD specific configurations. -#if (BLUETOOTH_SD == 100) - -#define MICROPY_PY_BLE (1) -#define MICROPY_PY_BLE_6LOWPAN (1) -#define MICROPY_PY_USOCKET (1) -#define MICROPY_PY_NETWORK (1) - -#elif (BLUETOOTH_SD == 110) +#if (BLUETOOTH_SD == 110) #define MICROPY_PY_BLE (1) #define MICROPY_PY_BLE_NUS (0) @@ -33,10 +26,6 @@ // Default defines. -#ifndef MICROPY_PY_BLE_6LOWPAN -#define MICROPY_PY_BLE_6LOWPAN (0) -#endif - #ifndef MICROPY_PY_BLE #define MICROPY_PY_BLE (0) #endif diff --git a/nrf5/boards/microbit/mpconfigboard.h b/nrf5/boards/microbit/mpconfigboard.h index 485a3f5ac..f5bfdba88 100644 --- a/nrf5/boards/microbit/mpconfigboard.h +++ b/nrf5/boards/microbit/mpconfigboard.h @@ -37,9 +37,6 @@ #define MICROPY_PY_MACHINE_ADC (1) #define MICROPY_PY_MACHINE_TEMP (1) -#define MICROPY_PY_USOCKET (0) -#define MICROPY_PY_NETWORK (0) - #define MICROPY_HW_HAS_SWITCH (0) #define MICROPY_HW_HAS_FLASH (0) #define MICROPY_HW_HAS_SDCARD (0) diff --git a/nrf5/boards/nrf52832_512k_64k_s1xx.ld b/nrf5/boards/nrf52832_512k_64k_s1xx.ld deleted file mode 100644 index 2e2dc7cce..000000000 --- a/nrf5/boards/nrf52832_512k_64k_s1xx.ld +++ /dev/null @@ -1,27 +0,0 @@ -/* - GNU linker script for NRF52 w/ s1xx prototype3 softdevice (IPv6) -*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x0001F000, LENGTH = 0x061000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x0001F000, LENGTH = 0x000400 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x0001F400, LENGTH = 0x060c00 /* 396 KiB */ - RAM (xrw) : ORIGIN = 0x20002800, LENGTH = 0x00D800 /* 54 KiB */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 8K; -_minimum_heap_size = 28K; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x2000a800; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/nrf5/boards/pca10028/mpconfigboard.h b/nrf5/boards/pca10028/mpconfigboard.h index 8dc210c41..cd04f9b4e 100644 --- a/nrf5/boards/pca10028/mpconfigboard.h +++ b/nrf5/boards/pca10028/mpconfigboard.h @@ -37,9 +37,6 @@ #define MICROPY_PY_MACHINE_ADC (1) #define MICROPY_PY_MACHINE_TEMP (1) -#define MICROPY_PY_USOCKET (0) -#define MICROPY_PY_NETWORK (0) - #define MICROPY_HW_HAS_SWITCH (0) #define MICROPY_HW_HAS_FLASH (0) #define MICROPY_HW_HAS_SDCARD (0) diff --git a/nrf5/boards/pca10040/mpconfigboard_s1xx.mk b/nrf5/boards/pca10040/mpconfigboard_s1xx.mk deleted file mode 100644 index 1467d01f2..000000000 --- a/nrf5/boards/pca10040/mpconfigboard_s1xx.mk +++ /dev/null @@ -1,6 +0,0 @@ -MCU_SERIES = m4 -MCU_VARIANT = nrf52 -MCU_SUB_VARIANT = nrf52832 -LD_FILE = boards/nrf52832_512k_64k_s1xx.ld - -NRF_DEFINES += -DNRF52832_XXAA diff --git a/nrf5/main.c b/nrf5/main.c index 0440dacd0..24651d3e0 100644 --- a/nrf5/main.c +++ b/nrf5/main.c @@ -41,7 +41,6 @@ #include "readline.h" #include "gccollect.h" #include "modmachine.h" -#include "modnetwork.h" #include "led.h" #include "uart.h" #include "nrf.h" @@ -175,10 +174,6 @@ int main(int argc, char **argv) { } #endif -#if MICROPY_PY_NETWORK - mod_network_init(); -#endif - #if MICROPY_HW_LED_TRICOLOR do_str("import pyb\r\n" \ "pyb.LED(1).on()", diff --git a/nrf5/modules/network/modnetwork.c b/nrf5/modules/network/modnetwork.c deleted file mode 100644 index f47df0db4..000000000 --- a/nrf5/modules/network/modnetwork.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is part of the Micro Python 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 <stdio.h> -#include <stdint.h> -#include <string.h> - -#include "py/nlr.h" -#include "py/objlist.h" -#include "py/runtime.h" -#include "modnetwork.h" - -#if MICROPY_PY_NETWORK - -/// \module network - network configuration -/// -/// This module provides network drivers and routing configuration. - -void mod_network_init(void) { - mp_obj_list_init(&MP_STATE_PORT(mod_network_nic_list), 0); -} - -void mod_network_register_nic(mp_obj_t nic) { - for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) { - if (MP_STATE_PORT(mod_network_nic_list).items[i] == nic) { - // nic already registered - return; - } - } - // nic not registered so add to list - mp_obj_list_append(&MP_STATE_PORT(mod_network_nic_list), nic); -} - -mp_obj_t mod_network_find_nic(const uint8_t *ip) { - // find a NIC that is suited to given IP address - for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) { - mp_obj_t nic = MP_STATE_PORT(mod_network_nic_list).items[i]; - // TODO check IP suitability here - //mod_network_nic_type_t *nic_type = (mod_network_nic_type_t*)mp_obj_get_type(nic); - return nic; - } - - nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no available NIC")); -} - -STATIC mp_obj_t network_route(void) { - return &MP_STATE_PORT(mod_network_nic_list); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_route_obj, network_route); - -STATIC const mp_map_elem_t mp_module_network_globals_table[] = { - { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_network) }, - - #if MICROPY_PY_WIZNET5K - { MP_OBJ_NEW_QSTR(MP_QSTR_WIZNET5K), (mp_obj_t)&mod_network_nic_type_wiznet5k }, - #endif - #if MICROPY_PY_CC3K - { MP_OBJ_NEW_QSTR(MP_QSTR_CC3K), (mp_obj_t)&mod_network_nic_type_cc3k }, - #endif - #if MICROPY_PY_BLE_6LOWPAN - { MP_OBJ_NEW_QSTR(MP_QSTR_ble_6lowpan), (mp_obj_t)&mod_network_nic_type_ble_6lowpan }, - #endif - - { MP_OBJ_NEW_QSTR(MP_QSTR_route), (mp_obj_t)&network_route_obj }, -}; - -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, -}; - -#endif // MICROPY_PY_NETWORK diff --git a/nrf5/modules/network/modnetwork.h b/nrf5/modules/network/modnetwork.h deleted file mode 100644 index 73f8b628f..000000000 --- a/nrf5/modules/network/modnetwork.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2013, 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. - */ - -#define MOD_NETWORK_IPADDR_BUF_SIZE (16) - -#define MOD_NETWORK_AF_INET (2) -#define MOD_NETWORK_AF_INET6 (10) - -#define MOD_NETWORK_SOCK_STREAM (1) -#define MOD_NETWORK_SOCK_DGRAM (2) -#define MOD_NETWORK_SOCK_RAW (3) - -struct _mod_network_socket_obj_t; - -typedef struct _mod_network_nic_type_t { - mp_obj_type_t base; - - // API for non-socket operations - int (*gethostbyname)(mp_obj_t nic, const char *name, mp_uint_t len, uint8_t *ip_out); - - // API for socket operations; return -1 on error - int (*socket)(struct _mod_network_socket_obj_t *socket, int *_errno); - void (*close)(struct _mod_network_socket_obj_t *socket); - int (*bind)(struct _mod_network_socket_obj_t *socket, byte *ip, mp_uint_t port, int *_errno); - int (*listen)(struct _mod_network_socket_obj_t *socket, mp_int_t backlog, int *_errno); - int (*accept)(struct _mod_network_socket_obj_t *socket, struct _mod_network_socket_obj_t *socket2, byte *ip, mp_uint_t *port, int *_errno); - int (*connect)(struct _mod_network_socket_obj_t *socket, byte *ip, mp_uint_t port, int *_errno); - mp_uint_t (*send)(struct _mod_network_socket_obj_t *socket, const byte *buf, mp_uint_t len, int *_errno); - mp_uint_t (*recv)(struct _mod_network_socket_obj_t *socket, byte *buf, mp_uint_t len, int *_errno); - mp_uint_t (*sendto)(struct _mod_network_socket_obj_t *socket, const byte *buf, mp_uint_t len, byte *ip, mp_uint_t port, int *_errno); - mp_uint_t (*recvfrom)(struct _mod_network_socket_obj_t *socket, byte *buf, mp_uint_t len, byte *ip, mp_uint_t *port, int *_errno); - int (*setsockopt)(struct _mod_network_socket_obj_t *socket, mp_uint_t level, mp_uint_t opt, const void *optval, mp_uint_t optlen, int *_errno); - int (*settimeout)(struct _mod_network_socket_obj_t *socket, mp_uint_t timeout_ms, int *_errno); - int (*ioctl)(struct _mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno); -} mod_network_nic_type_t; - -typedef struct _mod_network_socket_obj_t { - mp_obj_base_t base; - mp_obj_t nic; - mod_network_nic_type_t *nic_type; - union { - struct { - uint8_t domain; - uint8_t type; - int8_t fileno; - } u_param; - mp_uint_t u_state; - }; - struct udp_pcb * p_socket; -} mod_network_socket_obj_t; - -extern const mod_network_nic_type_t mod_network_nic_type_wiznet5k; -extern const mod_network_nic_type_t mod_network_nic_type_cc3k; -extern const mod_network_nic_type_t mod_network_nic_type_ble_6lowpan; - -void mod_network_init(void); -void mod_network_register_nic(mp_obj_t nic); -mp_obj_t mod_network_find_nic(const uint8_t *ip); diff --git a/nrf5/modules/usocket/modusocket.c b/nrf5/modules/usocket/modusocket.c deleted file mode 100644 index 6afbbf95f..000000000 --- a/nrf5/modules/usocket/modusocket.c +++ /dev/null @@ -1,480 +0,0 @@ -/* - * This file is part of the Micro Python 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 <stdio.h> -#include <string.h> - -#include "py/nlr.h" -#include "py/objtuple.h" -#include "py/objlist.h" -#include "py/runtime.h" -#include "py/mperrno.h" -#include "lib/netutils/netutils.h" -#include "modnetwork.h" - -#if MICROPY_PY_USOCKET - -/******************************************************************************/ -// socket class - -STATIC const mp_obj_type_t socket_type; - -// constructor socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, 4, false); - - // create socket object (not bound to any NIC yet) - mod_network_socket_obj_t *s = m_new_obj_with_finaliser(mod_network_socket_obj_t); - s->base.type = (mp_obj_t)&socket_type; - s->nic = MP_OBJ_NULL; - s->nic_type = NULL; - s->u_param.domain = MOD_NETWORK_AF_INET; - s->u_param.type = MOD_NETWORK_SOCK_STREAM; - s->u_param.fileno = -1; - if (n_args >= 1) { - s->u_param.domain = mp_obj_get_int(args[0]); - if (n_args >= 2) { - s->u_param.type = mp_obj_get_int(args[1]); - if (n_args >= 4) { - s->u_param.fileno = mp_obj_get_int(args[3]); - } - } - } - - return s; -} - -STATIC void socket_select_nic(mod_network_socket_obj_t *self, const byte *ip) { - if (self->nic == MP_OBJ_NULL) { - // select NIC based on IP - self->nic = mod_network_find_nic(ip); - self->nic_type = (mod_network_nic_type_t*)mp_obj_get_type(self->nic); - - // call the NIC to open the socket - int _errno; - if (self->nic_type->socket(self, &_errno) != 0) { - mp_raise_OSError(_errno); - } - } -} -// method socket.close() -STATIC mp_obj_t socket_close(mp_obj_t self_in) { - mod_network_socket_obj_t *self = self_in; - if (self->nic != MP_OBJ_NULL) { - self->nic_type->close(self); - self->nic = MP_OBJ_NULL; - } - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_close_obj, socket_close); - -#include <nrf.h> - -// method socket.bind(address) -STATIC mp_obj_t socket_bind(mp_obj_t self_in, mp_obj_t addr_in) { - mod_network_socket_obj_t *self = self_in; - - // get address - uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE]; - - mp_uint_t port; - if (self->u_param.domain == MOD_NETWORK_AF_INET) { - port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG); - } else { - port = netutils_parse_inet6_addr(addr_in, ip, NETUTILS_BIG); - } - - // check if we need to select a NIC - socket_select_nic(self, ip); - - // call the NIC to bind the socket - int _errno; - if (self->nic_type->bind(self, ip, port, &_errno) != 0) { - mp_raise_OSError(_errno); - } - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_bind_obj, socket_bind); - -// method socket.listen(backlog) -STATIC mp_obj_t socket_listen(mp_obj_t self_in, mp_obj_t backlog) { - mod_network_socket_obj_t *self = self_in; - - if (self->nic == MP_OBJ_NULL) { - // not connected - // TODO I think we can listen even if not bound... - mp_raise_OSError(MP_ENOTCONN); - } - - int _errno; - if (self->nic_type->listen(self, mp_obj_get_int(backlog), &_errno) != 0) { - mp_raise_OSError(_errno); - } - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_listen_obj, socket_listen); - -// method socket.accept() -STATIC mp_obj_t socket_accept(mp_obj_t self_in) { - mod_network_socket_obj_t *self = self_in; - - // create new socket object - // starts with empty NIC so that finaliser doesn't run close() method if accept() fails - mod_network_socket_obj_t *socket2 = m_new_obj_with_finaliser(mod_network_socket_obj_t); - socket2->base.type = (mp_obj_t)&socket_type; - socket2->nic = MP_OBJ_NULL; - socket2->nic_type = NULL; - - // accept incoming connection - uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE]; - mp_uint_t port; - int _errno; - if (self->nic_type->accept(self, socket2, ip, &port, &_errno) != 0) { - mp_raise_OSError(_errno); - } - - // new socket has valid state, so set the NIC to the same as parent - socket2->nic = self->nic; - socket2->nic_type = self->nic_type; - - // make the return value - mp_obj_tuple_t *client = mp_obj_new_tuple(2, NULL); - client->items[0] = socket2; - - if (self->u_param.domain == MOD_NETWORK_AF_INET) { - client->items[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG); - } else { - client->items[1] = netutils_format_inet6_addr(ip, port, NETUTILS_BIG); - } - - return client; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_accept_obj, socket_accept); - -// method socket.connect(address) -STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) { - mod_network_socket_obj_t *self = self_in; - - // get address - uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE]; - - mp_uint_t port; - if (self->u_param.domain == MOD_NETWORK_AF_INET) { - port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG); - } else { - port = netutils_parse_inet6_addr(addr_in, ip, NETUTILS_BIG); - } - // check if we need to select a NIC - socket_select_nic(self, ip); - - // call the NIC to connect the socket - int _errno; - if (self->nic_type->connect(self, ip, port, &_errno) != 0) { - mp_raise_OSError(_errno); - } - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_connect_obj, socket_connect); - -// method socket.send(bytes) -STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) { - mod_network_socket_obj_t *self = self_in; - if (self->nic == MP_OBJ_NULL) { - // not connected - mp_raise_OSError(MP_EPIPE); - } - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ); - int _errno; - mp_uint_t ret = self->nic_type->send(self, bufinfo.buf, bufinfo.len, &_errno); - if (ret == -1) { - mp_raise_OSError(_errno); - } - return mp_obj_new_int_from_uint(ret); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_send_obj, socket_send); - -// method socket.recv(bufsize) -STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) { - mod_network_socket_obj_t *self = self_in; - if (self->nic == MP_OBJ_NULL) { - // not connected - mp_raise_OSError(MP_ENOTCONN); - } - mp_int_t len = mp_obj_get_int(len_in); - vstr_t vstr; - vstr_init_len(&vstr, len); - int _errno; - mp_uint_t ret = self->nic_type->recv(self, (byte*)vstr.buf, len, &_errno); - if (ret == -1) { - mp_raise_OSError(_errno); - } - if (ret == 0) { - return mp_const_empty_bytes; - } - vstr.len = ret; - return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recv_obj, socket_recv); - -// method socket.sendto(bytes, address) -STATIC mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) { - mod_network_socket_obj_t *self = self_in; - - // get the data - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ); - - // get address - uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE]; - mp_uint_t port; - if (self->u_param.domain == MOD_NETWORK_AF_INET) { - port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG); - } else { - port = netutils_parse_inet6_addr(addr_in, ip, NETUTILS_BIG); - } - - // check if we need to select a NIC - socket_select_nic(self, ip); - - // call the NIC to sendto - int _errno; - mp_int_t ret = self->nic_type->sendto(self, bufinfo.buf, bufinfo.len, ip, port, &_errno); - if (ret == -1) { - mp_raise_OSError(_errno); - } - - return mp_obj_new_int(ret); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_3(socket_sendto_obj, socket_sendto); - -// method socket.recvfrom(bufsize) -STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) { - mod_network_socket_obj_t *self = self_in; - if (self->nic == MP_OBJ_NULL) { - // not connected - mp_raise_OSError(MP_ENOTCONN); - } - vstr_t vstr; - vstr_init_len(&vstr, mp_obj_get_int(len_in)); - byte ip[4]; - mp_uint_t port; - int _errno; - mp_int_t ret = self->nic_type->recvfrom(self, (byte*)vstr.buf, vstr.len, ip, &port, &_errno); - if (ret == -1) { - mp_raise_OSError(_errno); - } - mp_obj_t tuple[2]; - if (ret == 0) { - tuple[0] = mp_const_empty_bytes; - } else { - vstr.len = ret; - tuple[0] = mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); - } - - if (self->u_param.domain == MOD_NETWORK_AF_INET) { - tuple[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG); - } else { - tuple[1] = netutils_format_inet6_addr(ip, port, NETUTILS_BIG); - } - return mp_obj_new_tuple(2, tuple); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recvfrom_obj, socket_recvfrom); - -// method socket.setsockopt(level, optname, value) -STATIC mp_obj_t socket_setsockopt(mp_uint_t n_args, const mp_obj_t *args) { - mod_network_socket_obj_t *self = args[0]; - - mp_int_t level = mp_obj_get_int(args[1]); - mp_int_t opt = mp_obj_get_int(args[2]); - - const void *optval; - mp_uint_t optlen; - mp_int_t val; - if (mp_obj_is_integer(args[3])) { - val = mp_obj_get_int_truncated(args[3]); - optval = &val; - optlen = sizeof(val); - } else { - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ); - optval = bufinfo.buf; - optlen = bufinfo.len; - } - - int _errno; - if (self->nic_type->setsockopt(self, level, opt, optval, optlen, &_errno) != 0) { - mp_raise_OSError(_errno); - } - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_setsockopt_obj, 4, 4, socket_setsockopt); - -// method socket.settimeout(value) -// timeout=0 means non-blocking -// timeout=None means blocking -// otherwise, timeout is in seconds -STATIC mp_obj_t socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_in) { - mod_network_socket_obj_t *self = self_in; - if (self->nic == MP_OBJ_NULL) { - // not connected - mp_raise_OSError(MP_ENOTCONN); - } - mp_uint_t timeout; - if (timeout_in == mp_const_none) { - timeout = -1; - } else { - #if MICROPY_PY_BUILTINS_FLOAT - timeout = 1000 * mp_obj_get_float(timeout_in); - #else - timeout = 1000 * mp_obj_get_int(timeout_in); - #endif - } - int _errno; - if (self->nic_type->settimeout(self, timeout, &_errno) != 0) { - mp_raise_OSError(_errno); - } - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_settimeout_obj, socket_settimeout); - -// method socket.setblocking(flag) -STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t blocking) { - if (mp_obj_is_true(blocking)) { - return socket_settimeout(self_in, mp_const_none); - } else { - return socket_settimeout(self_in, MP_OBJ_NEW_SMALL_INT(0)); - } -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking); - -STATIC const mp_map_elem_t socket_locals_dict_table[] = { - { MP_OBJ_NEW_QSTR(MP_QSTR___del__), (mp_obj_t)&socket_close_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t)&socket_close_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_bind), (mp_obj_t)&socket_bind_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_listen), (mp_obj_t)&socket_listen_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_accept), (mp_obj_t)&socket_accept_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&socket_connect_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_send), (mp_obj_t)&socket_send_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&socket_recv_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_sendto), (mp_obj_t)&socket_sendto_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_recvfrom), (mp_obj_t)&socket_recvfrom_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_setsockopt), (mp_obj_t)&socket_setsockopt_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_settimeout), (mp_obj_t)&socket_settimeout_obj }, - { MP_OBJ_NEW_QSTR(MP_QSTR_setblocking), (mp_obj_t)&socket_setblocking_obj }, -}; - -STATIC MP_DEFINE_CONST_DICT(socket_locals_dict, socket_locals_dict_table); - -mp_uint_t socket_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { - mod_network_socket_obj_t *self = self_in; - return self->nic_type->ioctl(self, request, arg, errcode); -} - -STATIC const mp_stream_p_t socket_stream_p = { - .ioctl = socket_ioctl, - .is_text = false, -}; - -STATIC const mp_obj_type_t socket_type = { - { &mp_type_type }, - .name = MP_QSTR_socket, - .make_new = socket_make_new, - .protocol = &socket_stream_p, - .locals_dict = (mp_obj_t)&socket_locals_dict, -}; - -/******************************************************************************/ -// usocket module - -// function usocket.getaddrinfo(host, port) -STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) { - mp_uint_t hlen; - const char *host = mp_obj_str_get_data(host_in, &hlen); - mp_int_t port = mp_obj_get_int(port_in); - - // find a NIC that can do a name lookup - for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) { - mp_obj_t nic = MP_STATE_PORT(mod_network_nic_list).items[i]; - mod_network_nic_type_t *nic_type = (mod_network_nic_type_t*)mp_obj_get_type(nic); - if (nic_type->gethostbyname != NULL) { - uint8_t out_ip[MOD_NETWORK_IPADDR_BUF_SIZE]; - int ret = nic_type->gethostbyname(nic, host, hlen, out_ip); - if (ret != 0) { - // TODO CPython raises: socket.gaierror: [Errno -2] Name or service not known - mp_raise_OSError(ret); - } - mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL); - tuple->items[0] = MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_AF_INET); - tuple->items[1] = MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_SOCK_STREAM); - tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0); - tuple->items[3] = MP_OBJ_NEW_QSTR(MP_QSTR_); - tuple->items[4] = netutils_format_inet_addr(out_ip, port, NETUTILS_BIG); - return mp_obj_new_list(1, (mp_obj_t*)&tuple); - } - } - - nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no available NIC")); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_usocket_getaddrinfo_obj, mod_usocket_getaddrinfo); - -STATIC const mp_map_elem_t mp_module_usocket_globals_table[] = { - { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_usocket) }, - - { MP_OBJ_NEW_QSTR(MP_QSTR_socket), (mp_obj_t)&socket_type }, - { MP_OBJ_NEW_QSTR(MP_QSTR_getaddrinfo), (mp_obj_t)&mod_usocket_getaddrinfo_obj }, - - // class constants - { MP_OBJ_NEW_QSTR(MP_QSTR_AF_INET), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_AF_INET) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_AF_INET6), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_AF_INET6) }, - - { MP_OBJ_NEW_QSTR(MP_QSTR_SOCK_STREAM), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_SOCK_STREAM) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SOCK_DGRAM), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_SOCK_DGRAM) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SOCK_RAW), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_SOCK_RAW) }, - - /* - { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_IP), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_IPPROTO_IP) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_ICMP), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_IPPROTO_ICMP) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_IPV4), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_IPPROTO_IPV4) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_TCP), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_IPPROTO_TCP) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_UDP), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_IPPROTO_UDP) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_IPV6), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_IPPROTO_IPV6) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_IPPROTO_RAW), MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_IPPROTO_RAW) }, - */ -}; - -STATIC MP_DEFINE_CONST_DICT(mp_module_usocket_globals, mp_module_usocket_globals_table); - -const mp_obj_module_t mp_module_usocket = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t*)&mp_module_usocket_globals, -}; - -#endif // MICROPY_PY_USOCKET diff --git a/nrf5/mpconfigport.h b/nrf5/mpconfigport.h index 05b3f583c..98e41ca97 100644 --- a/nrf5/mpconfigport.h +++ b/nrf5/mpconfigport.h @@ -139,14 +139,6 @@ #define MICROPY_PY_MACHINE_RTC (0) #endif -#ifndef MICROPY_PY_USOCKET -#define MICROPY_PY_USOCKET (1) -#endif - -#ifndef MICROPY_PY_NETWORK -#define MICROPY_PY_NETWORK (1) -#endif - #define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (1) #define MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE (0) @@ -184,24 +176,8 @@ extern const struct _mp_obj_module_t pyb_module; extern const struct _mp_obj_module_t machine_module; extern const struct _mp_obj_module_t mp_module_utime; extern const struct _mp_obj_module_t mp_module_uos; -extern const struct _mp_obj_module_t mp_module_usocket; -extern const struct _mp_obj_module_t mp_module_network; extern const struct _mp_obj_module_t mp_module_ubluepy; -#if MICROPY_PY_USOCKET -#define SOCKET_BUILTIN_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_usocket), (mp_obj_t)&mp_module_usocket }, -#define SOCKET_BUILTIN_MODULE_WEAK_LINKS { MP_OBJ_NEW_QSTR(MP_QSTR_socket), (mp_obj_t)&mp_module_usocket }, -#else -#define SOCKET_BUILTIN_MODULE -#define SOCKET_BUILTIN_MODULE_WEAK_LINKS -#endif - -#if MICROPY_PY_NETWORK -#define NETWORK_BUILTIN_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_network), (mp_obj_t)&mp_module_network }, -#else -#define NETWORK_BUILTIN_MODULE -#endif - #if MICROPY_PY_UBLUEPY #define UBLUEPY_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_ubluepy), (mp_obj_t)&mp_module_ubluepy }, #else @@ -218,8 +194,6 @@ extern const struct _mp_obj_module_t ble_module; { MP_OBJ_NEW_QSTR(MP_QSTR_utime), (mp_obj_t)&mp_module_utime }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&mp_module_utime }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_uos), (mp_obj_t)&mp_module_uos }, \ - SOCKET_BUILTIN_MODULE \ - NETWORK_BUILTIN_MODULE \ UBLUEPY_MODULE \ @@ -236,7 +210,6 @@ extern const struct _mp_obj_module_t ble_module; #define MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS \ { MP_OBJ_NEW_QSTR(MP_QSTR_os), (mp_obj_t)&mp_module_uos }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&mp_module_utime }, \ - SOCKET_BUILTIN_MODULE_WEAK_LINKS \ // extra built in names to add to the global namespace #define MICROPY_PORT_BUILTINS \ |
