Example #1
0
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;
}
Example #2
0
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
}
Example #3
0
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;
}
Example #4
0
void PhyInterruptAck(void)
{
  MiiStationRead(1,LX970_ADDR);
  MiiStationRead(18,LX970_ADDR);
}
Example #5
0
void PhyInterruptAck(void)
{
  MiiStationRead(LX972_STATUS1_REG, LX972_ADDR);
  MiiStationRead(LX972_INT_STAT_REG, LX972_ADDR);
}