unsigned PhyStatus(void) { unsigned Status; unsigned r = 0, count=0; debug2_printf("Wait\n"); // Wait for auto negotiation to get completed do { Status = MiiStationRead(RTL8201_STATUS_REG,RTL8201_ADDR); CYGACC_CALL_IF_DELAY_US(10000); count++; } while (!(Status&RTL8201_STATUS_AN_COMLETE) && count<500); //If it takes longer then 5 sec stop waiting debug2_printf("Wait finished\n"); debug1_printf("PhyStatus is "); Status = MiiStationRead(RTL8201_STATUS_REG,RTL8201_ADDR); if (Status & RTL8201_STATUS_LINKUP) { r |= PhyStatus_LinkUp; debug1_printf("LINK "); } Status = MiiStationRead(RTL8201_CNTL_REG,RTL8201_ADDR); if (Status & RTL8201_CNTL_FULL_DUP) { r |= PhyStatus_FullDuplex; debug1_printf("FDX "); } Status = MiiStationRead(RTL8201_TEST_REG,RTL8201_ADDR); if (Status & RTL8201_TEST_LINK_100) { r |= PhyStatus_100Mb; debug1_printf("100MBit "); } else if (r & PhyStatus_LinkUp) debug2_printf("10MBit "); debug1_printf("(0x%x)\n",r); return r; }
void PhyReset(void) { unsigned CtrlRegData; // First software reset the LX972 MiiStationWrite(LX972_CTRL_REG, LX972_ADDR, LX972_CTRL_RESET); MiiStationWrite(LX972_CTRL_REG, LX972_ADDR, 0); // Wait until the LX972 reset cycle has completed // The Control register will read 0x7FFF until the reset cycle has completed CtrlRegData = 0x7FFF; while (CtrlRegData == 0x7FFF) { CtrlRegData = MiiStationRead(LX972_CTRL_REG, LX972_ADDR); } // Set up the LEDs' modes MiiStationWrite(LX972_LED_CONFIG_REG, LX972_ADDR, (CYGPKG_DEVS_ETH_ARM_KS32C5000_PHY_LXT972_LED1 << LX972_LED_CONFIG_LED1SHIFT) | (CYGPKG_DEVS_ETH_ARM_KS32C5000_PHY_LXT972_LED2 << LX972_LED_CONFIG_LED2SHIFT) | (CYGPKG_DEVS_ETH_ARM_KS32C5000_PHY_LXT972_LED3 << LX972_LED_CONFIG_LED3SHIFT) | LX972_LED_CONFIG_STRETCH_100MS | LX972_LED_CONFIG_ENAB_LED_STRETCH); // Set MII drive strength MiiStationWrite(LX972_DIG_CONFIG_REG, LX972_ADDR, 0); // Enable interrupts MiiStationWrite(LX972_INT_ENAB_REG, LX972_ADDR, LX972_INT_ENAB_ANMSK | LX972_INT_ENAB_SPEEDMSK | LX972_INT_ENAB_DUPLEXMSK | LX972_INT_ENAB_LINKMSK | LX972_INT_ENAB_INTEN); // Initialize auto-negotiation capabilities // Next page not enabled MiiStationWrite(LX972_AN_ADVRT_REG, LX972_ADDR, LX972_AN_ADVRT_PAUSE_ENA | LX972_AN_ADVRT_100T4 | LX972_AN_ADVRT_100TX_FULL | LX972_AN_ADVRT_100TX | LX972_AN_ADVRT_10T_FULL | LX972_AN_ADVRT_10T | LX972_AN_ADVRT_SEL_802_3); #if 1 // Now start an auto negotiation MiiStationWrite(LX972_CTRL_REG, LX972_ADDR, LX972_CTRL_AN | LX972_CTRL_RSTRT_AN); #else // force to 10M full duplex MiiStationWrite(LX972_CTRL_REG, LX972_ADDR, LX972_CTRL_FULL_DUP); #endif }
unsigned PhyStatus(void) { unsigned lxt970Status = MiiStationRead(LX970_CHIPSTAT_REG,LX970_ADDR); unsigned r = 0; if (lxt970Status & LX970_CHIPSTAT_LINKUP) r |= PhyStatus_LinkUp; if (lxt970Status & LX970_CHIPSTAT_FULLDUP) r |= PhyStatus_FullDuplex; if (lxt970Status & LX970_CHIPSTAT_100M) r |= PhyStatus_100Mb; return r; }
void PhyInterruptAck(void) { MiiStationRead(1,LX970_ADDR); MiiStationRead(18,LX970_ADDR); }
void PhyInterruptAck(void) { MiiStationRead(LX972_STATUS1_REG, LX972_ADDR); MiiStationRead(LX972_INT_STAT_REG, LX972_ADDR); }