/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : hal_stm32f4_eth.h
  * @brief          : STM32F4 specific Ethernet interface header file
  ******************************************************************************
  */
/* USER CODE END Header */

#ifndef HAL_STM32F4_ETH_H
#define HAL_STM32F4_ETH_H

#include "../../hal_eth.h"
#include "stm32f4xx_hal.h"

/**
 * @brief STM32F4 Ethernet handle structure
 */
typedef struct {
    ETH_HandleTypeDef heth;            /*!< Ethernet handle */
    uint8_t initialized;               /*!< Initialization flag */
    hal_eth_phy_addr_t phy_addr;       /*!< PHY address */
    uint32_t rx_packets;               /*!< Received packets count */
    uint32_t tx_packets;               /*!< Transmitted packets count */
    uint32_t rx_errors;                /*!< Receive errors count */
    uint32_t tx_errors;                /*!< Transmit errors count */
} hal_stm32f4_eth_handle_t;

/**
 * @brief Initialize STM32F4 Ethernet module
 * @param config: Pointer to Ethernet configuration structure
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_init(const hal_eth_config_t* config);

/**
 * @brief Deinitialize STM32F4 Ethernet module
 * @param instance: Ethernet instance
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_deinit(hal_eth_instance_t instance);

/**
 * @brief Get STM32F4 Ethernet status
 * @param instance: Ethernet instance
 * @param status: Pointer to Ethernet status structure
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_get_status(hal_eth_instance_t instance, hal_eth_status_t* status);

/**
 * @brief Set STM32F4 Ethernet MAC address
 * @param instance: Ethernet instance
 * @param mac_addr: Pointer to MAC address structure
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_set_mac_addr(hal_eth_instance_t instance, const hal_eth_mac_addr_t* mac_addr);

/**
 * @brief Get STM32F4 Ethernet MAC address
 * @param instance: Ethernet instance
 * @param mac_addr: Pointer to MAC address structure
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_get_mac_addr(hal_eth_instance_t instance, hal_eth_mac_addr_t* mac_addr);

/**
 * @brief Check STM32F4 Ethernet link status
 * @param instance: Ethernet instance
 * @param link_up: Pointer to store link up status
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_check_link(hal_eth_instance_t instance, uint8_t* link_up);

/**
 * @brief Reset STM32F4 Ethernet PHY
 * @param instance: Ethernet instance
 * @param phy_addr: PHY address
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_reset_phy(hal_eth_instance_t instance, hal_eth_phy_addr_t phy_addr);

/**
 * @brief Read STM32F4 Ethernet PHY register
 * @param instance: Ethernet instance
 * @param phy_addr: PHY address
 * @param reg_addr: Register address
 * @param value: Pointer to store register value
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_read_phy_reg(hal_eth_instance_t instance, hal_eth_phy_addr_t phy_addr, uint16_t reg_addr, uint16_t* value);

/**
 * @brief Write STM32F4 Ethernet PHY register
 * @param instance: Ethernet instance
 * @param phy_addr: PHY address
 * @param reg_addr: Register address
 * @param value: Register value
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_write_phy_reg(hal_eth_instance_t instance, hal_eth_phy_addr_t phy_addr, uint16_t reg_addr, uint16_t value);

/**
 * @brief Configure STM32F4 Ethernet GPIO
 * @retval HAL status code
 */
hal_ret_t hal_stm32f4_eth_gpio_config(void);

/**
 * @brief Get STM32F4 Ethernet handle
 * @param instance: Ethernet instance
 * @retval Pointer to Ethernet handle structure
 */
hal_stm32f4_eth_handle_t* hal_stm32f4_eth_get_handle(hal_eth_instance_t instance);

#endif /* HAL_STM32F4_ETH_H */
