From 813c9dcf223115293de070e327923ee5cb84389a Mon Sep 17 00:00:00 2001 From: suda-morris <362953310@qq.com> Date: Fri, 10 May 2019 13:52:23 +0800 Subject: [PATCH] ethernet: add eth2ap example This example illustrates how to do Layer2 packet forwarding bussiness between Wi-Fi and Ethernet. --- examples/ethernet/eth2ap/CMakeLists.txt | 4 + examples/ethernet/eth2ap/Makefile | 8 + examples/ethernet/eth2ap/README.md | 114 ++++++++ examples/ethernet/eth2ap/eth2ap.png | Bin 0 -> 88732 bytes examples/ethernet/eth2ap/main/CMakeLists.txt | 6 + .../ethernet/eth2ap/main/Kconfig.projbuild | 111 +++++++ examples/ethernet/eth2ap/main/component.mk | 4 + .../eth2ap/main/eth2ap_example_main.c | 275 ++++++++++++++++++ examples/ethernet/eth2ap/sdkconfig.defaults | 1 + 9 files changed, 523 insertions(+) create mode 100644 examples/ethernet/eth2ap/CMakeLists.txt create mode 100644 examples/ethernet/eth2ap/Makefile create mode 100644 examples/ethernet/eth2ap/README.md create mode 100644 examples/ethernet/eth2ap/eth2ap.png create mode 100644 examples/ethernet/eth2ap/main/CMakeLists.txt create mode 100644 examples/ethernet/eth2ap/main/Kconfig.projbuild create mode 100644 examples/ethernet/eth2ap/main/component.mk create mode 100644 examples/ethernet/eth2ap/main/eth2ap_example_main.c create mode 100644 examples/ethernet/eth2ap/sdkconfig.defaults diff --git a/examples/ethernet/eth2ap/CMakeLists.txt b/examples/ethernet/eth2ap/CMakeLists.txt new file mode 100644 index 0000000000..5a2b416c7f --- /dev/null +++ b/examples/ethernet/eth2ap/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(eth2ap) diff --git a/examples/ethernet/eth2ap/Makefile b/examples/ethernet/eth2ap/Makefile new file mode 100644 index 0000000000..fe024c7f62 --- /dev/null +++ b/examples/ethernet/eth2ap/Makefile @@ -0,0 +1,8 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := eth2ap + +include $(IDF_PATH)/make/project.mk diff --git a/examples/ethernet/eth2ap/README.md b/examples/ethernet/eth2ap/README.md new file mode 100644 index 0000000000..2a4989440d --- /dev/null +++ b/examples/ethernet/eth2ap/README.md @@ -0,0 +1,114 @@ +# eth2ap Example +(See the README.md file in the upper level 'examples' directory for more information about examples. To try a more complex application about Ethernet to WiFi data forwarding, please go to [iot-solution](https://github.com/espressif/esp-iot-solution/tree/master/examples/eth2wifi).) + +## Overview +![eth2ap](eth2ap.png) + +The similarities on MAC layer between Ethernet and Wi-Fi make it easy to forward packets from Ethernet to Wi-Fi and vice versa. This example illustrates how to implement a simple "router" which only supports forwarding packets between Ethernet port and Wi-Fi AP interface. In this case, the Ethernet should play the role of WAN (i.e. it can access outside network) so that a mobile device could get access to the Internet when it gets connected to ESP32 through Wi-Fi. + +**Note:** In this example, ESP32 works like a *bridge* between Ethernet and Wi-Fi, and it won't perform any actions on Layer3 and higher layer, which means there's no need to initialize the TCP/IP stack. + +## How to use this example + +### Hardware Required + +To run this example, it's recommended that you have an official ESP32 Ethernet development board - [ESP32-Ethernet-Kit](https://docs.espressif.com/projects/esp-idf/en/latest/hw-reference/get-started-ethernet-kit.html). This example should also work for 3rd party ESP32 board as long as it's integrated with a supported Ethernet PHY chip. Up until now, ESP-IDF supports three Ethernet PHY: `TLK110`, `LAN8720` and `IP101`, additional PHY drivers should be implemented by users themselves. + +### Configure the project + +Enter `make menuconfig` if you are using GNU Make based build system or enter `idf.py menuconfig` if you are using CMake based build system. Then go into `Example Configuration` menu. + +* Choose PHY device under `Ethernet PHY Device`, by default, the **ESP32-Ethernet-Kit** has an `IP101` on board. +* Set PHY address under `Ethernet PHY address`, it should depend on the PHY configuration of your hardware. You'd better consult the schematic of the board. By default, the PHY address of **ESP32-Ethernet-Kit** is *1*. +* Check whether or not to control the power of PHY chip under `Use PHY Power (enable / disable) pin`, (if set true, you also need to give the GPIO number of that pin under `PHY Power GPIO`). +* Set SMI MDC/MDIO GPIO number according to board schematic, by default they are set as below: + + | Default Example GPIO | RMII Signal | Notes | + | -------------------- | ----------- | ------------- | + | GPIO23 | MDC | Output to PHY | + | GPIO18 | MDIO | Bidirectional | + +* Select one kind of RMII clock mode under `Ethernet RMII Clock Mode` option. Possible configurations of the clock are listed as below. By default, ESP32-Ethernet-Kit use the `GPIO0 input` mode, which gives a good performance when enabling Ethernet and Wi-Fi at the same time. + + | Mode | GPIO Pin | Signal name | Notes | + | -------- | -------- | ------------ | ------------------------------------------------------------ | + | external | GPIO0 | EMAC_TX_CLK | Input of 50MHz PHY clock | + | internal | GPIO0 | CLK_OUT1 | Output of 50MHz APLL clock | + | internal | GPIO16 | EMAC_CLK_OUT | Output of 50MHz APLL clock | + | internal | GPIO17 | EMAC_CLK_180 | Inverted output of 50MHz APLL clock (suitable for long clock trace) | + + * External RMII clock must be connected to `GPIO0`. + * ESP32 can generate the RMII clock(50MHz) using its internal APLL. But if the APLL has already been used for other peripheral (e.g. I²S), you'd better choose the external clock. + +* Set the SSID and password for Wi-Fi ap interface under `Wi-Fi SSID` and `Wi-Fi Password`. +* Set the maximum connection number under `Maximum STA connections`. + +### Build and Flash + +To build and flash the example, enter `make -j4 flash monitor` if you are using GNU Make based build system or enter `idf.py build flash monitor` if you are using CMake based build system. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +### Step 1: Initialize Ethernet and Wi-Fi (AP mode) + +```bash +I (508) example: Power On Ethernet PHY +I (518) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (518) emac: emac reset done +I (518) example: Ethernet Started +...... +I (538) wifi: wifi driver task: 3ffc7fbc, prio:23, stack:3584, core=0 +I (538) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (538) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE +I (568) wifi: wifi firmware version: ec61a20 +I (568) wifi: config NVS flash: enabled +I (568) wifi: config nano formating: disabled +I (568) wifi: Init dynamic tx buffer num: 32 +I (568) wifi: Init data frame dynamic rx buffer num: 32 +I (578) wifi: Init management frame dynamic rx buffer num: 32 +I (588) wifi: Init management short buffer num: 32 +I (588) wifi: Init static rx buffer size: 1600 +I (588) wifi: Init static rx buffer num: 10 +I (598) wifi: Init dynamic rx buffer num: 32 +``` + +### Step 2: Ethernet Connects to Router/Switch/PC (with DHCP server enabled) + +```bash +I (4518) example: Ethernet Link Up +``` + +### Step 3: Start Wi-Fi AP + +```bash +I (4618) phy: phy_version: 4100, 2a5dd04, Jan 23 2019, 21:00:07, 0, 0 +I (4618) wifi: mode : softAP (30:ae:a4:c6:87:5b) +I (4628) wifi: Total power save buffer number: 16 +I (4628) wifi: Init max length of beacon: 752/752 +I (4628) wifi: Init max length of beacon: 752/752 +``` + +### Step 4: Wi-Fi station (e.g. mobile phone) connects to ESP32's Wi-Fi + +```bash +I (10168) wifi: new:<1,0>, old:<1,0>, ap:<1,1>, sta:<255,255>, prof:1 +I (10168) wifi: station: c4:0b:cb:ec:9a:84 join, AID=1, bgn, 20 +I (10258) example: AP got a station connected +``` + +Now your mobile phone should get access to the Internet. + +## Troubleshooting + +* Got error message `emac: emac rx buf err` when running the example. + * This example just forwards the packets on the Layer2 between Wi-Fi and Ethernet, it won't do any Layer3 business. So make sure you have disabled the `CONFIG_ETH_EMAC_L2_TO_L3_RX_BUF_MODE`. By default, this option is false in the `sdkconfig.defaults` file. + +* Got error message `example: WiFi send packet failed: -1` when running the example. + * Ethernet process packets faster than Wi-Fi on ESP32, so have a try to enlarge the value of `FLOW_CONTROL_WIFI_SEND_DELAY_MS`. + +* Wi-Fi station doesn't receive any IP via DHCP. + * All Layer 3 (TCP/IP functions) on the ESP32 are disabled, including the SoftAP DHCP server. This means that devices must be able to access another DHCP server (for example on a Wi-Fi router connected via ethernet) or should use statically assigned IP addresses. diff --git a/examples/ethernet/eth2ap/eth2ap.png b/examples/ethernet/eth2ap/eth2ap.png new file mode 100644 index 0000000000000000000000000000000000000000..39e59aa14fccc872f69dc5d7a752ef6aeded9f6b GIT binary patch literal 88732 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 literal 0 HcmV?d00001 diff --git a/examples/ethernet/eth2ap/main/CMakeLists.txt b/examples/ethernet/eth2ap/main/CMakeLists.txt new file mode 100644 index 0000000000..aaf55bea54 --- /dev/null +++ b/examples/ethernet/eth2ap/main/CMakeLists.txt @@ -0,0 +1,6 @@ + +set(COMPONENT_SRCS "eth2ap_example_main.c") + +set(COMPONENT_ADD_INCLUDEDIRS ".") + +register_component() diff --git a/examples/ethernet/eth2ap/main/Kconfig.projbuild b/examples/ethernet/eth2ap/main/Kconfig.projbuild new file mode 100644 index 0000000000..70dce6b386 --- /dev/null +++ b/examples/ethernet/eth2ap/main/Kconfig.projbuild @@ -0,0 +1,111 @@ +menu "Example Configuration" + + choice EXAMPLE_PHY_MODEL + prompt "Ethernet PHY Device" + default EXAMPLE_PHY_IP101 + help + Select the PHY driver to use for the example. + config EXAMPLE_PHY_IP101 + bool "IP101" + help + IP101 is a single port 10/100 MII/RMII/TP/Fiber Fast Ethernet Transceiver. + Goto http://www.icplus.com.tw/pp-IP101G.html for more information about it. + config EXAMPLE_PHY_TLK110 + bool "TLK110" + help + TLK110 is an Industrial 10/100Mbps Ethernet Physical Layer Transceiver. + Goto http://www.ti.com/product/TLK110 for information about it. + config EXAMPLE_PHY_LAN8720 + bool "LAN8720" + help + LAN8720 is a small footprint RMII 10/100 Ethernet Transceiver with HP Auto-MDIX Support. + Goto https://www.microchip.com/LAN8720A for more information about it. + endchoice + + config EXAMPLE_PHY_ADDRESS + int "Ethernet PHY Address" + default 1 + range 0 31 + help + PHY Address of your PHY device. It depends on your schematic design. + + choice EXAMPLE_PHY_CLOCK_MODE + prompt "Ethernet RMII Clock Mode" + default EXAMPLE_PHY_CLOCK_GPIO0_IN + help + Select external (input on GPIO0) or internal (output on GPIO0, GPIO16 or GPIO17) RMII clock. + config EXAMPLE_PHY_CLOCK_GPIO0_IN + bool "GPIO0 Input" + help + Input of 50MHz RMII clock on GPIO0. + config EXAMPLE_PHY_CLOCK_GPIO0_OUT + bool "GPIO0 Output" + help + Output the internal 50MHz RMII clock on GPIO0. + config EXAMPLE_PHY_CLOCK_GPIO16_OUT + bool "GPIO16 Output" + help + Output the internal 50MHz RMII clock on GPIO16. + config EXAMPLE_PHY_CLOCK_GPIO17_OUT + bool "GPIO17 Output (inverted)" + help + Output the internal 50MHz RMII clock on GPIO17 (inverted signal). + endchoice + + config EXAMPLE_PHY_CLOCK_MODE + int + default 0 if EXAMPLE_PHY_CLOCK_GPIO0_IN + default 1 if EXAMPLE_PHY_CLOCK_GPIO0_OUT + default 2 if EXAMPLE_PHY_CLOCK_GPIO16_OUT + default 3 if EXAMPLE_PHY_CLOCK_GPIO17_OUT + + config EXAMPLE_PHY_USE_POWER_PIN + bool "Use PHY Power (enable / disable) pin" + default y + help + Use a GPIO "power pin" to power the PHY on/off during operation. + When using GPIO0 to input RMII clock, the reset process will be interfered by this clock. + So we need another GPIO to control the switch on / off of the RMII clock. + + if EXAMPLE_PHY_USE_POWER_PIN + config EXAMPLE_PHY_POWER_PIN + int "PHY power pin" + default 5 + range 0 33 + help + Set the GPIO number used for powering on/off the PHY. + endif + + config EXAMPLE_PHY_SMI_MDC_PIN + int "Ethernet SMI MDC gpio number" + default 23 + range 0 33 + help + GPIO number used for SMI clock signal. + + config EXAMPLE_PHY_SMI_MDIO_PIN + int "Ethernet SMI MDIO gpio number" + default 18 + range 0 33 + help + GPIO number used for SMI data signal. + + config EXAMPLE_WIFI_SSID + string "Wi-Fi SSID" + default "eth2ap" + help + Set the SSID of Wi-Fi ap interface. + + config EXAMPLE_WIFI_PASSWORD + string "Wi-Fi Password" + default "12345678" + help + Set the password of Wi-Fi ap interface. + + config EXAMPLE_MAX_STA_CONN + int "Maximum STA connections" + default 4 + help + Maximum number of the station that allowed to connect to current Wi-Fi hotspot. + +endmenu diff --git a/examples/ethernet/eth2ap/main/component.mk b/examples/ethernet/eth2ap/main/component.mk new file mode 100644 index 0000000000..a98f634eae --- /dev/null +++ b/examples/ethernet/eth2ap/main/component.mk @@ -0,0 +1,4 @@ +# +# "main" pseudo-component makefile. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) diff --git a/examples/ethernet/eth2ap/main/eth2ap_example_main.c b/examples/ethernet/eth2ap/main/eth2ap_example_main.c new file mode 100644 index 0000000000..ca64cfc7c1 --- /dev/null +++ b/examples/ethernet/eth2ap/main/eth2ap_example_main.c @@ -0,0 +1,275 @@ +/* eth2ap (Ethernet to Wi-Fi AP packet forwarding) Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "esp_event_loop.h" +#include "esp_event.h" +#include "esp_log.h" +#include "esp_eth.h" +#include "esp_wifi.h" +#include "nvs_flash.h" +#include "esp_private/wifi.h" +#include "driver/gpio.h" +#include "sdkconfig.h" + +// Choose the default phy config according to Kconfig +#if CONFIG_EXAMPLE_PHY_LAN8720 +#include "eth_phy/phy_lan8720.h" +#define DEFAULT_ETHERNET_PHY_CONFIG phy_lan8720_default_ethernet_config +#elif CONFIG_EXAMPLE_PHY_TLK110 +#include "eth_phy/phy_tlk110.h" +#define DEFAULT_ETHERNET_PHY_CONFIG phy_tlk110_default_ethernet_config +#elif CONFIG_EXAMPLE_PHY_IP101 +#include "eth_phy/phy_ip101.h" +#define DEFAULT_ETHERNET_PHY_CONFIG phy_ip101_default_ethernet_config +#endif + +#define FLOW_CONTROL_QUEUE_TIMEOUT_MS (100) +#define FLOW_CONTROL_QUEUE_LENGTH (10) +#define FLOW_CONTROL_WIFI_SEND_TIMEOUT_MS (100) + +static const char *TAG = "example"; + +typedef struct { + void *packet; + uint16_t length; +} flow_control_msg_t; + +static xQueueHandle flow_control_queue = NULL; + +static bool s_sta_is_connected = false; +static bool s_ethernet_is_connected = false; +static uint8_t s_eth_mac[6]; + +#ifdef CONFIG_EXAMPLE_PHY_USE_POWER_PIN +/** + * @brief power control function for phy + * + * @param enable: set true to enable PHY power, set false to disable PHY power + * + * @note This function replaces the default PHY power on/off function. + * If this GPIO is not connected on your device (and PHY is always powered), + * you can use the default PHY-specific power on/off function. + */ +static void phy_device_power_enable_via_gpio(bool enable) +{ + assert(DEFAULT_ETHERNET_PHY_CONFIG.phy_power_enable); + if (!enable) { + /* call the default PHY-specific power off function */ + DEFAULT_ETHERNET_PHY_CONFIG.phy_power_enable(false); + } + gpio_pad_select_gpio(CONFIG_EXAMPLE_PHY_POWER_PIN); + gpio_set_direction(CONFIG_EXAMPLE_PHY_POWER_PIN, GPIO_MODE_OUTPUT); + if (enable) { + gpio_set_level(CONFIG_EXAMPLE_PHY_POWER_PIN, 1); + ESP_LOGI(TAG, "Power On Ethernet PHY"); + } else { + gpio_set_level(CONFIG_EXAMPLE_PHY_POWER_PIN, 0); + ESP_LOGI(TAG, "Power Off Ethernet PHY"); + } + vTaskDelay(1); + if (enable) { + /* call the default PHY-specific power on function */ + DEFAULT_ETHERNET_PHY_CONFIG.phy_power_enable(true); + } +} +#endif + +/** + * @brief gpio specific init + * + * @note RMII data pins are fixed in esp32 as follows: + * TXD0 <=> GPIO19 + * TXD1 <=> GPIO22 + * TX_EN <=> GPIO21 + * RXD0 <=> GPIO25 + * RXD1 <=> GPIO26 + * CLK <=> GPIO0 + * + */ +static void eth_gpio_config_rmii(void) +{ + phy_rmii_configure_data_interface_pins(); + phy_rmii_smi_configure_pins(CONFIG_EXAMPLE_PHY_SMI_MDC_PIN, CONFIG_EXAMPLE_PHY_SMI_MDIO_PIN); +} + +// Forward packets from Wi-Fi to Ethernet +static esp_err_t pkt_wifi2eth(void *buffer, uint16_t len, void *eb) +{ + if (s_ethernet_is_connected) { + if (esp_eth_tx(buffer, len) != ESP_OK) { + ESP_LOGE(TAG, "Ethernet send packet failed"); + } + } + esp_wifi_internal_free_rx_buffer(eb); + return ESP_OK; +} + +// Forward packets from Ethernet to Wi-Fi +// Note that, Ethernet works faster than Wi-Fi on ESP32, +// so we need to add an extra queue to balance their speed difference. +static esp_err_t pkt_eth2wifi(void *buffer, uint16_t len, void *eb) +{ + esp_err_t ret = ESP_OK; + flow_control_msg_t msg = { + .packet = buffer, + .length = len + }; + if (xQueueSend(flow_control_queue, &msg, pdMS_TO_TICKS(FLOW_CONTROL_QUEUE_TIMEOUT_MS)) != pdTRUE) { + ESP_LOGE(TAG, "send flow control message failed or timeout"); + ret = ESP_FAIL; + } + return ret; +} + +// This task will fetch the packet from the queue, and then send out through Wi-Fi. +// Wi-Fi handles packets slower than Ethernet, we might add some delay between each transmitting. +static void eth2wifi_flow_control_task(void *args) +{ + flow_control_msg_t msg; + int res = 0; + uint32_t timeout = 0; + while (1) { + if (xQueueReceive(flow_control_queue, &msg, pdMS_TO_TICKS(FLOW_CONTROL_QUEUE_TIMEOUT_MS)) == pdTRUE) { + timeout = 0; + if (s_sta_is_connected && msg.length > 4) { + do { + vTaskDelay(pdMS_TO_TICKS(timeout)); + timeout += 2; + res = esp_wifi_internal_tx(ESP_IF_WIFI_AP, msg.packet, msg.length - 4); + } while (res == -1 && timeout < FLOW_CONTROL_WIFI_SEND_TIMEOUT_MS); + if (res != ESP_OK) { + ESP_LOGE(TAG, "WiFi send packet failed: %d", res); + } + } + esp_eth_free_rx_buf(msg.packet); + } + } + vTaskDelete(NULL); +} + +// Event handler for Ethernet +static void eth_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + switch (event_id) { + case ETHERNET_EVENT_CONNECTED: + ESP_LOGI(TAG, "Ethernet Link Up"); + s_ethernet_is_connected = true; + esp_eth_get_mac(s_eth_mac); + esp_wifi_set_mac(WIFI_IF_AP, s_eth_mac); + ESP_ERROR_CHECK(esp_wifi_start()); + break; + case ETHERNET_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "Ethernet Link Down"); + s_ethernet_is_connected = false; + ESP_ERROR_CHECK(esp_wifi_stop()); + break; + case ETHERNET_EVENT_START: + ESP_LOGI(TAG, "Ethernet Started"); + break; + case ETHERNET_EVENT_STOP: + ESP_LOGI(TAG, "Ethernet Stopped"); + break; + default: + break; + } +} + +// Event handler for Wi-Fi +static void wifi_event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + switch (event_id) { + case WIFI_EVENT_AP_STACONNECTED: + ESP_LOGI(TAG, "Wi-Fi AP got a station connected"); + s_sta_is_connected = true; + esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_AP, pkt_wifi2eth); + break; + case WIFI_EVENT_AP_STADISCONNECTED: + ESP_LOGI(TAG, "Wi-Fi AP got a station disconnected"); + s_sta_is_connected = false; + esp_wifi_internal_reg_rxcb(ESP_IF_WIFI_AP, NULL); + break; + default: + break; + } +} + +static void initialize_ethernet(void) +{ + eth_config_t config = DEFAULT_ETHERNET_PHY_CONFIG; + config.phy_addr = CONFIG_EXAMPLE_PHY_ADDRESS; + config.gpio_config = eth_gpio_config_rmii; + config.clock_mode = CONFIG_EXAMPLE_PHY_CLOCK_MODE; + config.tcpip_input = pkt_eth2wifi; + config.promiscuous_enable = true; +#ifdef CONFIG_EXAMPLE_PHY_USE_POWER_PIN + /* Replace the default 'power enable' function with an example-specific one that toggles a power GPIO. */ + config.phy_power_enable = phy_device_power_enable_via_gpio; +#endif + ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, eth_event_handler, NULL)); + ESP_ERROR_CHECK(esp_eth_init_internal(&config)); + ESP_ERROR_CHECK(esp_eth_enable()); +} + +static void initialize_wifi(void) +{ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, wifi_event_handler, NULL)); + ESP_ERROR_CHECK(esp_wifi_init_internal(&cfg)); + ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); + wifi_config_t wifi_config = { + .ap = { + .ssid = CONFIG_EXAMPLE_WIFI_SSID, + .ssid_len = strlen(CONFIG_EXAMPLE_WIFI_SSID), + .password = CONFIG_EXAMPLE_WIFI_PASSWORD, + .max_connection = CONFIG_EXAMPLE_MAX_STA_CONN, + .authmode = WIFI_AUTH_WPA_WPA2_PSK + }, + }; + if (strlen(CONFIG_EXAMPLE_WIFI_PASSWORD) == 0) { + wifi_config.ap.authmode = WIFI_AUTH_OPEN; + } + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config)); +} + +static esp_err_t initialize_flow_control(void) +{ + flow_control_queue = xQueueCreate(FLOW_CONTROL_QUEUE_LENGTH, sizeof(flow_control_msg_t)); + if (!flow_control_queue) { + ESP_LOGE(TAG, "create flow control queue failed"); + return ESP_FAIL; + } + BaseType_t ret = xTaskCreate(eth2wifi_flow_control_task, "flow_ctl", 2048, NULL, (tskIDLE_PRIORITY + 2), NULL); + if (ret != pdTRUE) { + ESP_LOGE(TAG, "create flow control task failed"); + return ESP_FAIL; + } + return ESP_OK; +} + +void app_main() +{ + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + ESP_ERROR_CHECK(initialize_flow_control()); + + initialize_ethernet(); + initialize_wifi(); +} diff --git a/examples/ethernet/eth2ap/sdkconfig.defaults b/examples/ethernet/eth2ap/sdkconfig.defaults new file mode 100644 index 0000000000..710208fe53 --- /dev/null +++ b/examples/ethernet/eth2ap/sdkconfig.defaults @@ -0,0 +1 @@ +CONFIG_ETH_EMAC_L2_TO_L3_RX_BUF_MODE=n