123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /*
- * Copyright (c) 2023 hpmicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
- #ifndef ETH_PHY_PORT_H
- #define ETH_PHY_PORT_H
- #include "hpm_ioc_regs.h"
- #include <rtdevice.h>
- #ifndef PHY_AUTO_NEGO
- #define PHY_AUTO_NEGO (1U)
- #endif
- #ifndef PHY_MDIO_CSR_CLK_FREQ
- #define PHY_MDIO_CSR_CLK_FREQ (200000000U)
- #endif
- enum phy_link_status
- {
- PHY_LINK_DOWN = 0U,
- PHY_LINK_UP
- };
- typedef struct {
- rt_uint32_t phy_speed;
- rt_uint32_t phy_duplex;
- } phy_info_t;
- typedef struct {
- rt_uint32_t phy_link;
- rt_phy_t phy;
- phy_info_t phy_info;
- } phy_device_t;
- #ifdef BSP_USING_ETH0
- #define RGMII (1U)
- /* RTL8211 name and ID */
- #define PHY_NAME ("RTL8211")
- #define PHY_ID1 (0x001CU)
- #define PHY_ID2 (0x32U)
- /* PHY_RTL8211 basic control register */
- #define PHY_BASIC_CONTROL_REG (0x00U)
- #define PHY_RESET_MASK (1U << 15)
- #define PHY_AUTO_NEGOTIATION_MASK (1U << 12)
- /* PHY_RTL8211 basic status register */
- #define PHY_BASIC_STATUS_REG (0x01U)
- #define PHY_LINKED_STATUS_MASK (1U << 2)
- #define PHY_AUTONEGO_COMPLETE_MASK (1U << 5)
- /* PHY_RTL8211 ID one register */
- #define PHY_ID1_REG (0x02U)
- /* PHY_RTL8211 ID two register */
- #define PHY_ID2_REG (0x03U)
- /* PHY_RTL8211 auto-negotiate advertise register */
- #define PHY_AUTONEG_ADVERTISE_REG (0x04U)
- /* PHY_RTL8211 status register */
- #define PHY_STATUS_REG (0x11U)
- #define PHY_100M_MASK (1UL << 14)
- #define PHY_1000M_MASK (1UL << 15)
- #define PHY_FULL_DUPLEX_MASK (1UL << 13)
- #define PHY_STATUS_SPEED_100M(SR) ((SR) & PHY_100M_MASK)
- #define PHY_STATUS_SPEED_1000M(SR) ((SR) & PHY_1000M_MASK)
- #define PHY_STATUS_FULL_DUPLEX(SR) ((SR) & PHY_FULL_DUPLEX_MASK)
- #define PHY_SPEED_SEL_SHIFT (14U)
- /* PHY_RTL8211 interrupt control register */
- #define PHY_INTERTUPT_CTRL_REG (0x12U)
- /* PHY_RTL8211 interrupt status register */
- #define PHY_INTERRUPT_STATUS_REG (0x13U)
- /* PHY register index */
- typedef enum {
- PHY_BASIC_CONTROL_REG_IDX = 0,
- PHY_BASIC_STATUS_REG_IDX,
- PHY_ID1_REG_IDX,
- PHY_ID2_REG_IDX,
- PHY_AUTONEG_ADVERTISE_REG_IDX,
- PHY_STATUS_REG_IDX,
- PHY_INTERRUPT_FLAG_REG_IDX,
- PHY_INTERRUPT_MASK_REG_IDX
- } phy_reg_idx_t;
- /* ETH0 PHY register list */
- #define PHY0_REG_LIST PHY_BASIC_CONTROL_REG,\
- PHY_BASIC_STATUS_REG,\
- PHY_ID1_REG,\
- PHY_ID2_REG,\
- PHY_AUTONEG_ADVERTISE_REG,\
- PHY_STATUS_REG,\
- PHY_INTERTUPT_CTRL_REG,\
- PHY_INTERRUPT_STATUS_REG
- #else
- #include "hpm_rtl8201.h"
- #define RMII (1U)
- /* RTL8201 name and ID */
- #define PHY_NAME ("RTL8201")
- #define PHY_ID1 (0x001CU)
- #define PHY_ID2 (0x32U)
- /* RTL8201 basic control register */
- #define PHY_BASIC_CONTROL_REG (0x00U)
- #define PHY_RESET_MASK (1U << 15)
- #define PHY_AUTO_NEGOTIATION_MASK (1U << 12)
- /* RTL8201 basic status register */
- #define PHY_BASIC_STATUS_REG (0x01U)
- #define PHY_LINKED_STATUS_MASK (1U << 2)
- #define PHY_AUTONEGO_COMPLETE_MASK (1U << 5)
- /* RTL8201 ID one register */
- #define PHY_ID1_REG (0x02U)
- /* RTL8201 ID two register */
- #define PHY_ID2_REG (0x03U)
- /* RTL8201 auto-negotiate advertise register */
- #define PHY_AUTONEG_ADVERTISE_REG (0x04U)
- /* RTL8201 status register */
- #define PHY_STATUS_REG (0x00U)
- #define PHY_100M_MASK (1UL << 13)
- #define PHY_FULL_DUPLEX_MASK (1UL << 8)
- #define PHY_STATUS_SPEED_100M(SR) ((SR) & PHY_100M_MASK)
- #define PHY_STATUS_FULL_DUPLEX(SR) ((SR) & PHY_FULL_DUPLEX_MASK)
- /* RTL8201 mode setting register */
- #define PHY_RMSR_P7 (0x10)
- #define PHY_RMSR_P7_RG_RMII_CLKDIR_MASK (0x1000U)
- /* RTL8201 page select register */
- #define PHY_PAGESEL (0x1f)
- /* PHY register index */
- typedef enum {
- PHY_BASIC_CONTROL_REG_IDX = 0,
- PHY_BASIC_STATUS_REG_IDX,
- PHY_ID1_REG_IDX,
- PHY_ID2_REG_IDX,
- PHY_AUTONEG_ADVERTISE_REG_IDX,
- PHY_STATUS_REG_IDX,
- PHY_RMSR_P7_IDX,
- PHY_PAGE_SEL_IDX
- } phy_reg_idx_t;
- /* ETH0 PHY register list */
- #define PHY1_REG_LIST PHY_BASIC_CONTROL_REG,\
- PHY_BASIC_STATUS_REG,\
- PHY_ID1_REG,\
- PHY_ID2_REG,\
- PHY_AUTONEG_ADVERTISE_REG,\
- PHY_STATUS_REG,\
- PHY_RMSR_P7_IDX,\
- PHY_PAGE_SEL_IDX
- #endif
- #endif
|