phyHandling - 副本.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Handling of Ethernet PHY's
  3. * PHY's communicate with an EMAC either through
  4. * a Media-Independent Interface (MII), or a Reduced Media-Independent Interface (RMII).
  5. * The EMAC can poll for PHY ports on 32 different addresses. Each of the PHY ports
  6. * shall be treated independently.
  7. *
  8. */
  9. #ifndef PHYHANDLING_H
  10. #define PHYHANDLING_H
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. #ifndef ipconfigPHY_MAX_PORTS
  15. /* There can be at most 32 PHY ports, but in most cases there are 4 or less. */
  16. #define ipconfigPHY_MAX_PORTS 4
  17. #endif
  18. /* A generic user-provided function that reads from the PHY-port at 'xAddress'( 0-based ). A 16-bit value shall be stored in
  19. * '*pulValue'. xRegister is the register number ( 0 .. 31 ). In fact all PHY registers are 16-bit.
  20. * Return non-zero in case the action failed. */
  21. typedef BaseType_t ( * xApplicationPhyReadHook_t )( BaseType_t xAddress,
  22. BaseType_t xRegister,
  23. uint32_t * pulValue );
  24. /* A generic user-provided function that writes 'ulValue' to the
  25. * PHY-port at 'xAddress' ( 0-based ). xRegister is the register number ( 0 .. 31 ).
  26. * Return non-zero in case the action failed. */
  27. typedef BaseType_t ( * xApplicationPhyWriteHook_t )( BaseType_t xAddress,
  28. BaseType_t xRegister,
  29. uint32_t ulValue );
  30. typedef struct xPhyProperties
  31. {
  32. uint8_t ucSpeed;
  33. uint8_t ucMDI_X; /* MDI-X : Medium Dependent Interface - Crossover */
  34. uint8_t ucDuplex;
  35. uint8_t ucSpare;
  36. } PhyProperties_t;
  37. typedef struct xEthernetPhy
  38. {
  39. xApplicationPhyReadHook_t fnPhyRead;
  40. xApplicationPhyWriteHook_t fnPhyWrite;
  41. uint32_t ulPhyIDs[ ipconfigPHY_MAX_PORTS ];
  42. uint8_t ucPhyIndexes[ ipconfigPHY_MAX_PORTS ];
  43. TimeOut_t xLinkStatusTimer;
  44. TickType_t xLinkStatusRemaining;
  45. BaseType_t xPortCount;
  46. uint32_t ulBCRValue;
  47. uint32_t ulACRValue;
  48. uint32_t ulLinkStatusMask;
  49. PhyProperties_t xPhyPreferences;
  50. PhyProperties_t xPhyProperties;
  51. } EthernetPhy_t;
  52. /* Some defines used internally here to indicate preferences about speed, MDIX
  53. * (wired direct or crossed), and duplex (half or full). */
  54. /* Values for PhyProperties_t::ucSpeed : */
  55. #define PHY_SPEED_10 1
  56. #define PHY_SPEED_100 2
  57. #define PHY_SPEED_AUTO 3
  58. /* Values for PhyProperties_t::ucMDI_X : */
  59. #define PHY_MDIX_DIRECT 1
  60. #define PHY_MDIX_CROSSED 2
  61. #define PHY_MDIX_AUTO 3
  62. /* Values for PhyProperties_t::ucDuplex : */
  63. #define PHY_DUPLEX_HALF 1
  64. #define PHY_DUPLEX_FULL 2
  65. #define PHY_DUPLEX_AUTO 3
  66. /* ID's of supported PHY's : */
  67. #define PHY_ID_LAN8742A 0x0007c130
  68. #define PHY_ID_LAN8720 0x0007c0f0
  69. #define PHY_ID_KSZ8041 0x000010A1
  70. #define PHY_ID_KSZ8051 0x000010A1
  71. #define PHY_ID_KSZ8081 0x000010A1
  72. #define PHY_ID_KSZ8863 0x00221430
  73. #define PHY_ID_KSZ8081MNXIA 0x00221560
  74. #define PHY_ID_DP83848I 0x20005C90
  75. #define PHY_ID_RTL8211FD 0x001cc910
  76. /* Initialise the struct and assign a PHY-read and -write function. */
  77. void vPhyInitialise( EthernetPhy_t * pxPhyObject,
  78. xApplicationPhyReadHook_t fnPhyRead,
  79. xApplicationPhyWriteHook_t fnPhyWrite );
  80. /* Discover all PHY's connected by polling 32 indexes ( zero-based ) */
  81. BaseType_t xPhyDiscover( EthernetPhy_t * pxPhyObject );
  82. /* Send a reset command to the connected PHY ports and send configuration. */
  83. BaseType_t xPhyConfigure( EthernetPhy_t * pxPhyObject,
  84. const PhyProperties_t * pxPhyProperties );
  85. /* Give a command to start auto negotiation on a set of PHY port's. */
  86. BaseType_t xPhyStartAutoNegotiation( EthernetPhy_t * pxPhyObject,
  87. uint32_t ulPhyMask );
  88. /* Do not use auto negotiation but use predefined values from 'pxPhyObject->xPhyPreferences'. */
  89. BaseType_t xPhyFixedValue( EthernetPhy_t * pxPhyObject,
  90. uint32_t ulPhyMask );
  91. /* Check the current Link Status.
  92. * 'xHadReception' : make this true if a packet has been received since the
  93. * last call to this function. */
  94. BaseType_t xPhyCheckLinkStatus( EthernetPhy_t * pxPhyObject,
  95. BaseType_t xHadReception );
  96. /* Get the bitmask of a given 'EthernetPhy_t'. */
  97. #define xPhyGetMask( pxPhyObject ) \
  98. ( ( ( ( uint32_t ) 1u ) << ( pxPhyObject )->xPortCount ) - 1u )
  99. #ifdef __cplusplus
  100. } /* extern "C" */
  101. #endif
  102. #endif /* ifndef PHYHANDLING_H */