Merge pull request #10762 from gschorcht/esp32_esp_wifi_fix
cpu/esp32: esp_wifi netdev driver
This commit is contained in:
commit
495607d501
@ -28,6 +28,7 @@ endif
|
|||||||
|
|
||||||
ifneq (,$(filter esp_wifi_any,$(USEMODULE)))
|
ifneq (,$(filter esp_wifi_any,$(USEMODULE)))
|
||||||
# add additional modules used for any WiFi interface
|
# add additional modules used for any WiFi interface
|
||||||
|
USEMODULE += esp_idf_heap
|
||||||
USEMODULE += esp_idf_wpa_supplicant_crypto
|
USEMODULE += esp_idf_wpa_supplicant_crypto
|
||||||
USEMODULE += esp_idf_wpa_supplicant_port
|
USEMODULE += esp_idf_wpa_supplicant_port
|
||||||
USEMODULE += esp_idf_nvs_flash
|
USEMODULE += esp_idf_nvs_flash
|
||||||
|
|||||||
1118
cpu/esp32/README.md
1118
cpu/esp32/README.md
File diff suppressed because it is too large
Load Diff
@ -46,8 +46,9 @@
|
|||||||
2. [SPIFFS Device](#esp32_spiffs_device)
|
2. [SPIFFS Device](#esp32_spiffs_device)
|
||||||
8. [Network Interfaces](#esp32_network_interfaces)
|
8. [Network Interfaces](#esp32_network_interfaces)
|
||||||
1. [Ethernet MAC Network Interface](#esp32_ethernet_network_interface)
|
1. [Ethernet MAC Network Interface](#esp32_ethernet_network_interface)
|
||||||
2. [ESP-NOW Network Interface](#esp32_esp_now_network_interface)
|
2. [WiFi Network Interface](#esp32_wifi_network_interface)
|
||||||
3. [Other Network Devices](#esp32_other_network_devices)
|
3. [ESP-NOW Network Interface](#esp32_esp_now_network_interface)
|
||||||
|
4. [Other Network Devices](#esp32_other_network_devices)
|
||||||
10. [Application-Specific Configurations](#esp32_application_specific_configurations)
|
10. [Application-Specific Configurations](#esp32_application_specific_configurations)
|
||||||
1. [Make Variable ```CONFIGS```](#esp32_config_make_variable)
|
1. [Make Variable ```CONFIGS```](#esp32_config_make_variable)
|
||||||
2. [Application-Specific Board Configuration](#esp32_application_specific_board_configuration)
|
2. [Application-Specific Board Configuration](#esp32_application_specific_board_configuration)
|
||||||
@ -108,8 +109,8 @@ The following table gives a short reference in alphabetical order of modules th
|
|||||||
|
|
||||||
Module | Default | Short description
|
Module | Default | Short description
|
||||||
----------|----------|-------------------
|
----------|----------|-------------------
|
||||||
[esp_can](#esp32_can_interfaces) | not used | enable the ESP32 CAN device
|
[esp_can](#esp32_can_interfaces) | not used | enable the CAN device
|
||||||
[esp_eth](#esp32_ethernet_network_interface) | not used | enable the ESP32 EMAC network device
|
[esp_eth](#esp32_ethernet_network_interface) | not used | enable the Ethernet MAC (EMAC) network device
|
||||||
[esp_gdb](#esp32_debugging) | not used | enable the compilation with debug information for debugging
|
[esp_gdb](#esp32_debugging) | not used | enable the compilation with debug information for debugging
|
||||||
[esp_hw_counter](#esp32_timers) | not used | use hardware counters for RIOT timers
|
[esp_hw_counter](#esp32_timers) | not used | use hardware counters for RIOT timers
|
||||||
[esp_i2c_hw](#esp32_i2c_interfaces) | not used | use the i2C hardware implementation
|
[esp_i2c_hw](#esp32_i2c_interfaces) | not used | use the i2C hardware implementation
|
||||||
@ -117,6 +118,7 @@ Module | Default | Short description
|
|||||||
[esp_now](#esp32_esp_now_network_interface) | not used | enable the ESP-NOW network device
|
[esp_now](#esp32_esp_now_network_interface) | not used | enable the ESP-NOW network device
|
||||||
[esp_spi_ram](#esp32_spi_ram) | not used | enable SPI RAM
|
[esp_spi_ram](#esp32_spi_ram) | not used | enable SPI RAM
|
||||||
[esp_spiffs](#esp32_spiffs_device) | not used | enable SPIFFS for on-board flash memory
|
[esp_spiffs](#esp32_spiffs_device) | not used | enable SPIFFS for on-board flash memory
|
||||||
|
[esp_wifi](#esp32_wifi_network_interface) | not used | enable the Wifi network device
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
@ -190,7 +192,6 @@ The RIOT-OS for ESP32 SoCs supports the following features at the moment:
|
|||||||
The implementation of RIOT-OS for ESP32 SOCs has the following limitations at the moment:
|
The implementation of RIOT-OS for ESP32 SOCs has the following limitations at the moment:
|
||||||
|
|
||||||
- Only <b>one core</b> (the PRO CPU) is used because RIOT does not support running multiple threads simultaneously.
|
- Only <b>one core</b> (the PRO CPU) is used because RIOT does not support running multiple threads simultaneously.
|
||||||
- <b>AP-based WiFi</b> is experimental and not stable.
|
|
||||||
- RIOT modules <b>crypto</b> and <b>hashes</b> cannot be used together with modules <b>esp_now</b> and <b>esp_wifi</b>
|
- RIOT modules <b>crypto</b> and <b>hashes</b> cannot be used together with modules <b>esp_now</b> and <b>esp_wifi</b>
|
||||||
- <b>Bluetooth</b> cannot be used at the moment.
|
- <b>Bluetooth</b> cannot be used at the moment.
|
||||||
- <b>Flash encryption</b> is not yet supported.
|
- <b>Flash encryption</b> is not yet supported.
|
||||||
@ -390,14 +391,15 @@ Optional features of ESP32 can be enabled by ```USEMODULE``` definitions in the
|
|||||||
|
|
||||||
Module | Description
|
Module | Description
|
||||||
-------|------------
|
-------|------------
|
||||||
esp_now | Use the built-in WiFi module with the ESP-NOW protocol as ```netdev``` network device, see section [ESP-NOW Network Interface](#esp32_esp_now_network_interface).
|
esp_can | Enable the CAN device, see section [CAN Interfaces](#esp32_can_interfaces).
|
||||||
esp_eth | Use the Ethernet MAC (EMAC) interface as ```netdev``` network device, see section [Ethernet Network Interface](#esp32_ethernet_network_interface).
|
esp_eth | Enable the Ethernet MAC (EMAC) interface as `netdev` network device, see section [Ethernet Network Interface](#esp32_ethernet_network_interface).
|
||||||
esp_gdb | Enable the compilation with debug information for debugging with [QEMU and GDB](#esp32_qemu_mode_and_gdb) (```QEMU=1```) or via [JTAG interface with OpenOCD](#esp32_jtag_debugging).
|
esp_gdb | Enable the compilation with debug information for debugging with [QEMU and GDB](#esp32_qemu_mode_and_gdb) (```QEMU=1```) or via [JTAG interface with OpenOCD](#esp32_jtag_debugging).
|
||||||
esp_i2c_hw | Use the hardware I2C implementation, see section [I2C Interfaces](#esp32_i2c_interfaces).
|
esp_i2c_hw | Use the hardware I2C implementation, see section [I2C Interfaces](#esp32_i2c_interfaces).
|
||||||
esp_idf_heap | Use the ESP-IDF heap implementation, see section [ESP-IDF Heap Implementation](#esp32_esp_idf_heap_implementation).
|
esp_idf_heap | Use the ESP-IDF heap implementation, see section [ESP-IDF Heap Implementation](#esp32_esp_idf_heap_implementation).
|
||||||
|
esp_now | Enable the built-in WiFi module with the ESP-NOW protocol as `netdev` network device, see section [ESP-NOW Network Interface](#esp32_esp_now_network_interface).
|
||||||
esp_spiffs | Enable the optional SPIFFS drive in on-board flash memory, see section [SPIFFS Device](#esp32_spiffs_device).
|
esp_spiffs | Enable the optional SPIFFS drive in on-board flash memory, see section [SPIFFS Device](#esp32_spiffs_device).
|
||||||
esp_spi_ram | Enable the optional SPI RAM, see section [SPI RAM Modules](#esp32_spi_ram).
|
esp_spi_ram | Enable the optional SPI RAM, see section [SPI RAM Modules](#esp32_spi_ram).
|
||||||
esp_can | Enable the ESP32 CAN device, see section [CAN Interfaces](#esp32_can_interfaces).
|
esp_wifi | Enable the built-in WiFi module as `netdev` network device, see section [WiFi Network Interface](#esp32_wifi_network_interface).
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
@ -884,7 +886,7 @@ Please refer file ```$RIOTBASE/tests/unittests/test-spiffs/tests-spiffs.c``` for
|
|||||||
ESP32 provides different built-in possibilities to realize network devices:
|
ESP32 provides different built-in possibilities to realize network devices:
|
||||||
|
|
||||||
- <b>EMAC</b>, an Ethernet MAC implementation (requires an external PHY module)
|
- <b>EMAC</b>, an Ethernet MAC implementation (requires an external PHY module)
|
||||||
- <b>ESP WiFi</b>, usual AP-based wireless LAN (not yet supported)
|
- <b>ESP WiFi</b>, usual AP-based wireless LAN
|
||||||
- <b>ESP-NOW</b>, a WiFi based AP-less and connectionless peer to peer communication protocol
|
- <b>ESP-NOW</b>, a WiFi based AP-less and connectionless peer to peer communication protocol
|
||||||
- <b>ESP-MESH</b>, a WiFi based mesh technology (not yet supported)
|
- <b>ESP-MESH</b>, a WiFi based mesh technology (not yet supported)
|
||||||
|
|
||||||
@ -906,6 +908,50 @@ Otherwise, the application has to add the ```esp_eth``` module in its makefile w
|
|||||||
@note
|
@note
|
||||||
The board has to have one of the supported PHY modules to be able to use the Ethernet MAC module.
|
The board has to have one of the supported PHY modules to be able to use the Ethernet MAC module.
|
||||||
|
|
||||||
|
\anchor esp32_wifi_network_interface
|
||||||
|
## <a name="esp32_wifi_network_interface"> WiFi Network Interface </a> [[TOC](#esp32_toc)]
|
||||||
|
|
||||||
|
The RIOT port for ESP32 implements in module `esp_wifi` a `netdev` driver for
|
||||||
|
the built-in WiFi interface.
|
||||||
|
|
||||||
|
@note Due to symbol conflicts with the `crypto` and `hash` modules of RIOT
|
||||||
|
in module `esp_idf_wpa_supplicant_crypto`, which is required by module
|
||||||
|
`esp_wifi`, `esp_wifi` cannot be used for applications that use these modules.
|
||||||
|
Therefore, module `esp_wifi` is not automatically enabled when module
|
||||||
|
`netdev_default` is used. Instead, if necessary, the application has to add
|
||||||
|
the module `esp_wifi` in the Makefile.
|
||||||
|
|
||||||
|
```
|
||||||
|
USEMODULE += esp_wifi
|
||||||
|
```
|
||||||
|
|
||||||
|
Furthermore, the following configuration parameters have to be defined:
|
||||||
|
|
||||||
|
<center>
|
||||||
|
|
||||||
|
Parameter | Default | Description
|
||||||
|
:------------------|:--------------------------|:------------
|
||||||
|
ESP_WIFI_SSID | "RIOT_AP" | SSID of the AP to be used.
|
||||||
|
ESP_WIFI_PASS | "ThisistheRIOTporttoESP" | Passphrase used for the AP as clear text (max. 64 chars).
|
||||||
|
ESP_WIFI_STACKSIZE | #THREAD_STACKSIZE_DEFAULT |Stack size used for the WiFi netdev driver thread.
|
||||||
|
|
||||||
|
</center>
|
||||||
|
|
||||||
|
These configuration parameter definitions, as well as enabling the `esp_wifi`
|
||||||
|
module, can be done either in the makefile of the project or at make command
|
||||||
|
line, e.g.:
|
||||||
|
|
||||||
|
```
|
||||||
|
USEMODULE=esp_wifi \
|
||||||
|
CFLAGS='-DESP_WIFI_SSID=\"MySSID\" -DESP_WIFI_PASS=\"MyPassphrase\"' \
|
||||||
|
make -C examples/gnrc_networking BOARD=...
|
||||||
|
```
|
||||||
|
|
||||||
|
@note The Wifi network interface (module `esp_wifi`) and the
|
||||||
|
[ESP-NOW network interface](#esp32_esp_now_network_interface) (module `esp_now`)
|
||||||
|
can be used simultaneously, for example, to realize a border router for
|
||||||
|
a mesh network which uses ESP-NOW.
|
||||||
|
|
||||||
\anchor esp32_esp_now_network_interface
|
\anchor esp32_esp_now_network_interface
|
||||||
## <a name="esp32_esp_now_network_interface"> ESP-NOW Network Interface </a> [[TOC](#esp32_toc)]
|
## <a name="esp32_esp_now_network_interface"> ESP-NOW Network Interface </a> [[TOC](#esp32_toc)]
|
||||||
|
|
||||||
@ -927,12 +973,16 @@ The following parameters are defined for ESP-NOW nodes. These parameters can be
|
|||||||
Parameter | Default | Description
|
Parameter | Default | Description
|
||||||
:---------|:--------|:-----------
|
:---------|:--------|:-----------
|
||||||
ESP_NOW_SCAN_PERIOD | 10000000UL | Defines the period in us at which an node scans for other nodes in its range. The default period is 10 s.
|
ESP_NOW_SCAN_PERIOD | 10000000UL | Defines the period in us at which an node scans for other nodes in its range. The default period is 10 s.
|
||||||
ESP_NOW_SOFT_AP_PASSPHRASE | ThisistheRIOTporttoESP | Defines the passphrase (max. 64 chars) that is used for the SoftAP interface of an nodes. It has to be same for all nodes in one network.
|
ESP_NOW_SOFT_AP_PASS | "ThisistheRIOTporttoESP" | Defines the passphrase as clear text (max. 64 chars) that is used for the SoftAP interface of ESP-NOW nodes. It has to be same for all nodes in one network.
|
||||||
ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together.
|
ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together.
|
||||||
ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type ```uint8_t[16]``` and has to be exactly 16 bytes long.
|
ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type ```uint8_t[16]``` and has to be exactly 16 bytes long.
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
|
@note The ESP-NOW network interface (module `esp_now`) and the
|
||||||
|
[Wifi network interface](#esp32_wifi_network_interface) (module `esp_wifi`)
|
||||||
|
can be used simultaneously, for example, to realize a border router for
|
||||||
|
a mesh network which uses ESP-NOW.
|
||||||
|
|
||||||
## <a name="esp32_other_network_devices"> Other Network Devices </a> [[TOC](#esp32_toc)]
|
## <a name="esp32_other_network_devices"> Other Network Devices </a> [[TOC](#esp32_toc)]
|
||||||
|
|
||||||
|
|||||||
@ -7,12 +7,46 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup cpu_esp32_esp_wifi ESP WiFi netdev interface
|
* @defgroup cpu_esp32_esp_wifi ESP32 WiFi netdev interface
|
||||||
* @ingroup cpu_esp32
|
* @ingroup cpu_esp32
|
||||||
* @brief WiFi AP-based network device driver
|
* @brief Network device driver for the ESP32 WiFi interface
|
||||||
*
|
|
||||||
* This module realizes a netdev interface using the built-in
|
|
||||||
* WiFi module and AP infrastructure.
|
|
||||||
*
|
*
|
||||||
* @author Gunar Schorcht <gunar@schorcht.net>
|
* @author Gunar Schorcht <gunar@schorcht.net>
|
||||||
|
|
||||||
|
This module realizes a `netdev` interface for the built-in WiFi interface
|
||||||
|
of ESP32. To enable the WiFi interface, module `esp_wifi` has to be used.
|
||||||
|
|
||||||
|
@note Due to symbol conflicts with the `crypto` and `hash` modules of RIOT
|
||||||
|
in module `esp_idf_wpa_supplicant_crypto`, which is required by module
|
||||||
|
`esp_wifi`, `esp_wifi` cannot be used for applications that use these modules.
|
||||||
|
Therefore, module `esp_wifi` is not automatically enabled when module
|
||||||
|
`netdev_default` is used. Instead, if necessary, the application has to add
|
||||||
|
the module `esp_wifi` in the Makefile.
|
||||||
|
|
||||||
|
```
|
||||||
|
USEMODULE += esp_wifi
|
||||||
|
```
|
||||||
|
|
||||||
|
Furthermore, the following configuration parameters have to be defined:
|
||||||
|
|
||||||
|
Configuration Parameter | Description
|
||||||
|
------------------------|------------
|
||||||
|
ESP_WIFI_SSID | SSID of the AP to be used.
|
||||||
|
ESP_WIFI_PASS | Passphrase used for the AP as clear text (max. 64 chars).
|
||||||
|
ESP_WIFI_STACKSIZE | Stack size used for the WiFi netdev driver thread.
|
||||||
|
|
||||||
|
These configuration parameter definitions, as well as enabling the `esp_wifi`
|
||||||
|
module, can be done either in the makefile of the project or at make command
|
||||||
|
line, e.g.:
|
||||||
|
|
||||||
|
```
|
||||||
|
USEMODULE=esp_wifi \
|
||||||
|
CFLAGS='-DESP_WIFI_SSID=\"MySSID\" -DESP_WIFI_PASS=\"MyPassphrase\"' \
|
||||||
|
make -C examples/gnrc_networking BOARD=...
|
||||||
|
```
|
||||||
|
|
||||||
|
@note The Wifi network interface (module `esp_wifi`) and the
|
||||||
|
\ref esp32_esp_now_network_interface "ESP-NOW network interface" (module `esp_now`)
|
||||||
|
can be used simultaneously, for example, to realize a border router for
|
||||||
|
a mesh network which uses ESP-NOW.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
* @{
|
* @{
|
||||||
*
|
*
|
||||||
* @file
|
* @file
|
||||||
* @brief Netdev interface for the ESP WiFi AP-based communication
|
* @brief Network device driver for the ESP32 WiFi interface
|
||||||
*
|
*
|
||||||
* @author Gunar Schorcht <gunar@schorcht.net>
|
* @author Gunar Schorcht <gunar@schorcht.net>
|
||||||
*/
|
*/
|
||||||
@ -72,18 +72,48 @@ extern esp_err_t esp_system_event_add_handler (system_event_cb_t handler,
|
|||||||
|
|
||||||
esp_err_t _esp_wifi_rx_cb(void *buffer, uint16_t len, void *eb)
|
esp_err_t _esp_wifi_rx_cb(void *buffer, uint16_t len, void *eb)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* This callback function is executed in interrupt context but in the
|
||||||
|
* context of the wifi thread. That is, mutex_lock or msg_send can block.
|
||||||
|
*/
|
||||||
|
|
||||||
DEBUG("%s: buf=%p len=%d eb=%p\n", __func__, buffer, len, eb);
|
DEBUG("%s: buf=%p len=%d eb=%p\n", __func__, buffer, len, eb);
|
||||||
|
|
||||||
CHECK_PARAM_RET (buffer != NULL, -EINVAL);
|
if ((buffer == NULL) || (len >= ETHERNET_DATA_LEN)) {
|
||||||
CHECK_PARAM_RET (len <= ETHERNET_DATA_LEN, -EINVAL);
|
if (eb != NULL) {
|
||||||
|
esp_wifi_internal_free_rx_buffer(eb);
|
||||||
|
}
|
||||||
|
return ESP_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
mutex_lock(&_esp_wifi_dev.dev_lock);
|
mutex_lock(&_esp_wifi_dev.dev_lock);
|
||||||
|
critical_enter();
|
||||||
|
|
||||||
|
/* copy the buffer and free WiFi driver buffer */
|
||||||
memcpy(_esp_wifi_dev.rx_buf, buffer, len);
|
memcpy(_esp_wifi_dev.rx_buf, buffer, len);
|
||||||
|
if (eb) {
|
||||||
|
esp_wifi_internal_free_rx_buffer(eb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Because this function is not executed in interrupt context but in thread
|
||||||
|
* context, following msg_send could block on heavy network load, if frames
|
||||||
|
* are coming in faster than the ISR events can be handled. To avoid
|
||||||
|
* blocking during msg_send, we pretend we are in an ISR by incrementing
|
||||||
|
* the IRQ nesting counter. If IRQ nesting counter is greater 0, function
|
||||||
|
* irq_is_in returns true and the non-blocking version of msg_send is used.
|
||||||
|
*/
|
||||||
|
irq_interrupt_nesting++;
|
||||||
|
|
||||||
|
/* trigger netdev event to read the data */
|
||||||
_esp_wifi_dev.rx_len = len;
|
_esp_wifi_dev.rx_len = len;
|
||||||
_esp_wifi_dev.event = SYSTEM_EVENT_WIFI_RX_DONE;
|
_esp_wifi_dev.event = SYSTEM_EVENT_WIFI_RX_DONE;
|
||||||
_esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
|
_esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
|
||||||
|
|
||||||
|
/* reset IRQ nesting counter */
|
||||||
|
irq_interrupt_nesting--;
|
||||||
|
|
||||||
|
critical_exit();
|
||||||
mutex_unlock(&_esp_wifi_dev.dev_lock);
|
mutex_unlock(&_esp_wifi_dev.dev_lock);
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
@ -94,48 +124,82 @@ esp_err_t _esp_wifi_rx_cb(void *buffer, uint16_t len, void *eb)
|
|||||||
*/
|
*/
|
||||||
static esp_err_t IRAM_ATTR _esp_system_event_handler(void *ctx, system_event_t *event)
|
static esp_err_t IRAM_ATTR _esp_system_event_handler(void *ctx, system_event_t *event)
|
||||||
{
|
{
|
||||||
|
esp_err_t result;
|
||||||
|
|
||||||
switch(event->event_id) {
|
switch(event->event_id) {
|
||||||
case SYSTEM_EVENT_STA_START:
|
case SYSTEM_EVENT_STA_START:
|
||||||
DEBUG("%s WiFi started\n", __func__);
|
DEBUG("%s WiFi started\n", __func__);
|
||||||
|
result = esp_wifi_connect();
|
||||||
|
if (result != ESP_OK) {
|
||||||
|
LOG_TAG_ERROR("esp_wifi", "esp_wifi_connect failed with return "
|
||||||
|
"value %d\n", result);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SYSTEM_EVENT_SCAN_DONE:
|
case SYSTEM_EVENT_SCAN_DONE:
|
||||||
DEBUG("%s WiFi scan done\n", __func__);
|
DEBUG("%s WiFi scan done\n", __func__);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SYSTEM_EVENT_STA_CONNECTED:
|
case SYSTEM_EVENT_STA_CONNECTED:
|
||||||
DEBUG("%s WiFi connected\n", __func__);
|
DEBUG("%s WiFi connected\n", __func__);
|
||||||
|
|
||||||
|
/* register RX callback function */
|
||||||
|
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, _esp_wifi_rx_cb);
|
||||||
|
|
||||||
_esp_wifi_dev.connected = true;
|
_esp_wifi_dev.connected = true;
|
||||||
_esp_wifi_dev.event = SYSTEM_EVENT_ETH_CONNECTED;
|
_esp_wifi_dev.event = SYSTEM_EVENT_STA_CONNECTED;
|
||||||
_esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
|
_esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SYSTEM_EVENT_STA_DISCONNECTED:
|
case SYSTEM_EVENT_STA_DISCONNECTED:
|
||||||
DEBUG("%s WiFi disconnected\n", __func__);
|
DEBUG("%s WiFi disconnected from ssid %s, reason %d\n", __func__,
|
||||||
|
event->event_info.disconnected.ssid,
|
||||||
|
event->event_info.disconnected.reason);
|
||||||
|
|
||||||
|
/* unregister RX callback function */
|
||||||
|
esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_STA, NULL);
|
||||||
|
|
||||||
_esp_wifi_dev.connected = false;
|
_esp_wifi_dev.connected = false;
|
||||||
_esp_wifi_dev.event = SYSTEM_EVENT_ETH_DISCONNECTED;
|
_esp_wifi_dev.event = SYSTEM_EVENT_STA_DISCONNECTED;
|
||||||
_esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
|
_esp_wifi_dev.netdev.event_callback(&_esp_wifi_dev.netdev, NETDEV_EVENT_ISR);
|
||||||
|
|
||||||
|
/* call disconnect to reset internal state */
|
||||||
|
result = esp_wifi_disconnect();
|
||||||
|
if (result != ESP_OK) {
|
||||||
|
LOG_TAG_ERROR("esp_wifi", "esp_wifi_disconnect failed with "
|
||||||
|
"return value %d\n", result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try to reconnect */
|
||||||
|
result = esp_wifi_connect();
|
||||||
|
if (result != ESP_OK) {
|
||||||
|
LOG_TAG_ERROR("esp_wifi", "esp_wifi_connect failed with "
|
||||||
|
"return value %d\n", result);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
DEBUG("%s event %d\n", __func__, event->event_id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** TODO better place
|
/* we use predefined station configuration */
|
||||||
* Default WiFi configuration, overwrite them with your configs
|
static wifi_config_t wifi_config_sta = {
|
||||||
*/
|
.sta = {
|
||||||
#ifndef CONFIG_WIFI_STA_SSID
|
.ssid = ESP_WIFI_SSID,
|
||||||
#define CONFIG_WIFI_STA_SSID "RIOT_AP"
|
.password = ESP_WIFI_PASS,
|
||||||
#endif
|
.channel = 0,
|
||||||
#ifndef CONFIG_WIFI_STA_PASSWORD
|
.scan_method = WIFI_ALL_CHANNEL_SCAN,
|
||||||
#define CONFIG_WIFI_STA_PASSWORD "ThisistheRIOTporttoESP"
|
.sort_method = WIFI_CONNECT_AP_BY_SIGNAL,
|
||||||
#endif
|
.threshold.rssi = -127,
|
||||||
#ifndef CONFIG_WIFI_STA_CHANNEL
|
.threshold.authmode = WIFI_AUTH_WPA_WPA2_PSK
|
||||||
#define CONFIG_WIFI_STA_CHANNEL 0
|
}
|
||||||
#endif
|
};
|
||||||
|
|
||||||
#define CONFIG_WIFI_STA_SCAN_METHOD WIFI_ALL_CHANNEL_SCAN
|
|
||||||
#define CONFIG_WIFI_STA_SORT_METHOD WIFI_CONNECT_AP_BY_SIGNAL
|
|
||||||
#define CONFIG_WIFI_STA_RSSI -127
|
|
||||||
#define CONFIG_WIFI_STA_AUTHMODE WIFI_AUTH_WPA_WPA2_PSK
|
|
||||||
|
|
||||||
static void esp_wifi_setup (esp_wifi_netdev_t* dev)
|
static void esp_wifi_setup (esp_wifi_netdev_t* dev)
|
||||||
{
|
{
|
||||||
@ -171,19 +235,6 @@ static void esp_wifi_setup (esp_wifi_netdev_t* dev)
|
|||||||
/* TODO */
|
/* TODO */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* we use predefined station configuration */
|
|
||||||
wifi_config_t wifi_config_sta = {
|
|
||||||
.sta = {
|
|
||||||
.ssid = CONFIG_WIFI_STA_SSID,
|
|
||||||
.password = CONFIG_WIFI_STA_PASSWORD,
|
|
||||||
.channel = CONFIG_WIFI_STA_CHANNEL,
|
|
||||||
.scan_method = CONFIG_WIFI_STA_SCAN_METHOD,
|
|
||||||
.sort_method = CONFIG_WIFI_STA_SORT_METHOD,
|
|
||||||
.threshold.rssi = CONFIG_WIFI_STA_RSSI,
|
|
||||||
.threshold.authmode = CONFIG_WIFI_STA_AUTHMODE
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
result = esp_wifi_set_mode(WIFI_MODE_STA);
|
result = esp_wifi_set_mode(WIFI_MODE_STA);
|
||||||
if (result != ESP_OK) {
|
if (result != ESP_OK) {
|
||||||
LOG_TAG_ERROR("esp_wifi", "esp_wifi_set_mode failed with return value %d\n", result);
|
LOG_TAG_ERROR("esp_wifi", "esp_wifi_set_mode failed with return value %d\n", result);
|
||||||
@ -214,12 +265,6 @@ static void esp_wifi_setup (esp_wifi_netdev_t* dev)
|
|||||||
dev->connected = false;
|
dev->connected = false;
|
||||||
|
|
||||||
mutex_init(&dev->dev_lock);
|
mutex_init(&dev->dev_lock);
|
||||||
|
|
||||||
result = esp_wifi_connect();
|
|
||||||
if (result != ESP_OK) {
|
|
||||||
LOG_TAG_ERROR("esp_wifi", "esp_wifi_connect failed with return value %d\n", result);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _esp_wifi_init(netdev_t *netdev)
|
static int _esp_wifi_init(netdev_t *netdev)
|
||||||
@ -285,6 +330,7 @@ static int _esp_wifi_send(netdev_t *netdev, const iolist_t *iolist)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&dev->dev_lock);
|
mutex_unlock(&dev->dev_lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,7 +344,7 @@ static int _esp_wifi_recv(netdev_t *netdev, void *buf, size_t len, void *info)
|
|||||||
|
|
||||||
mutex_lock(&dev->dev_lock);
|
mutex_lock(&dev->dev_lock);
|
||||||
|
|
||||||
uint8_t size = dev->rx_len;
|
uint16_t size = dev->rx_len;
|
||||||
|
|
||||||
if (!buf && !len) {
|
if (!buf && !len) {
|
||||||
/* return the size without dropping received data */
|
/* return the size without dropping received data */
|
||||||
@ -356,9 +402,12 @@ static int _esp_wifi_get(netdev_t *netdev, netopt_t opt, void *val, size_t max_l
|
|||||||
esp_wifi_get_mac(ESP_MAC_WIFI_STA,(uint8_t *)val);
|
esp_wifi_get_mac(ESP_MAC_WIFI_STA,(uint8_t *)val);
|
||||||
return ETHERNET_ADDR_LEN;
|
return ETHERNET_ADDR_LEN;
|
||||||
case NETOPT_IS_WIRED:
|
case NETOPT_IS_WIRED:
|
||||||
return true;
|
return false;
|
||||||
case NETOPT_LINK_CONNECTED:
|
case NETOPT_LINK_CONNECTED:
|
||||||
return dev->connected;
|
assert(max_len == 1);
|
||||||
|
*((netopt_enable_t *)val) = (dev->connected) ? NETOPT_ENABLE
|
||||||
|
: NETOPT_DISABLE;
|
||||||
|
return 1;
|
||||||
default:
|
default:
|
||||||
return netdev_eth_get(netdev, opt, val, max_len);
|
return netdev_eth_get(netdev, opt, val, max_len);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
* @{
|
* @{
|
||||||
*
|
*
|
||||||
* @file
|
* @file
|
||||||
* @brief Netdev interface for the ESP WiFi AP-based communication
|
* @brief Network device driver for the ESP32 WiFi interface
|
||||||
*
|
*
|
||||||
* @author Gunar Schorcht <gunar@schorcht.net>
|
* @author Gunar Schorcht <gunar@schorcht.net>
|
||||||
*/
|
*/
|
||||||
@ -37,10 +37,10 @@ typedef struct
|
|||||||
{
|
{
|
||||||
netdev_t netdev; /**< netdev parent struct */
|
netdev_t netdev; /**< netdev parent struct */
|
||||||
|
|
||||||
uint8_t rx_len; /**< number of bytes received */
|
uint16_t rx_len; /**< number of bytes received */
|
||||||
uint8_t rx_buf[ETHERNET_DATA_LEN]; /**< receive buffer */
|
uint8_t rx_buf[ETHERNET_DATA_LEN]; /**< receive buffer */
|
||||||
|
|
||||||
uint8_t tx_len; /**< number of bytes in transmit buffer */
|
uint16_t tx_len; /**< number of bytes in transmit buffer */
|
||||||
uint8_t tx_buf[ETHERNET_DATA_LEN]; /**< transmit buffer */
|
uint8_t tx_buf[ETHERNET_DATA_LEN]; /**< transmit buffer */
|
||||||
|
|
||||||
uint32_t event; /**< received event */
|
uint32_t event; /**< received event */
|
||||||
|
|||||||
@ -8,10 +8,11 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup cpu_esp32_esp_wifi
|
* @ingroup cpu_esp32_esp_wifi
|
||||||
|
* @ingroup cpu_esp32_conf
|
||||||
* @{
|
* @{
|
||||||
*
|
*
|
||||||
* @file
|
* @file
|
||||||
* @brief Parameters for the netdev interface for ESP WiFi module
|
* @brief Parameters for the ESP32 WiFi netdev interface
|
||||||
*
|
*
|
||||||
* @author Gunar Schorcht <gunar@schorcht.net>
|
* @author Gunar Schorcht <gunar@schorcht.net>
|
||||||
*/
|
*/
|
||||||
@ -25,14 +26,33 @@
|
|||||||
* @name Set default configuration parameters for the ESP WiFi netdev driver
|
* @name Set default configuration parameters for the ESP WiFi netdev driver
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The size of the stack used for the ESP WIFI netdev driver thread.
|
||||||
|
*/
|
||||||
#ifndef ESP_WIFI_STACKSIZE
|
#ifndef ESP_WIFI_STACKSIZE
|
||||||
/** The size of the stack used for the ESP WiFi netdev driver thread */
|
#define ESP_WIFI_STACKSIZE (THREAD_STACKSIZE_DEFAULT)
|
||||||
#define ESP_WIFI_STACKSIZE THREAD_STACKSIZE_DEFAULT
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The priority of the ESP WiFi netdev driver thread. Should not be changed.
|
||||||
|
*/
|
||||||
#ifndef ESP_WIFI_PRIO
|
#ifndef ESP_WIFI_PRIO
|
||||||
/** The priority of the ESP WiFi netdev driver thread */
|
#define ESP_WIFI_PRIO (GNRC_NETIF_PRIO)
|
||||||
#define ESP_WIFI_PRIO GNRC_NETIF_PRIO
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSID of the AP to be used.
|
||||||
|
*/
|
||||||
|
#ifndef ESP_WIFI_SSID
|
||||||
|
#define ESP_WIFI_SSID "RIOT_AP"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Passphrase used for the AP as clear text (max. 64 chars).
|
||||||
|
*/
|
||||||
|
#ifndef ESP_WIFI_PASS
|
||||||
|
#define ESP_WIFI_PASS "ThisistheRIOTporttoESP"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|||||||
@ -26,17 +26,22 @@ USEMODULE += esp_now
|
|||||||
|
|
||||||
For ESP-NOW, ESP32 nodes are used in WiFi SoftAP + Station mode to advertise their SSID and become visible to other ESP32 nodes. The SSID of an ESP32 node is the concatenation of the prefix ```RIOT_ESP_``` with the MAC address of its SoftAP WiFi interface. The driver periodically scans all visible ESP32 nodes.
|
For ESP-NOW, ESP32 nodes are used in WiFi SoftAP + Station mode to advertise their SSID and become visible to other ESP32 nodes. The SSID of an ESP32 node is the concatenation of the prefix ```RIOT_ESP_``` with the MAC address of its SoftAP WiFi interface. The driver periodically scans all visible ESP32 nodes.
|
||||||
|
|
||||||
The following parameters are defined for ESP-NOW nodes. These parameters can be overriden by [application-specific board configurations](#esp32_application_specific_board_configuration).
|
The following parameters are defined for ESP-NOW nodes.
|
||||||
|
|
||||||
<center>
|
<center>
|
||||||
|
|
||||||
Parameter | Default | Description
|
Parameter | Default | Description
|
||||||
:---------|:--------|:-----------
|
:---------|:--------|:-----------
|
||||||
ESP_NOW_SCAN_PERIOD | 10000000UL | Defines the period in us at which an node scans for other nodes in its range. The default period is 10 s.
|
ESP_NOW_SCAN_PERIOD | 10000000UL | Defines the period in us at which an node scans for other nodes in its range. The default period is 10 s.
|
||||||
ESP_NOW_SOFT_AP_PASSPHRASE | ThisistheRIOTporttoESP | Defines the passphrase (max. 64 chars) that is used for the SoftAP interface of an nodes. It has to be same for all nodes in one network.
|
ESP_NOW_SOFT_AP_PASS | "ThisistheRIOTporttoESP" | Defines the passphrase as clear text (max. 64 chars) that is used for the SoftAP interface of ESP-NOW nodes. It has to be same for all nodes in one network.
|
||||||
ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together.
|
ESP_NOW_CHANNEL | 6 | Defines the channel that is used as the broadcast medium by all nodes together.
|
||||||
ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type ```uint8_t[16]``` and has to be exactly 16 bytes long.
|
ESP_NOW_KEY | NULL | Defines a key that is used for encrypted communication between nodes. If it is NULL, encryption is disabled. The key has to be of type ```uint8_t[16]``` and has to be exactly 16 bytes long.
|
||||||
|
|
||||||
</center>
|
</center>
|
||||||
|
|
||||||
|
@note The ESP-NOW network interface (module `esp_now`) and the
|
||||||
|
Wifi network interface (module `esp_wifi`)
|
||||||
|
can be used simultaneously, for example, to realize a border router for
|
||||||
|
a mesh network which uses ESP-NOW.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user