⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lxt972.c

📁 ecos在9200上redboot实现
💻 C
字号:
//==========================================================================////      lxt972.c////      Driver for LXT972 PHY////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):    cgarry// Contributors: Based on code from: gthomas, jskov//               Grant Edwards <grante@visi.com>// Date:         2002-10-18// Purpose:      // Description:  ////####DESCRIPTIONEND####////========================================================================*/#include <pkgconf/devs_eth_arm_ks32c5000.h>#include "std.h"#include "phy.h"#define Bit(n) (1<<(n))// address of the LX972 phy#ifdef CYGPKG_DEVS_ETH_ARM_KS32C5000_PHYADDR#define LX972_ADDR  CYGPKG_DEVS_ETH_ARM_KS32C5000_PHYADDR#else#define LX972_ADDR  0#endif// LX972 register offsets#define LX972_CTRL_REG          0x00#define LX972_STATUS1_REG       0x01#define LX972_PHY_ID1_REG       0x02#define LX972_PHY_ID2_REG       0x03#define LX972_AN_ADVRT_REG      0x04#define LX972_AN_LPAR_REG       0x05#define LX972_AN_EXP_REG        0x06#define LX972_AN_NEXTPAGE_REG   0x07#define LX972_AN_LPAR_NP_REG    0x08#define LX972_PORT_CONFIG_REG   0x10#define LX972_STATUS2_REG       0x11#define LX972_INT_ENAB_REG      0x12#define LX972_INT_STAT_REG      0x13#define LX972_LED_CONFIG_REG    0x14#define LX972_DIG_CONFIG_REG    0x1A#define LX972_TX_CTRL2_REG      0x1E// LX972 Control register bit defines#define LX972_CTRL_RESET        0x8000#define LX972_CTRL_LOOPBACK     0x4000#define LX972_CTRL_SPEED        0x2000  // 1=100Meg, 0=10Meg#define LX972_CTRL_AN           0x1000  // 1=Enable auto negotiation, 0=disable it#define LX972_CTRL_PWRDN        0x0800  // 1=Enable power down#define LX972_CTRL_ISOLATE      0x0400  // 1=Isolate from MII#define LX972_CTRL_RSTRT_AN     0x0200  // 1=Restart Auto Negotioation process#define LX972_CTRL_FULL_DUP     0x0100  // 1=Enable full duplex mode, 0=half dup#define LX972_CTRL_TST_COLL     0x0080  // 1=Enable collision test// LX972 Interrupt enable register bit defines#define LX972_INT_ENAB_ANMSK     Bit(7)#define LX972_INT_ENAB_SPEEDMSK  Bit(6)#define LX972_INT_ENAB_DUPLEXMSK Bit(5)#define LX972_INT_ENAB_LINKMSK   Bit(4)#define LX972_INT_ENAB_INTEN     Bit(1)#define LX972_INT_ENAB_TINT      Bit(0)// Map LED values from CDL file to reg defines#define LINK_SPEED                                LX972_LED_CONFIG_SPEED_STATUS#define TX_ACTIVITY                               LX972_LED_CONFIG_TX_STATUS#define RX_ACTIVITY                               LX972_LED_CONFIG_RX_STATUS#define COLLISION_STATUS                          LX972_LED_CONFIG_COLLISION_STATUS#define DUPLEX_STATUS                             LX972_LED_CONFIG_DUPLEX_STATUS#define LINK_ACTIVITY                             LX972_LED_CONFIG_RXTX_ACTIVITY#define LINK_STATUS_RX_STATUS_COMBINED            LX972_LED_CONFIG_LINK_RX_COMB#define LINK_STATUS_LINK_ACTIVITY_COMBINED        LX972_LED_CONFIG_LINK_ACT_COMB#define DUPLEX_STATUS_COLLISION_STATUS_COMBINED   LX972_LED_CONFIG_DUPLEX_COLL_COMB#define LINK_STATUS                               LX972_LED_CONFIG_LINK_STATUS#define TEST_ON                                   LX972_LED_CONFIG_TEST_ON#define TEST_OFF                                  LX972_LED_CONFIG_TEST_OFF#define TEST_BLINK_FAST                           LX972_LED_CONFIG_BLINK_FAST#define TEST_BLINK_SLOW                           LX972_LED_CONFIG_BLINK_SLOW// LX972 LED Config register bit defines#define LX972_LED_CONFIG_LED1SHIFT 12#define LX972_LED_CONFIG_LED2SHIFT 8#define LX972_LED_CONFIG_LED3SHIFT 4#define LX972_LED_CONFIG_SPEED_STATUS     0x0#define LX972_LED_CONFIG_TX_STATUS        0x1#define LX972_LED_CONFIG_RX_STATUS        0x2#define LX972_LED_CONFIG_COLLISION_STATUS 0x3#define LX972_LED_CONFIG_LINK_STATUS      0x4#define LX972_LED_CONFIG_DUPLEX_STATUS    0x5#define LX972_LED_CONFIG_RXTX_ACTIVITY    0x7#define LX972_LED_CONFIG_TEST_ON          0x8#define LX972_LED_CONFIG_TEST_OFF         0x9#define LX972_LED_CONFIG_BLINK_FAST       0xA#define LX972_LED_CONFIG_BLINK_SLOW       0xB#define LX972_LED_CONFIG_LINK_RX_COMB     0xC#define LX972_LED_CONFIG_LINK_ACT_COMB    0xD#define LX972_LED_CONFIG_DUPLEX_COLL_COMB 0xE#define LX972_LED_CONFIG_STRETCH_100MS    0x8#define LX972_LED_CONFIG_ENAB_LED_STRETCH Bit(1)// LX972 Auto Negotiation Advertisement register bit defines#define LX972_AN_ADVRT_NEXT_PAGE    Bit(15)#define LX972_AN_ADVRT_PAUSE_ENA    Bit(10)#define LX972_AN_ADVRT_100T4        Bit(9)#define LX972_AN_ADVRT_100TX_FULL   Bit(8)#define LX972_AN_ADVRT_100TX        Bit(7)#define LX972_AN_ADVRT_10T_FULL     Bit(6)#define LX972_AN_ADVRT_10T          Bit(5)#define LX972_AN_ADVRT_SEL_802_3    Bit(0)// LX972 Status register #2 bit defines#define LX972_STATUS2_100M          Bit(14)#define LX972_STATUS2_LINKUP        Bit(10)#define LX972_STATUS2_FULLDUP       Bit(9)#define LX972_STATUS2_ANEG_DONE     Bit(7)// phy functions for Level1 PHY LXT972void 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 lxt972Status = MiiStationRead(LX972_STATUS2_REG,LX972_ADDR);  unsigned r = 0;  if (lxt972Status & LX972_STATUS2_LINKUP)    r |= PhyStatus_LinkUp;  if (lxt972Status & LX972_STATUS2_FULLDUP)    r |= PhyStatus_FullDuplex;  if (lxt972Status & LX972_STATUS2_100M)    r |=  PhyStatus_100Mb;  return r;}void PhyInterruptAck(void){  MiiStationRead(LX972_STATUS1_REG, LX972_ADDR);  MiiStationRead(LX972_INT_STAT_REG, LX972_ADDR);}// EOF lxt972.c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -