mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 10:47:19 +02:00
ethernet:add start stop control
This commit is contained in:
@ -131,6 +131,35 @@ esp_err_t esp_eth_driver_install(const esp_eth_config_t *config, esp_eth_handle_
|
|||||||
*/
|
*/
|
||||||
esp_err_t esp_eth_driver_uninstall(esp_eth_handle_t hdl);
|
esp_err_t esp_eth_driver_uninstall(esp_eth_handle_t hdl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Start Ethernet driver
|
||||||
|
*
|
||||||
|
* @note This API will start driver state machine and internal software timer (for checking link status).
|
||||||
|
*
|
||||||
|
* @param[in] hdl handle of Ethernet driver
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - ESP_OK: start esp_eth driver successfully
|
||||||
|
* - ESP_ERR_INVALID_ARG: start esp_eth driver failed because of some invalid argument
|
||||||
|
* - ESP_ERR_INVALID_STATE: start esp_eth driver failed because driver has started already
|
||||||
|
* - ESP_FAIL: start esp_eth driver failed because some other error occurred
|
||||||
|
*/
|
||||||
|
esp_err_t esp_eth_start(esp_eth_handle_t hdl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stop Ethernet driver
|
||||||
|
*
|
||||||
|
* @note This function does the oppsite operation of `esp_eth_start`.
|
||||||
|
*
|
||||||
|
* @param[in] hdl handle of Ethernet driver
|
||||||
|
* @return
|
||||||
|
* - ESP_OK: stop esp_eth driver successfully
|
||||||
|
* - ESP_ERR_INVALID_ARG: stop esp_eth driver failed because of some invalid argument
|
||||||
|
* - ESP_ERR_INVALID_STATE: stop esp_eth driver failed because driver has not started yet
|
||||||
|
* - ESP_FAIL: stop esp_eth driver failed because some other error occurred
|
||||||
|
*/
|
||||||
|
esp_err_t esp_eth_stop(esp_eth_handle_t hdl);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief General Transmit
|
* @brief General Transmit
|
||||||
*
|
*
|
||||||
|
@ -34,6 +34,8 @@ static const char *TAG = "esp_eth";
|
|||||||
|
|
||||||
ESP_EVENT_DEFINE_BASE(ETH_EVENT);
|
ESP_EVENT_DEFINE_BASE(ETH_EVENT);
|
||||||
|
|
||||||
|
#define ESP_ETH_FLAGS_STARTED (1<<0)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The Ethernet driver mainly consists of PHY, MAC and
|
* @brief The Ethernet driver mainly consists of PHY, MAC and
|
||||||
* the mediator who will handle the request/response from/to MAC, PHY and Users.
|
* the mediator who will handle the request/response from/to MAC, PHY and Users.
|
||||||
@ -53,6 +55,7 @@ typedef struct {
|
|||||||
eth_duplex_t duplex;
|
eth_duplex_t duplex;
|
||||||
eth_link_t link;
|
eth_link_t link;
|
||||||
atomic_int ref_count;
|
atomic_int ref_count;
|
||||||
|
uint32_t flags;
|
||||||
esp_err_t (*stack_input)(esp_eth_handle_t eth_handle, uint8_t *buffer, uint32_t length);
|
esp_err_t (*stack_input)(esp_eth_handle_t eth_handle, uint8_t *buffer, uint32_t length);
|
||||||
esp_err_t (*on_lowlevel_init_done)(esp_eth_handle_t eth_handle);
|
esp_err_t (*on_lowlevel_init_done)(esp_eth_handle_t eth_handle);
|
||||||
esp_err_t (*on_lowlevel_deinit_done)(esp_eth_handle_t eth_handle);
|
esp_err_t (*on_lowlevel_deinit_done)(esp_eth_handle_t eth_handle);
|
||||||
@ -190,15 +193,8 @@ esp_err_t esp_eth_driver_install(const esp_eth_config_t *config, esp_eth_handle_
|
|||||||
eth_driver->check_link_timer = xTimerCreate("eth_link_timer", pdMS_TO_TICKS(config->check_link_period_ms), pdTRUE,
|
eth_driver->check_link_timer = xTimerCreate("eth_link_timer", pdMS_TO_TICKS(config->check_link_period_ms), pdTRUE,
|
||||||
eth_driver, eth_check_link_timer_cb);
|
eth_driver, eth_check_link_timer_cb);
|
||||||
ETH_CHECK(eth_driver->check_link_timer, "create eth_link_timer failed", err_create_timer, ESP_FAIL);
|
ETH_CHECK(eth_driver->check_link_timer, "create eth_link_timer failed", err_create_timer, ESP_FAIL);
|
||||||
ETH_CHECK(xTimerStart(eth_driver->check_link_timer, 0) == pdPASS, "start eth_link_timer failed", err_start_timer, ESP_FAIL);
|
|
||||||
ETH_CHECK(esp_event_post(ETH_EVENT, ETHERNET_EVENT_START, ð_driver, sizeof(eth_driver), 0) == ESP_OK,
|
|
||||||
"send ETHERNET_EVENT_START event failed", err_event, ESP_FAIL);
|
|
||||||
*out_hdl = (esp_eth_handle_t)eth_driver;
|
*out_hdl = (esp_eth_handle_t)eth_driver;
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
err_event:
|
|
||||||
xTimerStop(eth_driver->check_link_timer, 0);
|
|
||||||
err_start_timer:
|
|
||||||
xTimerDelete(eth_driver->check_link_timer, 0);
|
|
||||||
err_create_timer:
|
err_create_timer:
|
||||||
phy->deinit(phy);
|
phy->deinit(phy);
|
||||||
err_init_phy:
|
err_init_phy:
|
||||||
@ -221,8 +217,6 @@ esp_err_t esp_eth_driver_uninstall(esp_eth_handle_t hdl)
|
|||||||
esp_eth_mac_t *mac = eth_driver->mac;
|
esp_eth_mac_t *mac = eth_driver->mac;
|
||||||
esp_eth_phy_t *phy = eth_driver->phy;
|
esp_eth_phy_t *phy = eth_driver->phy;
|
||||||
ETH_CHECK(xTimerDelete(eth_driver->check_link_timer, 0) == pdPASS, "delete eth_link_timer failed", err, ESP_FAIL);
|
ETH_CHECK(xTimerDelete(eth_driver->check_link_timer, 0) == pdPASS, "delete eth_link_timer failed", err, ESP_FAIL);
|
||||||
ETH_CHECK(esp_event_post(ETH_EVENT, ETHERNET_EVENT_STOP, ð_driver, sizeof(eth_driver), 0) == ESP_OK,
|
|
||||||
"send ETHERNET_EVENT_STOP event failed", err, ESP_FAIL);
|
|
||||||
ETH_CHECK(phy->deinit(phy) == ESP_OK, "deinit phy failed", err, ESP_FAIL);
|
ETH_CHECK(phy->deinit(phy) == ESP_OK, "deinit phy failed", err, ESP_FAIL);
|
||||||
ETH_CHECK(mac->deinit(mac) == ESP_OK, "deinit mac failed", err, ESP_FAIL);
|
ETH_CHECK(mac->deinit(mac) == ESP_OK, "deinit mac failed", err, ESP_FAIL);
|
||||||
free(eth_driver);
|
free(eth_driver);
|
||||||
@ -231,6 +225,52 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
esp_err_t esp_eth_start(esp_eth_handle_t hdl)
|
||||||
|
{
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
|
esp_eth_driver_t *eth_driver = (esp_eth_driver_t *)hdl;
|
||||||
|
ETH_CHECK(eth_driver, "ethernet driver handle can't be null", err, ESP_ERR_INVALID_ARG);
|
||||||
|
// check if driver has started
|
||||||
|
if (eth_driver->flags & ESP_ETH_FLAGS_STARTED) {
|
||||||
|
ESP_LOGW(TAG, "driver started already");
|
||||||
|
ret = ESP_ERR_INVALID_STATE;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
eth_driver->flags |= ESP_ETH_FLAGS_STARTED;
|
||||||
|
ETH_CHECK(eth_driver->phy->reset(eth_driver->phy) == ESP_OK, "reset phy failed", err, ESP_FAIL);
|
||||||
|
ETH_CHECK(xTimerStart(eth_driver->check_link_timer, 0) == pdPASS,
|
||||||
|
"start eth_link_timer failed", err, ESP_FAIL);
|
||||||
|
ETH_CHECK(esp_event_post(ETH_EVENT, ETHERNET_EVENT_START, ð_driver, sizeof(eth_driver), 0) == ESP_OK,
|
||||||
|
"send ETHERNET_EVENT_START event failed", err_event, ESP_FAIL);
|
||||||
|
return ESP_OK;
|
||||||
|
err_event:
|
||||||
|
xTimerStop(eth_driver->check_link_timer, 0);
|
||||||
|
err:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_err_t esp_eth_stop(esp_eth_handle_t hdl)
|
||||||
|
{
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
|
esp_eth_driver_t *eth_driver = (esp_eth_driver_t *)hdl;
|
||||||
|
ETH_CHECK(eth_driver, "ethernet driver handle can't be null", err, ESP_ERR_INVALID_ARG);
|
||||||
|
// check if driver has started
|
||||||
|
if (eth_driver->flags & ESP_ETH_FLAGS_STARTED) {
|
||||||
|
eth_driver->flags &= ~ESP_ETH_FLAGS_STARTED;
|
||||||
|
ETH_CHECK(xTimerStop(eth_driver->check_link_timer, 0) == pdPASS,
|
||||||
|
"stop eth_link_timer failed", err, ESP_FAIL);
|
||||||
|
ETH_CHECK(esp_event_post(ETH_EVENT, ETHERNET_EVENT_STOP, ð_driver, sizeof(eth_driver), 0) == ESP_OK,
|
||||||
|
"send ETHERNET_EVENT_STOP event failed", err, ESP_FAIL);
|
||||||
|
} else {
|
||||||
|
ESP_LOGW(TAG, "driver not started yet");
|
||||||
|
ret = ESP_ERR_INVALID_STATE;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
return ESP_OK;
|
||||||
|
err:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
esp_err_t esp_eth_transmit(esp_eth_handle_t hdl, uint8_t *buf, uint32_t length)
|
esp_err_t esp_eth_transmit(esp_eth_handle_t hdl, uint8_t *buf, uint32_t length)
|
||||||
{
|
{
|
||||||
esp_err_t ret = ESP_OK;
|
esp_err_t ret = ESP_OK;
|
||||||
|
@ -122,6 +122,7 @@ err:
|
|||||||
static esp_err_t dm9051_reset(esp_eth_phy_t *phy)
|
static esp_err_t dm9051_reset(esp_eth_phy_t *phy)
|
||||||
{
|
{
|
||||||
phy_dm9051_t *dm9051 = __containerof(phy, phy_dm9051_t, parent);
|
phy_dm9051_t *dm9051 = __containerof(phy, phy_dm9051_t, parent);
|
||||||
|
dm9051->link_status = ETH_LINK_DOWN;
|
||||||
esp_eth_mediator_t *eth = dm9051->eth;
|
esp_eth_mediator_t *eth = dm9051->eth;
|
||||||
dscr_reg_t dscr;
|
dscr_reg_t dscr;
|
||||||
PHY_CHECK(eth->phy_reg_read(eth, dm9051->addr, ETH_PHY_DSCR_REG_ADDR, &(dscr.val)) == ESP_OK, "read DSCR failed", err);
|
PHY_CHECK(eth->phy_reg_read(eth, dm9051->addr, ETH_PHY_DSCR_REG_ADDR, &(dscr.val)) == ESP_OK, "read DSCR failed", err);
|
||||||
|
@ -128,6 +128,7 @@ err:
|
|||||||
static esp_err_t dp83848_reset(esp_eth_phy_t *phy)
|
static esp_err_t dp83848_reset(esp_eth_phy_t *phy)
|
||||||
{
|
{
|
||||||
phy_dp83848_t *dp83848 = __containerof(phy, phy_dp83848_t, parent);
|
phy_dp83848_t *dp83848 = __containerof(phy, phy_dp83848_t, parent);
|
||||||
|
dp83848->link_status = ETH_LINK_DOWN;
|
||||||
esp_eth_mediator_t *eth = dp83848->eth;
|
esp_eth_mediator_t *eth = dp83848->eth;
|
||||||
bmcr_reg_t bmcr = {.reset = 1};
|
bmcr_reg_t bmcr = {.reset = 1};
|
||||||
PHY_CHECK(eth->phy_reg_write(eth, dp83848->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val) == ESP_OK, "write BMCR failed", err);
|
PHY_CHECK(eth->phy_reg_write(eth, dp83848->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val) == ESP_OK, "write BMCR failed", err);
|
||||||
|
@ -157,6 +157,7 @@ err:
|
|||||||
static esp_err_t ip101_reset(esp_eth_phy_t *phy)
|
static esp_err_t ip101_reset(esp_eth_phy_t *phy)
|
||||||
{
|
{
|
||||||
phy_ip101_t *ip101 = __containerof(phy, phy_ip101_t, parent);
|
phy_ip101_t *ip101 = __containerof(phy, phy_ip101_t, parent);
|
||||||
|
ip101->link_status = ETH_LINK_DOWN;
|
||||||
esp_eth_mediator_t *eth = ip101->eth;
|
esp_eth_mediator_t *eth = ip101->eth;
|
||||||
bmcr_reg_t bmcr = {.reset = 1};
|
bmcr_reg_t bmcr = {.reset = 1};
|
||||||
PHY_CHECK(eth->phy_reg_write(eth, ip101->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val) == ESP_OK, "write BMCR failed", err);
|
PHY_CHECK(eth->phy_reg_write(eth, ip101->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val) == ESP_OK, "write BMCR failed", err);
|
||||||
|
@ -200,6 +200,7 @@ err:
|
|||||||
static esp_err_t lan8720_reset(esp_eth_phy_t *phy)
|
static esp_err_t lan8720_reset(esp_eth_phy_t *phy)
|
||||||
{
|
{
|
||||||
phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent);
|
phy_lan8720_t *lan8720 = __containerof(phy, phy_lan8720_t, parent);
|
||||||
|
lan8720->link_status = ETH_LINK_DOWN;
|
||||||
esp_eth_mediator_t *eth = lan8720->eth;
|
esp_eth_mediator_t *eth = lan8720->eth;
|
||||||
bmcr_reg_t bmcr = {.reset = 1};
|
bmcr_reg_t bmcr = {.reset = 1};
|
||||||
PHY_CHECK(eth->phy_reg_write(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val) == ESP_OK, "write BMCR failed", err);
|
PHY_CHECK(eth->phy_reg_write(eth, lan8720->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val) == ESP_OK, "write BMCR failed", err);
|
||||||
|
@ -118,6 +118,7 @@ err:
|
|||||||
static esp_err_t rtl8201_reset(esp_eth_phy_t *phy)
|
static esp_err_t rtl8201_reset(esp_eth_phy_t *phy)
|
||||||
{
|
{
|
||||||
phy_rtl8201_t *rtl8201 = __containerof(phy, phy_rtl8201_t, parent);
|
phy_rtl8201_t *rtl8201 = __containerof(phy, phy_rtl8201_t, parent);
|
||||||
|
rtl8201->link_status = ETH_LINK_DOWN;
|
||||||
esp_eth_mediator_t *eth = rtl8201->eth;
|
esp_eth_mediator_t *eth = rtl8201->eth;
|
||||||
bmcr_reg_t bmcr = {.reset = 1};
|
bmcr_reg_t bmcr = {.reset = 1};
|
||||||
PHY_CHECK(eth->phy_reg_write(eth, rtl8201->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val) == ESP_OK, "write BMCR failed", err);
|
PHY_CHECK(eth->phy_reg_write(eth, rtl8201->addr, ETH_PHY_BMCR_REG_ADDR, bmcr.val) == ESP_OK, "write BMCR failed", err);
|
||||||
|
@ -87,7 +87,6 @@ static esp_err_t test_uninstall_driver(esp_eth_handle_t eth_hdl, uint32_t ms_to_
|
|||||||
|
|
||||||
TEST_CASE("esp32 ethernet io test", "[ethernet][test_env=UT_T2_Ethernet]")
|
TEST_CASE("esp32 ethernet io test", "[ethernet][test_env=UT_T2_Ethernet]")
|
||||||
{
|
{
|
||||||
TEST_ESP_OK(esp_event_loop_create_default());
|
|
||||||
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
|
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
|
||||||
esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config);
|
esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config);
|
||||||
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
|
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
|
||||||
@ -95,7 +94,6 @@ TEST_CASE("esp32 ethernet io test", "[ethernet][test_env=UT_T2_Ethernet]")
|
|||||||
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
|
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
|
||||||
esp_eth_handle_t eth_handle = NULL;
|
esp_eth_handle_t eth_handle = NULL;
|
||||||
TEST_ESP_OK(esp_eth_driver_install(ð_config, ð_handle));
|
TEST_ESP_OK(esp_eth_driver_install(ð_config, ð_handle));
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
|
||||||
/* get MAC address */
|
/* get MAC address */
|
||||||
uint8_t mac_addr[6];
|
uint8_t mac_addr[6];
|
||||||
memset(mac_addr, 0, sizeof(mac_addr));
|
memset(mac_addr, 0, sizeof(mac_addr));
|
||||||
@ -112,7 +110,6 @@ TEST_CASE("esp32 ethernet io test", "[ethernet][test_env=UT_T2_Ethernet]")
|
|||||||
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
||||||
TEST_ESP_OK(phy->del(phy));
|
TEST_ESP_OK(phy->del(phy));
|
||||||
TEST_ESP_OK(mac->del(mac));
|
TEST_ESP_OK(mac->del(mac));
|
||||||
TEST_ESP_OK(esp_event_loop_delete_default());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("esp32 ethernet event test", "[ethernet][test_env=UT_T2_Ethernet]")
|
TEST_CASE("esp32 ethernet event test", "[ethernet][test_env=UT_T2_Ethernet]")
|
||||||
@ -129,19 +126,20 @@ TEST_CASE("esp32 ethernet event test", "[ethernet][test_env=UT_T2_Ethernet]")
|
|||||||
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
|
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
|
||||||
esp_eth_handle_t eth_handle = NULL;
|
esp_eth_handle_t eth_handle = NULL;
|
||||||
TEST_ESP_OK(esp_eth_driver_install(ð_config, ð_handle));
|
TEST_ESP_OK(esp_eth_driver_install(ð_config, ð_handle));
|
||||||
|
TEST_ESP_OK(esp_eth_start(eth_handle));
|
||||||
/* wait for connection start */
|
/* wait for connection start */
|
||||||
bits = xEventGroupWaitBits(eth_event_group, ETH_START_BIT, true, true, pdMS_TO_TICKS(ETH_START_TIMEOUT_MS));
|
bits = xEventGroupWaitBits(eth_event_group, ETH_START_BIT, true, true, pdMS_TO_TICKS(ETH_START_TIMEOUT_MS));
|
||||||
TEST_ASSERT((bits & ETH_START_BIT) == ETH_START_BIT);
|
TEST_ASSERT((bits & ETH_START_BIT) == ETH_START_BIT);
|
||||||
/* wait for connection establish */
|
/* wait for connection establish */
|
||||||
bits = xEventGroupWaitBits(eth_event_group, ETH_CONNECT_BIT, true, true, pdMS_TO_TICKS(ETH_CONNECT_TIMEOUT_MS));
|
bits = xEventGroupWaitBits(eth_event_group, ETH_CONNECT_BIT, true, true, pdMS_TO_TICKS(ETH_CONNECT_TIMEOUT_MS));
|
||||||
TEST_ASSERT((bits & ETH_CONNECT_BIT) == ETH_CONNECT_BIT);
|
TEST_ASSERT((bits & ETH_CONNECT_BIT) == ETH_CONNECT_BIT);
|
||||||
/* driver should be uninstalled within 2 seconds */
|
// stop Ethernet driver
|
||||||
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
TEST_ESP_OK(esp_eth_stop(eth_handle));
|
||||||
/* wait for connection stop */
|
/* wait for connection stop */
|
||||||
bits = xEventGroupWaitBits(eth_event_group, ETH_STOP_BIT, true, true, pdMS_TO_TICKS(ETH_STOP_TIMEOUT_MS));
|
bits = xEventGroupWaitBits(eth_event_group, ETH_STOP_BIT, true, true, pdMS_TO_TICKS(ETH_STOP_TIMEOUT_MS));
|
||||||
TEST_ASSERT((bits & ETH_STOP_BIT) == ETH_STOP_BIT);
|
TEST_ASSERT((bits & ETH_STOP_BIT) == ETH_STOP_BIT);
|
||||||
// "check link timer callback" might owned the reference of phy object, make sure it has release it
|
/* driver should be uninstalled within 2 seconds */
|
||||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
||||||
TEST_ESP_OK(phy->del(phy));
|
TEST_ESP_OK(phy->del(phy));
|
||||||
TEST_ESP_OK(mac->del(mac));
|
TEST_ESP_OK(mac->del(mac));
|
||||||
TEST_ESP_OK(esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, eth_event_handler));
|
TEST_ESP_OK(esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, eth_event_handler));
|
||||||
@ -166,16 +164,58 @@ TEST_CASE("esp32 ethernet dhcp test", "[ethernet][test_env=UT_T2_Ethernet]")
|
|||||||
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
|
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
|
||||||
esp_eth_handle_t eth_handle = NULL;
|
esp_eth_handle_t eth_handle = NULL;
|
||||||
TEST_ESP_OK(esp_eth_driver_install(ð_config, ð_handle));
|
TEST_ESP_OK(esp_eth_driver_install(ð_config, ð_handle));
|
||||||
|
TEST_ESP_OK(esp_eth_start(eth_handle));
|
||||||
/* wait for IP lease */
|
/* wait for IP lease */
|
||||||
bits = xEventGroupWaitBits(eth_event_group, ETH_GOT_IP_BIT, true, true, pdMS_TO_TICKS(ETH_GET_IP_TIMEOUT_MS));
|
bits = xEventGroupWaitBits(eth_event_group, ETH_GOT_IP_BIT, true, true, pdMS_TO_TICKS(ETH_GET_IP_TIMEOUT_MS));
|
||||||
TEST_ASSERT((bits & ETH_GOT_IP_BIT) == ETH_GOT_IP_BIT);
|
TEST_ASSERT((bits & ETH_GOT_IP_BIT) == ETH_GOT_IP_BIT);
|
||||||
/* driver should be uninstalled within 2 seconds */
|
// stop Ethernet driver
|
||||||
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
TEST_ESP_OK(esp_eth_stop(eth_handle));
|
||||||
/* wait for connection stop */
|
/* wait for connection stop */
|
||||||
bits = xEventGroupWaitBits(eth_event_group, ETH_STOP_BIT, true, true, pdMS_TO_TICKS(ETH_STOP_TIMEOUT_MS));
|
bits = xEventGroupWaitBits(eth_event_group, ETH_STOP_BIT, true, true, pdMS_TO_TICKS(ETH_STOP_TIMEOUT_MS));
|
||||||
TEST_ASSERT((bits & ETH_STOP_BIT) == ETH_STOP_BIT);
|
TEST_ASSERT((bits & ETH_STOP_BIT) == ETH_STOP_BIT);
|
||||||
// "check link timer callback" might owned the reference of phy object, make sure it has release it
|
/* driver should be uninstalled within 2 seconds */
|
||||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
||||||
|
TEST_ESP_OK(phy->del(phy));
|
||||||
|
TEST_ESP_OK(mac->del(mac));
|
||||||
|
TEST_ESP_OK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, got_ip_event_handler));
|
||||||
|
TEST_ESP_OK(esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, eth_event_handler));
|
||||||
|
TEST_ESP_OK(tcpip_adapter_clear_default_eth_handlers());
|
||||||
|
TEST_ESP_OK(esp_event_loop_delete_default());
|
||||||
|
vEventGroupDelete(eth_event_group);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("esp32 ethernet start/stop stress test", "[ethernet][test_env=UT_T2_Ethernet][timeout=240]")
|
||||||
|
{
|
||||||
|
EventBits_t bits = 0;
|
||||||
|
EventGroupHandle_t eth_event_group = xEventGroupCreate();
|
||||||
|
TEST_ASSERT(eth_event_group != NULL);
|
||||||
|
test_case_uses_tcpip();
|
||||||
|
TEST_ESP_OK(esp_event_loop_create_default());
|
||||||
|
TEST_ESP_OK(tcpip_adapter_set_default_eth_handlers());
|
||||||
|
TEST_ESP_OK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, ð_event_handler, eth_event_group));
|
||||||
|
TEST_ESP_OK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &got_ip_event_handler, eth_event_group));
|
||||||
|
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
|
||||||
|
esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config);
|
||||||
|
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
|
||||||
|
esp_eth_phy_t *phy = esp_eth_phy_new_ip101(&phy_config);
|
||||||
|
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
|
||||||
|
esp_eth_handle_t eth_handle = NULL;
|
||||||
|
TEST_ESP_OK(esp_eth_driver_install(ð_config, ð_handle));
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
TEST_ESP_OK(esp_eth_start(eth_handle));
|
||||||
|
/* wait for IP lease */
|
||||||
|
bits = xEventGroupWaitBits(eth_event_group, ETH_GOT_IP_BIT, true, true, pdMS_TO_TICKS(ETH_GET_IP_TIMEOUT_MS));
|
||||||
|
TEST_ASSERT((bits & ETH_GOT_IP_BIT) == ETH_GOT_IP_BIT);
|
||||||
|
// stop Ethernet driver
|
||||||
|
TEST_ESP_OK(esp_eth_stop(eth_handle));
|
||||||
|
/* wait for connection stop */
|
||||||
|
bits = xEventGroupWaitBits(eth_event_group, ETH_STOP_BIT, true, true, pdMS_TO_TICKS(ETH_STOP_TIMEOUT_MS));
|
||||||
|
TEST_ASSERT((bits & ETH_STOP_BIT) == ETH_STOP_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* driver should be uninstalled within 2 seconds */
|
||||||
|
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
||||||
TEST_ESP_OK(phy->del(phy));
|
TEST_ESP_OK(phy->del(phy));
|
||||||
TEST_ESP_OK(mac->del(mac));
|
TEST_ESP_OK(mac->del(mac));
|
||||||
TEST_ESP_OK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, got_ip_event_handler));
|
TEST_ESP_OK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, got_ip_event_handler));
|
||||||
@ -220,7 +260,10 @@ TEST_CASE("dm9051 io test", "[ethernet][ignore]")
|
|||||||
esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
|
esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
|
||||||
esp_eth_handle_t eth_handle = NULL;
|
esp_eth_handle_t eth_handle = NULL;
|
||||||
TEST_ESP_OK(esp_eth_driver_install(&config, ð_handle));
|
TEST_ESP_OK(esp_eth_driver_install(&config, ð_handle));
|
||||||
|
TEST_ESP_OK(esp_eth_start(eth_handle));
|
||||||
vTaskDelay(pdMS_TO_TICKS(portMAX_DELAY));
|
vTaskDelay(pdMS_TO_TICKS(portMAX_DELAY));
|
||||||
|
// stop Ethernet driver
|
||||||
|
TEST_ESP_OK(esp_eth_stop(eth_handle));
|
||||||
/* driver should be uninstalled within 2 seconds */
|
/* driver should be uninstalled within 2 seconds */
|
||||||
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
TEST_ESP_OK(test_uninstall_driver(eth_handle, 2000));
|
||||||
TEST_ESP_OK(phy->del(phy));
|
TEST_ESP_OK(phy->del(phy));
|
||||||
|
@ -232,6 +232,7 @@ static void start()
|
|||||||
#endif
|
#endif
|
||||||
esp_eth_config_t config = ETH_DEFAULT_CONFIG(s_mac, s_phy);
|
esp_eth_config_t config = ETH_DEFAULT_CONFIG(s_mac, s_phy);
|
||||||
ESP_ERROR_CHECK(esp_eth_driver_install(&config, &s_eth_handle));
|
ESP_ERROR_CHECK(esp_eth_driver_install(&config, &s_eth_handle));
|
||||||
|
ESP_ERROR_CHECK(esp_eth_start(s_eth_handle));
|
||||||
s_connection_name = "Ethernet";
|
s_connection_name = "Ethernet";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,6 +243,7 @@ static void stop()
|
|||||||
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_GOT_IP6, &on_got_ipv6));
|
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_GOT_IP6, &on_got_ipv6));
|
||||||
ESP_ERROR_CHECK(esp_event_handler_unregister(ETH_EVENT, ETHERNET_EVENT_CONNECTED, &on_eth_event));
|
ESP_ERROR_CHECK(esp_event_handler_unregister(ETH_EVENT, ETHERNET_EVENT_CONNECTED, &on_eth_event));
|
||||||
#endif
|
#endif
|
||||||
|
ESP_ERROR_CHECK(esp_eth_stop(s_eth_handle));
|
||||||
ESP_ERROR_CHECK(esp_eth_driver_uninstall(s_eth_handle));
|
ESP_ERROR_CHECK(esp_eth_driver_uninstall(s_eth_handle));
|
||||||
ESP_ERROR_CHECK(s_phy->del(s_phy));
|
ESP_ERROR_CHECK(s_phy->del(s_phy));
|
||||||
ESP_ERROR_CHECK(s_mac->del(s_mac));
|
ESP_ERROR_CHECK(s_mac->del(s_mac));
|
||||||
|
@ -118,4 +118,5 @@ void app_main()
|
|||||||
esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
|
esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
|
||||||
esp_eth_handle_t eth_handle = NULL;
|
esp_eth_handle_t eth_handle = NULL;
|
||||||
ESP_ERROR_CHECK(esp_eth_driver_install(&config, ð_handle));
|
ESP_ERROR_CHECK(esp_eth_driver_install(&config, ð_handle));
|
||||||
|
ESP_ERROR_CHECK(esp_eth_start(eth_handle));
|
||||||
}
|
}
|
||||||
|
@ -191,6 +191,7 @@ static void initialize_ethernet(void)
|
|||||||
config.stack_input = pkt_eth2wifi;
|
config.stack_input = pkt_eth2wifi;
|
||||||
ESP_ERROR_CHECK(esp_eth_driver_install(&config, &s_eth_handle));
|
ESP_ERROR_CHECK(esp_eth_driver_install(&config, &s_eth_handle));
|
||||||
esp_eth_ioctl(s_eth_handle, ETH_CMD_S_PROMISCUOUS, (void *)true);
|
esp_eth_ioctl(s_eth_handle, ETH_CMD_S_PROMISCUOUS, (void *)true);
|
||||||
|
ESP_ERROR_CHECK(esp_eth_start(s_eth_handle));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initialize_wifi(void)
|
static void initialize_wifi(void)
|
||||||
|
@ -228,6 +228,7 @@ void register_ethernet()
|
|||||||
#endif
|
#endif
|
||||||
esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
|
esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
|
||||||
ESP_ERROR_CHECK(esp_eth_driver_install(&config, ð_handle));
|
ESP_ERROR_CHECK(esp_eth_driver_install(&config, ð_handle));
|
||||||
|
ESP_ERROR_CHECK(esp_eth_start(eth_handle));
|
||||||
|
|
||||||
eth_control_args.control = arg_str1(NULL, NULL, "<info>", "Get info of Ethernet");
|
eth_control_args.control = arg_str1(NULL, NULL, "<info>", "Get info of Ethernet");
|
||||||
eth_control_args.end = arg_end(1);
|
eth_control_args.end = arg_end(1);
|
||||||
|
Reference in New Issue
Block a user