mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Support DM9051 SPI ethernet device (#6861)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
		| @@ -66,9 +66,10 @@ ETHERNET_TYPES = { | ||||
|     "KSZ8081RNA": EthernetType.ETHERNET_TYPE_KSZ8081RNA, | ||||
|     "W5500": EthernetType.ETHERNET_TYPE_W5500, | ||||
|     "OPENETH": EthernetType.ETHERNET_TYPE_OPENETH, | ||||
|     "DM9051": EthernetType.ETHERNET_TYPE_DM9051, | ||||
| } | ||||
|  | ||||
| SPI_ETHERNET_TYPES = ["W5500"] | ||||
| SPI_ETHERNET_TYPES = ["W5500", "DM9051"] | ||||
| SPI_ETHERNET_DEFAULT_POLLING_INTERVAL = TimePeriodMilliseconds(milliseconds=10) | ||||
|  | ||||
| emac_rmii_clock_mode_t = cg.global_ns.enum("emac_rmii_clock_mode_t") | ||||
| @@ -224,6 +225,7 @@ CONFIG_SCHEMA = cv.All( | ||||
|             "KSZ8081RNA": RMII_SCHEMA, | ||||
|             "W5500": SPI_SCHEMA, | ||||
|             "OPENETH": BASE_SCHEMA, | ||||
|             "DM9051": SPI_SCHEMA, | ||||
|         }, | ||||
|         upper=True, | ||||
|     ), | ||||
| @@ -278,7 +280,7 @@ async def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
|  | ||||
|     if config[CONF_TYPE] == "W5500": | ||||
|     if config[CONF_TYPE] in SPI_ETHERNET_TYPES: | ||||
|         cg.add(var.set_clk_pin(config[CONF_CLK_PIN])) | ||||
|         cg.add(var.set_miso_pin(config[CONF_MISO_PIN])) | ||||
|         cg.add(var.set_mosi_pin(config[CONF_MOSI_PIN])) | ||||
| @@ -296,7 +298,9 @@ async def to_code(config): | ||||
|         cg.add_define("USE_ETHERNET_SPI") | ||||
|         if CORE.using_esp_idf: | ||||
|             add_idf_sdkconfig_option("CONFIG_ETH_USE_SPI_ETHERNET", True) | ||||
|             add_idf_sdkconfig_option("CONFIG_ETH_SPI_ETHERNET_W5500", True) | ||||
|             add_idf_sdkconfig_option( | ||||
|                 f"CONFIG_ETH_SPI_ETHERNET_{config[CONF_TYPE]}", True | ||||
|             ) | ||||
|     elif config[CONF_TYPE] == "OPENETH": | ||||
|         cg.add_define("USE_ETHERNET_OPENETH") | ||||
|         add_idf_sdkconfig_option("CONFIG_ETH_USE_OPENETH", True) | ||||
|   | ||||
| @@ -90,8 +90,8 @@ void EthernetComponent::setup() { | ||||
|  | ||||
| #ifdef USE_ETHERNET_SPI  // Configure SPI interface and Ethernet driver for specific SPI module | ||||
|   spi_device_interface_config_t devcfg = { | ||||
|       .command_bits = 16,  // Actually it's the address phase in W5500 SPI frame | ||||
|       .address_bits = 8,   // Actually it's the control phase in W5500 SPI frame | ||||
|       .command_bits = 0, | ||||
|       .address_bits = 0, | ||||
|       .dummy_bits = 0, | ||||
|       .mode = 0, | ||||
|       .duty_cycle_pos = 0, | ||||
| @@ -107,22 +107,43 @@ void EthernetComponent::setup() { | ||||
|   }; | ||||
|  | ||||
| #if ESP_IDF_VERSION_MAJOR >= 5 | ||||
| #if CONFIG_ETH_SPI_ETHERNET_W5500 | ||||
|   eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(host, &devcfg); | ||||
| #endif | ||||
| #if CONFIG_ETH_SPI_ETHERNET_DM9051 | ||||
|   eth_dm9051_config_t dm9051_config = ETH_DM9051_DEFAULT_CONFIG(host, &devcfg); | ||||
| #endif | ||||
| #else | ||||
|   spi_device_handle_t spi_handle = nullptr; | ||||
|   err = spi_bus_add_device(host, &devcfg, &spi_handle); | ||||
|   ESPHL_ERROR_CHECK(err, "SPI bus add device error"); | ||||
|  | ||||
| #if CONFIG_ETH_SPI_ETHERNET_W5500 | ||||
|   eth_w5500_config_t w5500_config = ETH_W5500_DEFAULT_CONFIG(spi_handle); | ||||
| #endif | ||||
| #if CONFIG_ETH_SPI_ETHERNET_DM9051 | ||||
|   eth_dm9051_config_t dm9051_config = ETH_DM9051_DEFAULT_CONFIG(spi_handle); | ||||
| #endif | ||||
| #endif  // ESP_IDF_VERSION_MAJOR >= 5 | ||||
|  | ||||
| #if CONFIG_ETH_SPI_ETHERNET_W5500 | ||||
|   w5500_config.int_gpio_num = this->interrupt_pin_; | ||||
| #ifdef USE_ETHERNET_SPI_POLLING_SUPPORT | ||||
|   w5500_config.poll_period_ms = this->polling_interval_; | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #if CONFIG_ETH_SPI_ETHERNET_DM9051 | ||||
|   dm9051_config.int_gpio_num = this->interrupt_pin_; | ||||
| #ifdef USE_ETHERNET_SPI_POLLING_SUPPORT | ||||
|   dm9051_config.poll_period_ms = this->polling_interval_; | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|   phy_config.phy_addr = this->phy_addr_spi_; | ||||
|   phy_config.reset_gpio_num = this->reset_pin_; | ||||
|  | ||||
|   esp_eth_mac_t *mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config); | ||||
|   esp_eth_mac_t *mac = nullptr; | ||||
| #elif defined(USE_ETHERNET_OPENETH) | ||||
|   esp_eth_mac_t *mac = esp_eth_mac_new_openeth(&mac_config); | ||||
| #else | ||||
| @@ -187,10 +208,20 @@ void EthernetComponent::setup() { | ||||
|     } | ||||
| #endif | ||||
| #ifdef USE_ETHERNET_SPI | ||||
| #if CONFIG_ETH_SPI_ETHERNET_W5500 | ||||
|     case ETHERNET_TYPE_W5500: { | ||||
|       mac = esp_eth_mac_new_w5500(&w5500_config, &mac_config); | ||||
|       this->phy_ = esp_eth_phy_new_w5500(&phy_config); | ||||
|       break; | ||||
|     } | ||||
| #endif | ||||
| #if CONFIG_ETH_SPI_ETHERNET_DM9051 | ||||
|     case ETHERNET_TYPE_DM9051: { | ||||
|       mac = esp_eth_mac_new_dm9051(&dm9051_config, &mac_config); | ||||
|       this->phy_ = esp_eth_phy_new_dm9051(&phy_config); | ||||
|       break; | ||||
|     } | ||||
| #endif | ||||
| #endif | ||||
|     default: { | ||||
|       this->mark_failed(); | ||||
| @@ -321,6 +352,10 @@ void EthernetComponent::dump_config() { | ||||
|       eth_type = "OPENETH"; | ||||
|       break; | ||||
|  | ||||
|     case ETHERNET_TYPE_DM9051: | ||||
|       eth_type = "DM9051"; | ||||
|       break; | ||||
|  | ||||
|     default: | ||||
|       eth_type = "Unknown"; | ||||
|       break; | ||||
|   | ||||
| @@ -26,6 +26,7 @@ enum EthernetType : uint8_t { | ||||
|   ETHERNET_TYPE_KSZ8081RNA, | ||||
|   ETHERNET_TYPE_W5500, | ||||
|   ETHERNET_TYPE_OPENETH, | ||||
|   ETHERNET_TYPE_DM9051, | ||||
| }; | ||||
|  | ||||
| struct ManualIP { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user