/ components / esp_eth / test / test_dm9051.c
test_dm9051.c
  1  #include <stdio.h>
  2  #include <string.h>
  3  #include "sdkconfig.h"
  4  #include "freertos/FreeRTOS.h"
  5  #include "freertos/task.h"
  6  #include "freertos/event_groups.h"
  7  #include "unity.h"
  8  #include "test_utils.h"
  9  #include "esp_event.h"
 10  #include "esp_eth.h"
 11  #include "esp_log.h"
 12  #include "driver/gpio.h"
 13  
 14  #if CONFIG_ETH_SPI_ETHERNET_DM9051
 15  
 16  static const char *TAG = "dm9051_test";
 17  
 18  #define ETH_START_BIT BIT(0)
 19  #define ETH_STOP_BIT BIT(1)
 20  #define ETH_CONNECT_BIT BIT(2)
 21  #define ETH_GOT_IP_BIT BIT(3)
 22  
 23  #define ETH_START_TIMEOUT_MS (10000)
 24  #define ETH_CONNECT_TIMEOUT_MS (40000)
 25  #define ETH_STOP_TIMEOUT_MS (10000)
 26  #define ETH_GET_IP_TIMEOUT_MS (60000)
 27  
 28  /** Event handler for Ethernet events */
 29  static void eth_event_handler(void *arg, esp_event_base_t event_base,
 30                                int32_t event_id, void *event_data)
 31  {
 32      EventGroupHandle_t eth_event_group = (EventGroupHandle_t)arg;
 33      switch (event_id) {
 34      case ETHERNET_EVENT_CONNECTED:
 35          xEventGroupSetBits(eth_event_group, ETH_CONNECT_BIT);
 36          ESP_LOGI(TAG, "Ethernet Link Up");
 37          break;
 38      case ETHERNET_EVENT_DISCONNECTED:
 39          ESP_LOGI(TAG, "Ethernet Link Down");
 40          break;
 41      case ETHERNET_EVENT_START:
 42          xEventGroupSetBits(eth_event_group, ETH_START_BIT);
 43          ESP_LOGI(TAG, "Ethernet Started");
 44          break;
 45      case ETHERNET_EVENT_STOP:
 46          xEventGroupSetBits(eth_event_group, ETH_STOP_BIT);
 47          ESP_LOGI(TAG, "Ethernet Stopped");
 48          break;
 49      default:
 50          break;
 51      }
 52  }
 53  
 54  /** Event handler for IP_EVENT_ETH_GOT_IP */
 55  static void got_ip_event_handler(void *arg, esp_event_base_t event_base,
 56                                   int32_t event_id, void *event_data)
 57  {
 58      EventGroupHandle_t eth_event_group = (EventGroupHandle_t)arg;
 59      ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
 60      const esp_netif_ip_info_t *ip_info = &event->ip_info;
 61      ESP_LOGI(TAG, "Ethernet Got IP Address");
 62      ESP_LOGI(TAG, "~~~~~~~~~~~");
 63      ESP_LOGI(TAG, "ETHIP:" IPSTR, IP2STR(&ip_info->ip));
 64      ESP_LOGI(TAG, "ETHMASK:" IPSTR, IP2STR(&ip_info->netmask));
 65      ESP_LOGI(TAG, "ETHGW:" IPSTR, IP2STR(&ip_info->gw));
 66      ESP_LOGI(TAG, "~~~~~~~~~~~");
 67      xEventGroupSetBits(eth_event_group, ETH_GOT_IP_BIT);
 68  }
 69  
 70  TEST_CASE("dm9051 io test", "[ethernet][dm9051][ignore]")
 71  {
 72      spi_device_handle_t spi_handle = NULL;
 73      spi_bus_config_t buscfg = {
 74          .miso_io_num = 25,
 75          .mosi_io_num = 23,
 76          .sclk_io_num = 19,
 77          .quadwp_io_num = -1,
 78          .quadhd_io_num = -1,
 79      };
 80      TEST_ESP_OK(spi_bus_initialize(HSPI_HOST, &buscfg, 1));
 81      spi_device_interface_config_t devcfg = {
 82          .command_bits = 1,
 83          .address_bits = 7,
 84          .mode = 0,
 85          .clock_speed_hz = 20 * 1000 * 1000,
 86          .spics_io_num = 22,
 87          .queue_size = 20
 88      };
 89      TEST_ESP_OK(spi_bus_add_device(HSPI_HOST, &devcfg, &spi_handle));
 90      gpio_install_isr_service(0);
 91      test_case_uses_tcpip();
 92      TEST_ESP_OK(esp_event_loop_create_default());
 93      // create TCP/IP netif
 94      esp_netif_config_t cfg = ESP_NETIF_DEFAULT_ETH();
 95      esp_netif_t *eth_netif = esp_netif_new(&cfg);
 96      // set default handlers to do layer 3 (and up) stuffs
 97      TEST_ESP_OK(esp_eth_set_default_handlers(eth_netif));
 98      // register user defined event handers
 99      TEST_ESP_OK(esp_event_handler_register(ETH_EVENT, ESP_EVENT_ANY_ID, &eth_event_handler, NULL));
100      TEST_ESP_OK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &got_ip_event_handler, NULL));
101      eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
102      eth_dm9051_config_t dm9051_config = ETH_DM9051_DEFAULT_CONFIG(spi_handle);
103      esp_eth_mac_t *mac = esp_eth_mac_new_dm9051(&dm9051_config, &mac_config);
104      eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
105      esp_eth_phy_t *phy = esp_eth_phy_new_dm9051(&phy_config);
106      esp_eth_config_t config = ETH_DEFAULT_CONFIG(mac, phy);
107      esp_eth_handle_t eth_handle = NULL;
108      // install Ethernet driver
109      TEST_ESP_OK(esp_eth_driver_install(&config, &eth_handle));
110      // combine driver with netif
111      void *glue = esp_eth_new_netif_glue(eth_handle);
112      TEST_ESP_OK(esp_netif_attach(eth_netif, glue));
113      // start Ethernet driver
114      TEST_ESP_OK(esp_eth_start(eth_handle));
115      /* wait for IP lease */
116      vTaskDelay(pdMS_TO_TICKS(portMAX_DELAY));
117      // stop Ethernet driver
118      TEST_ESP_OK(esp_eth_stop(eth_handle));
119      TEST_ESP_OK(esp_eth_del_netif_glue(glue));
120      TEST_ESP_OK(esp_eth_driver_uninstall(eth_handle));
121      TEST_ESP_OK(phy->del(phy));
122      TEST_ESP_OK(mac->del(mac));
123      TEST_ESP_OK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, got_ip_event_handler));
124      TEST_ESP_OK(esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, eth_event_handler));
125      TEST_ESP_OK(esp_eth_clear_default_handlers(eth_netif));
126      esp_netif_destroy(eth_netif);
127      TEST_ESP_OK(esp_event_loop_delete_default());
128      TEST_ESP_OK(spi_bus_remove_device(spi_handle));
129      TEST_ESP_OK(spi_bus_free(HSPI_HOST));
130  }
131  #endif