mirror of
https://github.com/esphome/esphome.git
synced 2026-10-07 11:26:39 +00:00
[ethernet] Store PHY registers in a StaticVector sized from the config (#20131)
This commit is contained in:
@@ -636,6 +636,19 @@ def phy_register(address: int, value: int, page: int) -> cg.StructInitializer:
|
||||
)
|
||||
|
||||
|
||||
def _add_phy_registers(var: cg.MockObj, config: ConfigType) -> None:
|
||||
if not (registers := config.get(CONF_PHY_REGISTERS)):
|
||||
return
|
||||
cg.add_define("ESPHOME_ETHERNET_PHY_REGISTER_COUNT", len(registers))
|
||||
for register_value in registers:
|
||||
reg = phy_register(
|
||||
register_value.get(CONF_ADDRESS),
|
||||
register_value.get(CONF_VALUE),
|
||||
register_value.get(CONF_PAGE_ID),
|
||||
)
|
||||
cg.add(var.add_phy_register(reg))
|
||||
|
||||
|
||||
@coroutine_with_priority(CoroPriority.COMMUNICATION)
|
||||
async def to_code(config: ConfigType) -> None:
|
||||
var = cg.new_Pvariable(config[CONF_ID])
|
||||
@@ -741,13 +754,7 @@ async def _to_code_esp32(var: cg.MockObj, config: ConfigType) -> None:
|
||||
cg.add(var.set_mdio_pin(config[CONF_MDIO_PIN]))
|
||||
if CONF_POWER_PIN in config:
|
||||
cg.add(var.set_power_pin(config[CONF_POWER_PIN]))
|
||||
for register_value in config.get(CONF_PHY_REGISTERS, []):
|
||||
reg = phy_register(
|
||||
register_value.get(CONF_ADDRESS),
|
||||
register_value.get(CONF_VALUE),
|
||||
register_value.get(CONF_PAGE_ID),
|
||||
)
|
||||
cg.add(var.add_phy_register(reg))
|
||||
_add_phy_registers(var, config)
|
||||
else:
|
||||
cg.add(var.set_phy_addr(config[CONF_PHY_ADDR]))
|
||||
cg.add(var.set_mdc_pin(config[CONF_MDC_PIN]))
|
||||
@@ -756,13 +763,7 @@ async def _to_code_esp32(var: cg.MockObj, config: ConfigType) -> None:
|
||||
cg.add(var.set_clk_pin(config[CONF_CLK][CONF_PIN]))
|
||||
if CONF_POWER_PIN in config:
|
||||
cg.add(var.set_power_pin(config[CONF_POWER_PIN]))
|
||||
for register_value in config.get(CONF_PHY_REGISTERS, []):
|
||||
reg = phy_register(
|
||||
register_value.get(CONF_ADDRESS),
|
||||
register_value.get(CONF_VALUE),
|
||||
register_value.get(CONF_PAGE_ID),
|
||||
)
|
||||
cg.add(var.add_phy_register(reg))
|
||||
_add_phy_registers(var, config)
|
||||
|
||||
# Register Ethernet with the esp32 sdkconfig reconciler. It disables the
|
||||
# WiFi stack and WiFi/BT coexistence only when Ethernet runs without WiFi,
|
||||
|
||||
@@ -193,7 +193,9 @@ class EthernetComponent final : public Component {
|
||||
void set_mdio_pin(uint8_t mdio_pin) { this->mdio_pin_ = mdio_pin; }
|
||||
void set_clk_pin(uint8_t clk_pin) { this->clk_pin_ = clk_pin; }
|
||||
void set_clk_mode(emac_rmii_clock_mode_t clk_mode) { this->clk_mode_ = clk_mode; }
|
||||
void add_phy_register(PHYRegister register_value);
|
||||
#ifdef ESPHOME_ETHERNET_PHY_REGISTER_COUNT
|
||||
void add_phy_register(PHYRegister register_value) { this->phy_registers_.push_back(register_value); }
|
||||
#endif
|
||||
#endif // USE_ETHERNET_SPI
|
||||
#endif // USE_ESP32
|
||||
|
||||
@@ -255,8 +257,10 @@ class EthernetComponent final : public Component {
|
||||
/// reset) and set the RGMII Tx/Rx clock delays needed for reliable data sampling.
|
||||
void yt8531_phy_init_();
|
||||
#endif
|
||||
#ifdef ESPHOME_ETHERNET_PHY_REGISTER_COUNT
|
||||
/// @brief Set arbitratry PHY registers from config.
|
||||
void write_phy_register_(esp_eth_mac_t *mac, PHYRegister register_data);
|
||||
#endif
|
||||
|
||||
#ifdef USE_ETHERNET_SPI
|
||||
uint8_t clk_pin_;
|
||||
@@ -280,7 +284,9 @@ class EthernetComponent final : public Component {
|
||||
// Group all 32-bit members first
|
||||
int power_pin_{-1};
|
||||
emac_rmii_clock_mode_t clk_mode_{EMAC_CLK_EXT_IN};
|
||||
std::vector<PHYRegister> phy_registers_{};
|
||||
#ifdef ESPHOME_ETHERNET_PHY_REGISTER_COUNT
|
||||
StaticVector<PHYRegister, ESPHOME_ETHERNET_PHY_REGISTER_COUNT> phy_registers_{};
|
||||
#endif
|
||||
|
||||
// Group all 8-bit members together
|
||||
uint8_t clk_pin_{0};
|
||||
|
||||
@@ -462,9 +462,11 @@ void EthernetComponent::ethernet_lazy_init_() {
|
||||
}
|
||||
#endif // USE_ETHERNET_KSZ8081
|
||||
|
||||
#ifdef ESPHOME_ETHERNET_PHY_REGISTER_COUNT
|
||||
for (const auto &phy_register : this->phy_registers_) {
|
||||
this->write_phy_register_(mac, phy_register);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(6, 0, 0)
|
||||
#ifdef USE_ETHERNET_GENERIC
|
||||
@@ -1043,10 +1045,6 @@ void EthernetComponent::dump_connect_params_() {
|
||||
#endif /* USE_NETWORK_IPV6 */
|
||||
}
|
||||
|
||||
#ifndef USE_ETHERNET_SPI
|
||||
void EthernetComponent::add_phy_register(PHYRegister register_value) { this->phy_registers_.push_back(register_value); }
|
||||
#endif
|
||||
|
||||
void EthernetComponent::get_eth_mac_address_raw(uint8_t *mac) {
|
||||
if (!this->ethernet_initialized_) {
|
||||
// External callers (mdns, ethernet_info, etc.) may ask for the MAC before/regardless
|
||||
@@ -1144,6 +1142,7 @@ void EthernetComponent::ksz8081_set_clock_reference_(esp_eth_mac_t *mac) {
|
||||
}
|
||||
#endif // USE_ETHERNET_KSZ8081
|
||||
|
||||
#ifdef ESPHOME_ETHERNET_PHY_REGISTER_COUNT
|
||||
void EthernetComponent::write_phy_register_(esp_eth_mac_t *mac, PHYRegister register_data) {
|
||||
esp_err_t err;
|
||||
|
||||
@@ -1168,6 +1167,7 @@ void EthernetComponent::write_phy_register_(esp_eth_mac_t *mac, PHYRegister regi
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif // ESPHOME_ETHERNET_PHY_REGISTER_COUNT
|
||||
|
||||
#ifdef USE_ETHERNET_YT8531
|
||||
void EthernetComponent::yt8531_phy_init_() {
|
||||
|
||||
@@ -491,6 +491,7 @@
|
||||
#define USE_ETHERNET_CONNECT_TRIGGER
|
||||
#define USE_ETHERNET_DISCONNECT_TRIGGER
|
||||
#define ESPHOME_ETHERNET_IP_STATE_LISTENERS 2
|
||||
#define ESPHOME_ETHERNET_PHY_REGISTER_COUNT 2
|
||||
#endif
|
||||
|
||||
#ifdef USE_ESP32
|
||||
|
||||
@@ -7,6 +7,12 @@ ethernet:
|
||||
mode: CLK_EXT_IN
|
||||
phy_addr: 0
|
||||
power_pin: 33
|
||||
phy_registers:
|
||||
- address: 0x10
|
||||
value: 0x1FFA
|
||||
page_id: 0x07
|
||||
- address: 0x19
|
||||
value: 0x0006
|
||||
manual_ip:
|
||||
static_ip: 192.168.178.56
|
||||
gateway: 192.168.178.1
|
||||
|
||||
Reference in New Issue
Block a user