summaryrefslogtreecommitdiff
path: root/ports
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2020-11-27 16:06:57 -0500
committerDan Halbert <halbert@halwitz.org>2020-11-27 16:06:57 -0500
commit596e0e4bd2fe9b99b1edca9afd5a593875be0d99 (patch)
treecd027b37b2ab1740c757f2e2ca06ab83cdaac44b /ports
parente308a9ec1134412f6194358790176d17b0724ef1 (diff)
parentbd87201c4f5a326e0328648700e1929d876b8c36 (diff)
merge from upstream
Diffstat (limited to 'ports')
-rw-r--r--ports/esp32s2/Makefile1
-rw-r--r--ports/esp32s2/common-hal/busio/SPI.c8
-rw-r--r--ports/esp32s2/common-hal/microcontroller/Pin.c4
-rw-r--r--ports/esp32s2/common-hal/socketpool/Socket.c71
-rw-r--r--ports/esp32s2/common-hal/socketpool/SocketPool.c7
-rw-r--r--ports/esp32s2/common-hal/wifi/Radio.c4
6 files changed, 86 insertions, 9 deletions
diff --git a/ports/esp32s2/Makefile b/ports/esp32s2/Makefile
index 93221aba7..4486cb598 100644
--- a/ports/esp32s2/Makefile
+++ b/ports/esp32s2/Makefile
@@ -190,6 +190,7 @@ SRC_C += \
lib/utils/pyexec.c \
lib/utils/stdout_helpers.c \
lib/utils/sys_stdio_mphal.c \
+ lib/netutils/netutils.c \
peripherals/timer.c \
peripherals/pcnt.c \
peripherals/pins.c \
diff --git a/ports/esp32s2/common-hal/busio/SPI.c b/ports/esp32s2/common-hal/busio/SPI.c
index 490419f34..da738bbfd 100644
--- a/ports/esp32s2/common-hal/busio/SPI.c
+++ b/ports/esp32s2/common-hal/busio/SPI.c
@@ -204,6 +204,14 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
// hal->dummy_bits = 0;
// hal->addr = 0;
+ claim_pin(self->clock_pin);
+ if (self->MOSI_pin != NULL) {
+ claim_pin(self->MOSI_pin);
+ }
+ if (self->MISO_pin != NULL) {
+ claim_pin(self->MISO_pin);
+ }
+
hal->io_mode = SPI_LL_IO_MODE_NORMAL;
common_hal_busio_spi_configure(self, 250000, 0, 0, 8);
diff --git a/ports/esp32s2/common-hal/microcontroller/Pin.c b/ports/esp32s2/common-hal/microcontroller/Pin.c
index 3c2611efe..394a19e69 100644
--- a/ports/esp32s2/common-hal/microcontroller/Pin.c
+++ b/ports/esp32s2/common-hal/microcontroller/Pin.c
@@ -96,7 +96,7 @@ void reset_all_pins(void) {
}
void claim_pin(const mcu_pin_obj_t* pin) {
- in_use[pin->number / 32] |= (1 << pin->number % 32);
+ in_use[pin->number / 32] |= (1 << (pin->number % 32));
#ifdef MICROPY_HW_NEOPIXEL
if (pin == MICROPY_HW_NEOPIXEL) {
neopixel_in_use = true;
@@ -116,7 +116,7 @@ bool pin_number_is_free(gpio_num_t pin_number) {
#endif
uint8_t offset = pin_number / 32;
- uint8_t mask = 1 << pin_number % 32;
+ uint32_t mask = 1 << (pin_number % 32);
return (never_reset_pins[offset] & mask) == 0 && (in_use[offset] & mask) == 0;
}
diff --git a/ports/esp32s2/common-hal/socketpool/Socket.c b/ports/esp32s2/common-hal/socketpool/Socket.c
index 750415dc7..92247420f 100644
--- a/ports/esp32s2/common-hal/socketpool/Socket.c
+++ b/ports/esp32s2/common-hal/socketpool/Socket.c
@@ -32,6 +32,11 @@
#include "py/runtime.h"
#include "supervisor/shared/tick.h"
+#include "components/lwip/lwip/src/include/lwip/err.h"
+#include "components/lwip/lwip/src/include/lwip/sockets.h"
+#include "components/lwip/lwip/src/include/lwip/sys.h"
+#include "components/lwip/lwip/src/include/lwip/netdb.h"
+
void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t* self, mp_uint_t timeout_ms) {
self->timeout_ms = timeout_ms;
}
@@ -103,6 +108,11 @@ mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self,
}
if (available > 0) {
status = esp_tls_conn_read(self->tcp, (void*) buf + received, available);
+ if (status == 0) {
+ // Reading zero when something is available indicates a closed
+ // connection. (The available bytes could have been TLS internal.)
+ break;
+ }
if (status > 0) {
received += status;
}
@@ -119,16 +129,75 @@ mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self,
return received;
}
+mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t* self,
+ const char* host, size_t hostlen, uint8_t port, const uint8_t* buf, mp_uint_t len) {
+
+ // Get the IP address string
+ const struct addrinfo hints = {
+ .ai_family = AF_INET,
+ .ai_socktype = SOCK_STREAM,
+ };
+ struct addrinfo *result;
+ int error = lwip_getaddrinfo(host, NULL, &hints, &result);
+ if (error != 0 || result == NULL) {
+ return 0;
+ }
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wcast-align"
+ struct in_addr *addr = &((struct sockaddr_in *)result->ai_addr)->sin_addr;
+ #pragma GCC diagnostic pop
+ char ip_str[IP4ADDR_STRLEN_MAX];
+ inet_ntoa_r(*addr, ip_str, IP4ADDR_STRLEN_MAX);
+ freeaddrinfo(result);
+
+ // Set parameters
+ struct sockaddr_in dest_addr;
+ dest_addr.sin_addr.s_addr = inet_addr((const char *)ip_str);
+ dest_addr.sin_family = AF_INET;
+ dest_addr.sin_port = htons(port);
+
+ int bytes_sent = lwip_sendto(self->num, buf, len, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
+ if (bytes_sent < 0) {
+ mp_raise_BrokenPipeError();
+ return 0;
+ }
+ return bytes_sent;
+}
+
+mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t* self,
+ uint8_t* buf, mp_uint_t len, uint8_t* ip, uint *port) {
+
+ struct sockaddr_in source_addr;
+ socklen_t socklen = sizeof(source_addr);
+ int bytes_received = lwip_recvfrom(self->num, buf, len - 1, 0, (struct sockaddr *)&source_addr, &socklen);
+
+ memcpy((void *)ip, (void*)&source_addr.sin_addr.s_addr, sizeof source_addr.sin_addr.s_addr);
+ *port = source_addr.sin_port;
+
+ if (bytes_received < 0) {
+ mp_raise_BrokenPipeError();
+ return 0;
+ } else {
+ buf[bytes_received] = 0; // Null-terminate whatever we received
+ return bytes_received;
+ }
+}
+
void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self) {
self->connected = false;
if (self->tcp != NULL) {
esp_tls_conn_destroy(self->tcp);
self->tcp = NULL;
}
+ if (self->num >= 0) {
+ lwip_shutdown(self->num, 0);
+ lwip_close(self->num);
+ self->num = -1;
+ }
}
bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t* self) {
- return self->tcp == NULL;
+ return self->tcp == NULL && self->num < 0;
}
diff --git a/ports/esp32s2/common-hal/socketpool/SocketPool.c b/ports/esp32s2/common-hal/socketpool/SocketPool.c
index 1d4d04b03..3bec5f337 100644
--- a/ports/esp32s2/common-hal/socketpool/SocketPool.c
+++ b/ports/esp32s2/common-hal/socketpool/SocketPool.c
@@ -61,15 +61,14 @@ socketpool_socket_obj_t* common_hal_socketpool_socket(socketpool_socketpool_obj_
socket_type = SOCK_RAW;
}
- if (socket_type == SOCK_DGRAM || socket_type == SOCK_RAW ||
- addr_family == AF_INET6 || ipproto == IPPROTO_IPV6) {
- mp_raise_NotImplementedError(translate("Only IPv4 SOCK_STREAM sockets supported"));
+ if (addr_family == AF_INET6 || ipproto == IPPROTO_IPV6) {
+ mp_raise_NotImplementedError(translate("Only IPv4 sockets supported"));
}
int socknum = -1;
esp_tls_t* tcp_handle = NULL;
if (socket_type == SOCK_DGRAM || socket_type == SOCK_RAW) {
- // socknum = lwip_socket(addr_family, socket_type, ipproto);
+ socknum = lwip_socket(addr_family, socket_type, ipproto);
} else {
tcp_handle = esp_tls_init();
diff --git a/ports/esp32s2/common-hal/wifi/Radio.c b/ports/esp32s2/common-hal/wifi/Radio.c
index f7c431a56..bc987bc1c 100644
--- a/ports/esp32s2/common-hal/wifi/Radio.c
+++ b/ports/esp32s2/common-hal/wifi/Radio.c
@@ -138,9 +138,9 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
if (bssid_len > 0){
memcpy(&config->sta.bssid, bssid, bssid_len);
config->sta.bssid[bssid_len] = 0;
- config->sta.bssid_set = 1;
+ config->sta.bssid_set = true;
} else {
- config->sta.bssid_set = 0;
+ config->sta.bssid_set = false;
}
// If channel is 0 (default/unset) and BSSID is not given, do a full scan instead of fast scan
// This will ensure that the best AP in range is chosen automatically