eth_phy_port.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /*
  2. * Copyright (c) 2023 hpmicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef ETH_PHY_PORT_H
  8. #define ETH_PHY_PORT_H
  9. #include "hpm_ioc_regs.h"
  10. #include <rtdevice.h>
  11. #ifndef PHY_AUTO_NEGO
  12. #define PHY_AUTO_NEGO (1U)
  13. #endif
  14. #ifndef PHY_MDIO_CSR_CLK_FREQ
  15. #define PHY_MDIO_CSR_CLK_FREQ (200000000U)
  16. #endif
  17. enum phy_link_status
  18. {
  19. PHY_LINK_DOWN = 0U,
  20. PHY_LINK_UP
  21. };
  22. typedef struct {
  23. rt_uint32_t phy_speed;
  24. rt_uint32_t phy_duplex;
  25. } phy_info_t;
  26. typedef struct {
  27. rt_uint32_t phy_link;
  28. rt_phy_t phy;
  29. phy_info_t phy_info;
  30. } phy_device_t;
  31. #ifdef BSP_USING_ETH0
  32. #define RGMII (1U)
  33. /* RTL8211 name and ID */
  34. #define PHY_NAME ("RTL8211")
  35. #define PHY_ID1 (0x001CU)
  36. #define PHY_ID2 (0x32U)
  37. /* PHY_RTL8211 basic control register */
  38. #define PHY_BASIC_CONTROL_REG (0x00U)
  39. #define PHY_RESET_MASK (1U << 15)
  40. #define PHY_AUTO_NEGOTIATION_MASK (1U << 12)
  41. /* PHY_RTL8211 basic status register */
  42. #define PHY_BASIC_STATUS_REG (0x01U)
  43. #define PHY_LINKED_STATUS_MASK (1U << 2)
  44. #define PHY_AUTONEGO_COMPLETE_MASK (1U << 5)
  45. /* PHY_RTL8211 ID one register */
  46. #define PHY_ID1_REG (0x02U)
  47. /* PHY_RTL8211 ID two register */
  48. #define PHY_ID2_REG (0x03U)
  49. /* PHY_RTL8211 auto-negotiate advertise register */
  50. #define PHY_AUTONEG_ADVERTISE_REG (0x04U)
  51. /* PHY_RTL8211 status register */
  52. #define PHY_STATUS_REG (0x11U)
  53. #define PHY_100M_MASK (1UL << 14)
  54. #define PHY_1000M_MASK (1UL << 15)
  55. #define PHY_FULL_DUPLEX_MASK (1UL << 13)
  56. #define PHY_STATUS_SPEED_100M(SR) ((SR) & PHY_100M_MASK)
  57. #define PHY_STATUS_SPEED_1000M(SR) ((SR) & PHY_1000M_MASK)
  58. #define PHY_STATUS_FULL_DUPLEX(SR) ((SR) & PHY_FULL_DUPLEX_MASK)
  59. #define PHY_SPEED_SEL_SHIFT (14U)
  60. /* PHY_RTL8211 interrupt control register */
  61. #define PHY_INTERTUPT_CTRL_REG (0x12U)
  62. /* PHY_RTL8211 interrupt status register */
  63. #define PHY_INTERRUPT_STATUS_REG (0x13U)
  64. /* PHY register index */
  65. typedef enum {
  66. PHY_BASIC_CONTROL_REG_IDX = 0,
  67. PHY_BASIC_STATUS_REG_IDX,
  68. PHY_ID1_REG_IDX,
  69. PHY_ID2_REG_IDX,
  70. PHY_AUTONEG_ADVERTISE_REG_IDX,
  71. PHY_STATUS_REG_IDX,
  72. PHY_INTERRUPT_FLAG_REG_IDX,
  73. PHY_INTERRUPT_MASK_REG_IDX
  74. } phy_reg_idx_t;
  75. /* ETH0 PHY register list */
  76. #define PHY0_REG_LIST PHY_BASIC_CONTROL_REG,\
  77. PHY_BASIC_STATUS_REG,\
  78. PHY_ID1_REG,\
  79. PHY_ID2_REG,\
  80. PHY_AUTONEG_ADVERTISE_REG,\
  81. PHY_STATUS_REG,\
  82. PHY_INTERTUPT_CTRL_REG,\
  83. PHY_INTERRUPT_STATUS_REG
  84. #else
  85. #include "hpm_rtl8201.h"
  86. #define RMII (1U)
  87. /* RTL8201 name and ID */
  88. #define PHY_NAME ("RTL8201")
  89. #define PHY_ID1 (0x001CU)
  90. #define PHY_ID2 (0x32U)
  91. /* RTL8201 basic control register */
  92. #define PHY_BASIC_CONTROL_REG (0x00U)
  93. #define PHY_RESET_MASK (1U << 15)
  94. #define PHY_AUTO_NEGOTIATION_MASK (1U << 12)
  95. /* RTL8201 basic status register */
  96. #define PHY_BASIC_STATUS_REG (0x01U)
  97. #define PHY_LINKED_STATUS_MASK (1U << 2)
  98. #define PHY_AUTONEGO_COMPLETE_MASK (1U << 5)
  99. /* RTL8201 ID one register */
  100. #define PHY_ID1_REG (0x02U)
  101. /* RTL8201 ID two register */
  102. #define PHY_ID2_REG (0x03U)
  103. /* RTL8201 auto-negotiate advertise register */
  104. #define PHY_AUTONEG_ADVERTISE_REG (0x04U)
  105. /* RTL8201 status register */
  106. #define PHY_STATUS_REG (0x00U)
  107. #define PHY_100M_MASK (1UL << 13)
  108. #define PHY_FULL_DUPLEX_MASK (1UL << 8)
  109. #define PHY_STATUS_SPEED_100M(SR) ((SR) & PHY_100M_MASK)
  110. #define PHY_STATUS_FULL_DUPLEX(SR) ((SR) & PHY_FULL_DUPLEX_MASK)
  111. /* RTL8201 mode setting register */
  112. #define PHY_RMSR_P7 (0x10)
  113. #define PHY_RMSR_P7_RG_RMII_CLKDIR_MASK (0x1000U)
  114. /* RTL8201 page select register */
  115. #define PHY_PAGESEL (0x1f)
  116. /* PHY register index */
  117. typedef enum {
  118. PHY_BASIC_CONTROL_REG_IDX = 0,
  119. PHY_BASIC_STATUS_REG_IDX,
  120. PHY_ID1_REG_IDX,
  121. PHY_ID2_REG_IDX,
  122. PHY_AUTONEG_ADVERTISE_REG_IDX,
  123. PHY_STATUS_REG_IDX,
  124. PHY_RMSR_P7_IDX,
  125. PHY_PAGE_SEL_IDX
  126. } phy_reg_idx_t;
  127. /* ETH0 PHY register list */
  128. #define PHY1_REG_LIST PHY_BASIC_CONTROL_REG,\
  129. PHY_BASIC_STATUS_REG,\
  130. PHY_ID1_REG,\
  131. PHY_ID2_REG,\
  132. PHY_AUTONEG_ADVERTISE_REG,\
  133. PHY_STATUS_REG,\
  134. PHY_RMSR_P7_IDX,\
  135. PHY_PAGE_SEL_IDX
  136. #endif
  137. #endif