mirror of
https://github.com/esphome/esphome.git
synced 2024-11-22 15:08:10 +01:00
Add ethernet powerdown (fixes esphome/issues#4420) (#4706)
* Add ethernet powerdown * Add on_shutdown (fixes esphome/issues#4420 * Sync dev and clang-tidy fix * fix typo and trainling space * Initialize phy_ member Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> * Use `this` pointer Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> * Member initialized at declaration Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> * Use `this` pointer Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> * Use `this` pointer --------- Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
f56e89597f
commit
1bdc30a09e
2 changed files with 29 additions and 10 deletions
|
@ -26,8 +26,10 @@ EthernetComponent::EthernetComponent() { global_eth_component = this; }
|
||||||
|
|
||||||
void EthernetComponent::setup() {
|
void EthernetComponent::setup() {
|
||||||
ESP_LOGCONFIG(TAG, "Setting up Ethernet...");
|
ESP_LOGCONFIG(TAG, "Setting up Ethernet...");
|
||||||
// Delay here to allow power to stabilise before Ethernet is initialised.
|
if (esp_reset_reason() != ESP_RST_DEEPSLEEP) {
|
||||||
delay(300); // NOLINT
|
// Delay here to allow power to stabilise before Ethernet is initialized.
|
||||||
|
delay(300); // NOLINT
|
||||||
|
}
|
||||||
|
|
||||||
esp_err_t err;
|
esp_err_t err;
|
||||||
err = esp_netif_init();
|
err = esp_netif_init();
|
||||||
|
@ -52,30 +54,29 @@ void EthernetComponent::setup() {
|
||||||
|
|
||||||
esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config);
|
esp_eth_mac_t *mac = esp_eth_mac_new_esp32(&mac_config);
|
||||||
|
|
||||||
esp_eth_phy_t *phy;
|
|
||||||
switch (this->type_) {
|
switch (this->type_) {
|
||||||
case ETHERNET_TYPE_LAN8720: {
|
case ETHERNET_TYPE_LAN8720: {
|
||||||
phy = esp_eth_phy_new_lan87xx(&phy_config);
|
this->phy_ = esp_eth_phy_new_lan87xx(&phy_config);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ETHERNET_TYPE_RTL8201: {
|
case ETHERNET_TYPE_RTL8201: {
|
||||||
phy = esp_eth_phy_new_rtl8201(&phy_config);
|
this->phy_ = esp_eth_phy_new_rtl8201(&phy_config);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ETHERNET_TYPE_DP83848: {
|
case ETHERNET_TYPE_DP83848: {
|
||||||
phy = esp_eth_phy_new_dp83848(&phy_config);
|
this->phy_ = esp_eth_phy_new_dp83848(&phy_config);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ETHERNET_TYPE_IP101: {
|
case ETHERNET_TYPE_IP101: {
|
||||||
phy = esp_eth_phy_new_ip101(&phy_config);
|
this->phy_ = esp_eth_phy_new_ip101(&phy_config);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ETHERNET_TYPE_JL1101: {
|
case ETHERNET_TYPE_JL1101: {
|
||||||
phy = esp_eth_phy_new_jl1101(&phy_config);
|
this->phy_ = esp_eth_phy_new_jl1101(&phy_config);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ETHERNET_TYPE_KSZ8081: {
|
case ETHERNET_TYPE_KSZ8081: {
|
||||||
phy = esp_eth_phy_new_ksz8081(&phy_config);
|
this->phy_ = esp_eth_phy_new_ksz8081(&phy_config);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
|
@ -84,7 +85,7 @@ void EthernetComponent::setup() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, phy);
|
esp_eth_config_t eth_config = ETH_DEFAULT_CONFIG(mac, this->phy_);
|
||||||
this->eth_handle_ = nullptr;
|
this->eth_handle_ = nullptr;
|
||||||
err = esp_eth_driver_install(ð_config, &this->eth_handle_);
|
err = esp_eth_driver_install(ð_config, &this->eth_handle_);
|
||||||
ESPHL_ERROR_CHECK(err, "ETH driver install error");
|
ESPHL_ERROR_CHECK(err, "ETH driver install error");
|
||||||
|
@ -356,6 +357,21 @@ std::string EthernetComponent::get_use_address() const {
|
||||||
|
|
||||||
void EthernetComponent::set_use_address(const std::string &use_address) { this->use_address_ = use_address; }
|
void EthernetComponent::set_use_address(const std::string &use_address) { this->use_address_ = use_address; }
|
||||||
|
|
||||||
|
bool EthernetComponent::powerdown() {
|
||||||
|
ESP_LOGI(TAG, "Powering down ethernet PHY");
|
||||||
|
if (this->phy_ == nullptr) {
|
||||||
|
ESP_LOGE(TAG, "Ethernet PHY not assigned");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this->connected_ = false;
|
||||||
|
this->started_ = false;
|
||||||
|
if (this->phy_->pwrctl(this->phy_, false) != ESP_OK) {
|
||||||
|
ESP_LOGE(TAG, "Error powering down ethernet PHY");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ethernet
|
} // namespace ethernet
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ class EthernetComponent : public Component {
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
float get_setup_priority() const override;
|
float get_setup_priority() const override;
|
||||||
bool can_proceed() override;
|
bool can_proceed() override;
|
||||||
|
void on_shutdown() override { powerdown(); }
|
||||||
bool is_connected();
|
bool is_connected();
|
||||||
|
|
||||||
void set_phy_addr(uint8_t phy_addr);
|
void set_phy_addr(uint8_t phy_addr);
|
||||||
|
@ -58,6 +59,7 @@ class EthernetComponent : public Component {
|
||||||
network::IPAddress get_ip_address();
|
network::IPAddress get_ip_address();
|
||||||
std::string get_use_address() const;
|
std::string get_use_address() const;
|
||||||
void set_use_address(const std::string &use_address);
|
void set_use_address(const std::string &use_address);
|
||||||
|
bool powerdown();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);
|
static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);
|
||||||
|
@ -82,6 +84,7 @@ class EthernetComponent : public Component {
|
||||||
uint32_t connect_begin_;
|
uint32_t connect_begin_;
|
||||||
esp_netif_t *eth_netif_{nullptr};
|
esp_netif_t *eth_netif_{nullptr};
|
||||||
esp_eth_handle_t eth_handle_;
|
esp_eth_handle_t eth_handle_;
|
||||||
|
esp_eth_phy_t *phy_{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
|
|
Loading…
Reference in a new issue