Merge branch 'feat/p4_emac_sleep' into 'master'

feat(esp_eth): added EMAC sleep retention for ESP32P4

Closes IDF-9919

See merge request espressif/esp-idf!40385
This commit is contained in:
Ondrej Kosta
2025-08-14 02:52:29 +08:00
33 changed files with 8030 additions and 42 deletions

View File

@@ -361,6 +361,22 @@ static inline uint32_t emac_ll_read_debug_reg(emac_mac_dev_t *mac_regs)
return mac_regs->emacdebug.val;
}
/* pmt_csr */
static inline void emac_ll_power_down_enable(emac_mac_dev_t *mac_regs, bool enable)
{
mac_regs->pmt_csr.pwrdwn = enable;
}
static inline void emac_ll_magic_packet_enable(emac_mac_dev_t *mac_regs, bool enable)
{
mac_regs->pmt_csr.mgkpkten = enable;
}
static inline bool emac_ll_get_magic_packet_received(emac_mac_dev_t *mac_regs)
{
return mac_regs->pmt_csr.mgkprcvd;
}
/* emacmiidata */
static inline void emac_ll_set_phy_data(emac_mac_dev_t *mac_regs, uint32_t data)
{
@@ -379,6 +395,16 @@ static inline void emac_ll_set_addr(emac_mac_dev_t *mac_regs, const uint8_t *add
mac_regs->emacaddr0low = (addr[3] << 24) | (addr[2] << 16) | (addr[1] << 8) | (addr[0]);
}
static inline void emac_ll_get_addr(emac_mac_dev_t *mac_regs, uint8_t *addr)
{
addr[0] = mac_regs->emacaddr0low & 0xFF;
addr[1] = (mac_regs->emacaddr0low >> 8) & 0xFF;
addr[2] = (mac_regs->emacaddr0low >> 16) & 0xFF;
addr[3] = (mac_regs->emacaddr0low >> 24) & 0xFF;
addr[4] = mac_regs->emacaddr0high.address0_hi & 0xFF;
addr[5] = (mac_regs->emacaddr0high.address0_hi >> 8) & 0xFF;
}
/* emacaddrN */
static inline void emac_ll_add_addr_filter(emac_mac_dev_t *mac_regs, uint8_t addr_num, const uint8_t *mac_addr, uint8_t mask, bool filter_for_source)
{
@@ -396,12 +422,12 @@ static inline bool emac_ll_get_addr_filter(emac_mac_dev_t *mac_regs, uint8_t add
addr_num = addr_num - 1; // MAC Address1 is located at emacaddr[0]
if (mac_regs->emacaddr[addr_num].emacaddrhigh.address_enable) {
if (mac_addr != NULL) {
*(&mac_addr[0]) = mac_regs->emacaddr[addr_num].emacaddrlow & 0xFF;
*(&mac_addr[1]) = (mac_regs->emacaddr[addr_num].emacaddrlow >> 8) & 0xFF;
*(&mac_addr[2]) = (mac_regs->emacaddr[addr_num].emacaddrlow >> 16) & 0xFF;
*(&mac_addr[3]) = (mac_regs->emacaddr[addr_num].emacaddrlow >> 24) & 0xFF;
*(&mac_addr[4]) = mac_regs->emacaddr[addr_num].emacaddrhigh.mac_address_hi & 0xFF;
*(&mac_addr[5]) = (mac_regs->emacaddr[addr_num].emacaddrhigh.mac_address_hi >> 8) & 0xFF;
mac_addr[0] = mac_regs->emacaddr[addr_num].emacaddrlow & 0xFF;
mac_addr[1] = (mac_regs->emacaddr[addr_num].emacaddrlow >> 8) & 0xFF;
mac_addr[2] = (mac_regs->emacaddr[addr_num].emacaddrlow >> 16) & 0xFF;
mac_addr[3] = (mac_regs->emacaddr[addr_num].emacaddrlow >> 24) & 0xFF;
mac_addr[4] = mac_regs->emacaddr[addr_num].emacaddrhigh.mac_address_hi & 0xFF;
mac_addr[5] = (mac_regs->emacaddr[addr_num].emacaddrhigh.mac_address_hi >> 8) & 0xFF;
}
if (mask != NULL) {
*mask = mac_regs->emacaddr[addr_num].emacaddrhigh.mask_byte_control;