/* * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 *//* ... */#pragmaonce#include<stdint.h>#include<stdbool.h>#include"esp_assert.h"#include"esp_err.h"#include"hal/eth_types.h"#include"soc/soc_caps.h"6 includes#ifdef__cplusplusextern"C"{#endif#ifSOC_EMAC_SUPPORTED#include"hal/emac_ll.h"/** * @brief Macros to check descriptors datatype size*//* ... */#defineSTR(s)#s#defineTYPE_SIZE_ERR_MSG(DATATYPE,SIZE)#DATATYPE" should occupy "STR(SIZE)" bytes in memory"#defineASSERT_TYPE_SIZE(DATATYPE,SIZE)ESP_STATIC_ASSERT(sizeof(DATATYPE)==SIZE,TYPE_SIZE_ERR_MSG(DATATYPE,SIZE))#ifCONFIG_IDF_TARGET_ESP32P4// Descriptor must be 64B aligned for ESP32P4 due to cache arrangement#defineEMAC_HAL_DMA_DESC_SIZE(64)/* ... */#else#defineEMAC_HAL_DMA_DESC_SIZE(32)#endif/* DMA descriptor control bits */#defineEMAC_HAL_TDES0_INTR_ON_COMPLET(1<<30)#defineEMAC_HAL_TDES0_CRC_APPEND_DISABLE(1<<27)#defineEMAC_HAL_TDES0_PAD_DISABLE(1<<26)#defineEMAC_HAL_TDES0_TX_TS_ENABLE(1<<25)#defineEMAC_HAL_TDES0_CRC_REPLACE_CTRL(1<<24)#defineEMAC_HAL_TDES0_IP_CRC_INSERT_HDR(1<<22)#defineEMAC_HAL_TDES0_IP_CRC_INSERT_HDR_PAYLOAD(2<<22)#defineEMAC_HAL_TDES0_IP_CRC_INSERT_HDR_PAYLOAD_PSEUDO(3<<22)#defineEMAC_HAL_TDES0_VLAN_REMOVE(1<<18)#defineEMAC_HAL_TDES0_VLAN_INSERT(2<<18)#defineEMAC_HAL_TDES0_VLAN_REPLACE(3<<18)#defineEMAC_HAL_TDES0_IP_CRC_INSERT_DISABLE_MASK(3<<22)#defineEMAC_HAL_TDES0_VLAN_INSERT_DISABLE_MASK(3<<18)13 defines/*** @brief Ethernet DMA TX Descriptor**//* ... */typedefstruct{volatileunion{struct{uint32_tDeferred:1;/*!< MAC defers before transmission */uint32_tUnderflowErr:1;/*!< DMA encountered an empty transmit buffer */uint32_tExcessiveDeferral:1;/*!< Excessive deferral of over 24,288 bit times */uint32_tCollisionCount:4;/*!< Number of collisions occurred before transmitted */uint32_tVLanFrame:1;/*!< Transmitted frame is a VLAN-type frame */uint32_tExcessiveCollision:1;/*!< Transmission aborted after 16 successive collisions */uint32_tLateCollision:1;/*!< Collision occurred after the collision window */uint32_tNoCarrier:1;/*!< Carrier Sense signal from the PHY was not asserted */uint32_tLossCarrier:1;/*!< Loss of carrier occurred during transmission */uint32_tPayloadChecksumErr:1;/*!< Checksum error in TCP/UDP/ICMP datagram payload */uint32_tFrameFlushed:1;/*!< DMA or MTL flushed the frame */uint32_tJabberTimeout:1;/*!< MAC transmitter has experienced a jabber timeout */uint32_tErrSummary:1;/*!< Error Summary */uint32_tIPHeadErr:1;/*!< IP Header Error */uint32_tTxTimestampStatus:1;/*!< Timestamp captured for the transmit frame */uint32_tVLANInsertControl:2;/*!< VLAN tagging or untagging before transmitting */uint32_tSecondAddressChained:1;/*!< Second address in the descriptor is Next Descriptor address */uint32_tTransmitEndRing:1;/*!< Descriptor list reached its final descriptor */uint32_tChecksumInsertControl:2;/*!< Control checksum calculation and insertion */uint32_tCRCReplacementControl:1;/*!< Control CRC replace */uint32_tTransmitTimestampEnable:1;/*!< Enable IEEE1588 hardware timestamping */uint32_tDisablePad:1;/*!< Control add padding when frame short than 64 bytes */uint32_tDisableCRC:1;/*!< Control append CRC to the end of frame */uint32_tFirstSegment:1;/*!< Buffer contains the first segment of a frame */uint32_tLastSegment:1;/*!< Buffer contains the last segment of a frame */uint32_tInterruptOnComplete:1;/*!< Interrupt after frame transmitted */uint32_tOwn:1;/*!< Owner of this descriptor: DMA controller or host */}{ ... };uint32_tValue;}{ ... }TDES0;union{struct{uint32_tTransmitBuffer1Size:13;/*!< First data buffer byte size */uint32_tReserved:3;/*!< Reserved */uint32_tTransmitBuffer2Size:13;/*!< Second data buffer byte size */uint32_tSAInsertControl:3;/*!< Control MAC add or replace Source Address field */}{ ... };uint32_tValue;}{ ... }TDES1;uint32_tBuffer1Addr;/*!< Buffer1 address pointer */uint32_tBuffer2NextDescAddr;/*!< Buffer2 or next descriptor address pointer */uint32_tReserved1;/*!< Reserved */uint32_tReserved2;/*!< Reserved */uint32_tTimeStampLow;/*!< Transmit Frame Timestamp Low */uint32_tTimeStampHigh;/*!< Transmit Frame Timestamp High */#ifSOC_CACHE_INTERNAL_MEM_VIA_L1CACHE// descriptor must be aligned (due to cache arrangement)uint8_tCacheAlign[EMAC_HAL_DMA_DESC_SIZE-32];// 32 is size of EMAC DMA descriptor without alignment/* ... */#endif}{ ... }eth_dma_tx_descriptor_t;ASSERT_TYPE_SIZE(eth_dma_tx_descriptor_t,EMAC_HAL_DMA_DESC_SIZE);/*** @brief Ethernet DMA RX Descriptor**//* ... */typedefstruct{volatileunion{struct{uint32_tExtendStatusAvailable:1;/*!< Extended statsu is available in RDES4 */uint32_tCRCErr:1;/*!< CRC error occurred on frame */uint32_tDribbleBitErr:1;/*!< frame contains non int multiple of 8 bits */uint32_tReceiveErr:1;/*!< Receive error */uint32_tReceiveWatchdogTimeout:1;/*!< Receive Watchdog timeout */uint32_tFrameType:1;/*!< Ethernet type or IEEE802.3 */uint32_tLateCollision:1;/*!< Late collision occurred during reception */uint32_tTSAvailIPChecksumErrGiantFrame:1;/*!< Timestamp available or IP Checksum error or Giant frame */uint32_tLastDescriptor:1;/*!< Last buffer of the frame */uint32_tFirstDescriptor:1;/*!< First buffer of the frame */uint32_tVLANTag:1;/*!< VLAN Tag: received frame is a VLAN frame */uint32_tOverflowErr:1;/*!< Frame was damaged due to buffer overflow */uint32_tLengthErr:1;/*!< Frame size not matching with length field */uint32_tSourceAddrFilterFail:1;/*!< SA field of frame failed the SA filter */uint32_tDescriptorErr:1;/*!< Frame truncated and DMA doesn't own next descriptor */uint32_tErrSummary:1;/*!< Error Summary, OR of all errors in RDES */uint32_tFrameLength:14;/*!< Byte length of received frame */uint32_tDestinationAddrFilterFail:1;/*!< Frame failed in the DA Filter in the MAC */uint32_tOwn:1;/*!< Owner of this descriptor: DMA controller or host */}{ ... };uint32_tValue;}{ ... }RDES0;union{struct{uint32_tReceiveBuffer1Size:13;/*!< First data buffer size in bytes */uint32_tReserved1:1;/*!< Reserved */uint32_tSecondAddressChained:1;/*!< Seconde address is the Next Descriptor address */uint32_tReceiveEndOfRing:1;/*!< Descriptor reached its final descriptor */uint32_tReceiveBuffer2Size:13;/*!< Second data buffer size in bytes */uint32_tReserved:2;/*!< Reserved */uint32_tDisableInterruptOnComplete:1;/*!< Disable the assertion of interrupt to host */}{ ... };uint32_tValue;}{ ... }RDES1;uint32_tBuffer1Addr;/*!< Buffer1 address pointer */uint32_tBuffer2NextDescAddr;/*!< Buffer2 or next descriptor address pointer */volatileunion{struct{uint32_tIPPayloadType:3;/*!< Type of payload in the IP datagram */uint32_tIPHeadErr:1;/*!< IP header error */uint32_tIPPayloadErr:1;/*!< IP payload error */uint32_tIPChecksumBypass:1;/*!< Checksum offload engine is bypassed */uint32_tIPv4PacketReceived:1;/*!< Received packet is an IPv4 packet */uint32_tIPv6PacketReceived:1;/*!< Received packet is an IPv6 packet */uint32_tMessageType:4;/*!< PTP Message Type */uint32_tPTPFrameType:1;/*!< PTP message is over Ethernet or IPv4/IPv6 */uint32_tPTPVersion:1;/*!< Version of PTP protocol */uint32_tTimestampDropped:1;/*!< Timestamp dropped because of overflow */uint32_tReserved1:1;/*!< Reserved */uint32_tAVPacketReceived:1;/*!< AV packet is received */uint32_tAVTaggedPacketReceived:1;/*!< AV tagged packet is received */uint32_tVLANTagPrioVal:3;/*!< VLAN tag's user value in the received packekt */uint32_tReserved2:3;/*!< Reserved */uint32_tLayer3FilterMatch:1;/*!< Received frame matches one of the enabled Layer3 IP */uint32_tLayer4FilterMatch:1;/*!< Received frame matches one of the enabled Layer4 IP */uint32_tLayer3Layer4FilterNumberMatch:2;/*!< Number of Layer3 and Layer4 Filter that matches the received frame */uint32_tReserved3:4;/*!< Reserved */}{ ... };uint32_tValue;}{ ... }ExtendedStatus;uint32_tReserved;/*!< Reserved */uint32_tTimeStampLow;/*!< Receive frame timestamp low */uint32_tTimeStampHigh;/*!< Receive frame timestamp high */#ifSOC_CACHE_INTERNAL_MEM_VIA_L1CACHE// descriptor must be aligned (due to cache arrangement)uint8_tCacheAlign[EMAC_HAL_DMA_DESC_SIZE-32];// 32 is size of EMAC DMA descriptor without alignment/* ... */#endif}{ ... }eth_dma_rx_descriptor_t;ASSERT_TYPE_SIZE(eth_dma_rx_descriptor_t,EMAC_HAL_DMA_DESC_SIZE);typedefstructemac_mac_dev_s*emac_mac_soc_regs_t;typedefstructemac_dma_dev_s*emac_dma_soc_regs_t;#ifCONFIG_IDF_TARGET_ESP32typedefstructemac_ext_dev_s*emac_ext_soc_regs_t;#elsetypedefvoid*emac_ext_soc_regs_t;#endiftypedefstruct{emac_mac_soc_regs_tmac_regs;emac_dma_soc_regs_tdma_regs;emac_ext_soc_regs_text_regs;}{ ... }emac_hal_context_t;/** * @brief EMAC related configuration *//* ... */typedefstruct{eth_mac_dma_burst_len_tdma_burst_len;/*!< eth-type enum of chosen dma burst-len */}{ ... }emac_hal_dma_config_t;voidemac_hal_init(emac_hal_context_t*hal);#defineemac_hal_get_phy_intf(hal)emac_ll_get_phy_intf((hal)->ext_regs)#defineemac_hal_clock_enable_mii(hal)emac_ll_clock_enable_mii((hal)->ext_regs)#defineemac_hal_clock_enable_rmii_input(hal)emac_ll_clock_enable_rmii_input((hal)->ext_regs)#ifdefCONFIG_IDF_TARGET_ESP32P4#defineemac_hal_clock_rmii_rx_tx_div(hal,div)emac_ll_clock_rmii_rx_tx_div((hal)->ext_regs,div)#endif// CONFIG_IDF_TARGET_ESP32P4#defineemac_hal_clock_enable_rmii_output(hal)emac_ll_clock_enable_rmii_output((hal)->ext_regs)#defineemac_hal_reset(hal)emac_ll_reset((hal)->dma_regs)#defineemac_hal_is_reset_done(hal)emac_ll_is_reset_done((hal)->dma_regs)voidemac_hal_set_csr_clock_range(emac_hal_context_t*hal,intfreq);voidemac_hal_init_mac_default(emac_hal_context_t*hal);voidemac_hal_init_dma_default(emac_hal_context_t*hal,emac_hal_dma_config_t*hal_config);#defineemac_hal_set_speed(hal,speed)emac_ll_set_port_speed((hal)->mac_regs,speed)#defineemac_hal_set_duplex(hal,duplex)emac_ll_set_duplex((hal)->mac_regs,duplex)#defineemac_hal_set_promiscuous(hal,enable)emac_ll_promiscuous_mode_enable((hal)->mac_regs,enable)/** * @brief Send MAC-CTRL frames to peer (EtherType=0x8808, opcode=0x0001, dest_addr=MAC-specific-ctrl-proto-01 (01:80:c2:00:00:01)) *//* ... */#defineemac_hal_send_pause_frame(hal,enable)emac_ll_pause_frame_enable((hal)->ext_regs,enable)#defineemac_hal_is_mii_busy(hal)emac_ll_is_mii_busy((hal)->mac_regs)5 definesvoidemac_hal_set_phy_cmd(emac_hal_context_t*hal,uint32_tphy_addr,uint32_tphy_reg,boolwrite);#defineemac_hal_set_phy_data(hal,reg_value)emac_ll_set_phy_data((hal)->mac_regs,reg_value)#defineemac_hal_get_phy_data(hal)emac_ll_get_phy_data((hal)->mac_regs)voidemac_hal_set_address(emac_hal_context_t*hal,uint8_t*mac_addr);/** * @brief Starts EMAC Transmission & Reception * * @param hal EMAC HAL context infostructure *//* ... */voidemac_hal_start(emac_hal_context_t*hal);/** * @brief Stops EMAC Transmission & Reception * * @param hal EMAC HAL context infostructure * @return * - ESP_OK: succeed * - ESP_ERR_INVALID_STATE: previous frame transmission/reception is not completed. When this error occurs, * wait and repeat the EMAC stop again. *//* ... */esp_err_temac_hal_stop(emac_hal_context_t*hal);voidemac_hal_enable_flow_ctrl(emac_hal_context_t*hal,boolenable);#defineemac_hal_get_intr_enable_status(hal)emac_ll_get_intr_enable_status((hal)->dma_regs)#defineemac_hal_get_intr_status(hal)emac_ll_get_intr_status((hal)->dma_regs)#defineemac_hal_clear_corresponding_intr(hal,bits)emac_ll_clear_corresponding_intr((hal)->dma_regs,bits)#defineemac_hal_clear_all_intr(hal)emac_ll_clear_all_pending_intr((hal)->dma_regs)voidemac_hal_set_rx_tx_desc_addr(emac_hal_context_t*hal,eth_dma_rx_descriptor_t*rx_desc,eth_dma_tx_descriptor_t*tx_desc);#defineemac_hal_receive_poll_demand(hal)emac_ll_receive_poll_demand((hal)->dma_regs,0)#defineemac_hal_transmit_poll_demand(hal)emac_ll_transmit_poll_demand((hal)->dma_regs,0)/* ... */#endif// SOC_EMAC_SUPPORTED#ifdef__cplusplus}{...}#endif
Details
Show: from
Types: Columns:
All items filtered out
All items filtered out
This file uses the notable symbols shown below. Click anywhere in the file to view more details.