// EMAC IEEE 1588 clock and hardware timestamps for PTP over UDP/IPv4. #pragma once #include #include #include "esp_eth_driver.h" #include "esp_eth_mac.h" #include "esp_netif.h" #define PTP_MSG_SYNC 0x0 #define PTP_MSG_DELAY_REQ 0x1 #define PTP_MSG_FOLLOW_UP 0x8 #define PTP_MSG_DELAY_RESP 0x9 #define PTP_MSG_ANNOUNCE 0xB // Start the EMAC PTP clock, enable IPv4/UDP timestamping and hook the RX path. esp_err_t ptp_hw_init(esp_eth_handle_t eth, esp_netif_t *netif); // Hardware RX timestamp of an event message (UDP port 319), looked up by type, // sequence ID and sourcePortIdentity (10 bytes). Each record is returned once. bool ptp_hw_rx_ts(uint8_t msg_type, uint16_t seq, const uint8_t *src_port_id, eth_mac_time_t *ts); esp_err_t ptp_hw_get_time(eth_mac_time_t *t); // Send a PTP event message as a raw Ethernet/IPv4/UDP frame (port 319 -> 319) and return its // hardware TX timestamp. dst_ip/dst_mac: 224.0.1.129 / 01:00:5e:00:01:81 or the GM unicast. esp_err_t ptp_hw_send_event(const uint8_t dst_mac[6], uint32_t dst_ip, uint8_t dscp, const uint8_t *msg, size_t len, eth_mac_time_t *tx_ts);