Added timeout on PHY detection setting.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4105 35acf78f-673a-0410-8e92-d51de3d6d3f4
master
gdisirio 2012-04-17 07:41:20 +00:00
parent 82d784f498
commit c53f702381
2 changed files with 31 additions and 6 deletions

View File

@ -118,14 +118,22 @@ static uint32_t mii_read(MACDriver *macp, uint32_t reg) {
static void mii_find_phy(MACDriver *macp) { static void mii_find_phy(MACDriver *macp) {
uint32_t i; uint32_t i;
for (i = 0; i < 31; i++) { #if STM32_MAC_PHY_TIMEOUT > 0
macp->phyaddr = i << 11; halrtcnt_t start = halGetCounterValue();
ETH->MACMIIDR = (i << 6) | MACMIIDR_CR; halrtcnt_t timeout = start + MS2RTT(STM32_MAC_PHY_TIMEOUT);
if ((mii_read(macp, MII_PHYSID1) == (BOARD_PHY_ID >> 16)) && while (halIsCounterWithin(start, timeout)) {
((mii_read(macp, MII_PHYSID2) & 0xFFF0) == (BOARD_PHY_ID & 0xFFF0))) { #endif
return; for (i = 0; i < 31; i++) {
macp->phyaddr = i << 11;
ETH->MACMIIDR = (i << 6) | MACMIIDR_CR;
if ((mii_read(macp, MII_PHYSID1) == (BOARD_PHY_ID >> 16)) &&
((mii_read(macp, MII_PHYSID2) & 0xFFF0) == (BOARD_PHY_ID & 0xFFF0))) {
return;
}
} }
#if STM32_MAC_PHY_TIMEOUT > 0
} }
#endif
/* Wrong or defective board.*/ /* Wrong or defective board.*/
chSysHalt(); chSysHalt();
} }

View File

@ -141,6 +141,19 @@
#define STM32_MAC_BUFFERS_SIZE 1518 #define STM32_MAC_BUFFERS_SIZE 1518
#endif #endif
/**
* @brief PHY detection timeout.
* @details Timeout, in milliseconds, for PHY address detection, if a PHY
* is not detected within the timeout then the driver halts during
* initialization. This setting applies only if the PHY address is
* not explicitly set in the board header file using
* @p BOARD_PHY_ADDRESS. A zero value disables the timeout and a
* single search path is performed.
*/
#if !defined(STM32_MAC_PHY_TIMEOUT) || defined(__DOXYGEN__)
#define STM32_MAC_PHY_TIMEOUT 100
#endif
/** /**
* @brief ETHD1 interrupt priority level setting. * @brief ETHD1 interrupt priority level setting.
*/ */
@ -170,6 +183,10 @@
/* Derived constants and error checks. */ /* Derived constants and error checks. */
/*===========================================================================*/ /*===========================================================================*/
#if (STM32_MAC_PHY_TIMEOUT > 0) && !HAL_IMPLEMENTS_COUNTERS
#error "STM32_MAC_PHY_TIMEOUT requires the realtime counter service"
#endif
/*===========================================================================*/ /*===========================================================================*/
/* Driver data structures and types. */ /* Driver data structures and types. */
/*===========================================================================*/ /*===========================================================================*/