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

📄 hardware.c

📁 MICREL 网卡驱动 FOR CE 5.0
💻 C
📖 第 1 页 / 共 5 页
字号:
/*---------------------------------------------------------------------------
          Copyright (c) 2003-2006 Micrel, Inc.  All rights reserved.
  ---------------------------------------------------------------------------

  hardware.c - Target independent hardware functions

  Author  Date      Version  Description
  THa     06/02/06           Add NO_STATS conditional.
  THa     04/06/06           Implement AT93C46 EEPROM access functions.
  THa     02/28/06           Do not use HW_WRITE_BYTE because of limitation of
                             some hardware platforms.
  THa     01/25/06           Add HardwareWriteIntMask and HardwareWriteIntStat
                             functions for 32-bit I/O access only.
  PCD     10/20/05  0.2.0    (1).HardwareSetup() includes enable WOL by magic packet.
                             (2).Added Wake-on-LAN APIs.
                             (3) incorrect register offset in HardwareClearMulticast(), HardwareSetGroupAddress().
  THa     10/06/05           Changed descriptor structure.
  PCD     04/07/05  0.1.1    don't enable "INT_RX_OVERRUN". It waste too much CPU time
                             to handle it if SmartBit send out continuced packets to target.
  PCD     03/30/05  0.1.0    First release.
                               (1). CLI read\write device registers works.
                               (2). Driver Initialization device works .
                               (3). Driver Interrupt Server Routine works.
                               (4). Driver transmit packets to device port works.
                               (5). Driver receive packsts from device works.
  THa     02/23/04           Use inline functions to improve performance.
  THa     10/05/04           Updated for PCI version.
  THa     10/14/04           Updated with latest specs.
  THa     12/10/03  0.0.1    Created file.
  ---------------------------------------------------------------------------
*/


#include "target.h"
#include "hardware.h"

#undef SOFTWARE_STP_SUPPORT


UCHAR DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x88, 0x42, 0x01 };

/* -------------------------------------------------------------------------- */

#ifdef KS_ISA_BUS
#ifndef INLINE
/*
    HardwareSelectBank

    Description:
        This routine changes the bank of registers and keeps track of current
        bank.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bBank
            The new bank of registers.

    Return (None):
*/

void HardwareSelectBank (
    PHARDWARE pHardware,
    UCHAR     bBank )
{
#ifdef SH_16BIT_WRITE
    HW_WRITE_WORD( pHardware, (UCHAR)REG_BANK_SEL_OFFSET, bBank );

#else
    HW_WRITE_BYTE( pHardware, (UCHAR)REG_BANK_SEL_OFFSET, bBank );
#endif
    pHardware->m_bBank = bBank;
}  /* HardwareSelectBank */


/*
    HardwareReadRegByte

    Description:
        This routine reads a byte from specified bank and register.  It calls
        HardwareSelectBank if the bank is different than the current bank.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bBank
            The bank of registers.

        UCHAR bOffset
            The register offset.

        PUCHAR pbData
            Pointer to byte to store the data.

    Return (None):
*/

void HardwareReadRegByte (
    PHARDWARE pHardware,
    UCHAR     bBank,
    UCHAR     bOffset,
    PUCHAR    pbData )
{
    if ( bBank != pHardware->m_bBank )
    {
        HardwareSelectBank( pHardware, bBank );
    }
    HW_READ_BYTE( pHardware, bOffset, pbData );
}  /* HardwareReadRegByte */


/*
    HardwareWriteRegByte

    Description:
        This routine writess a byte to specific bank and register.  It calls
        HardwareSelectBank if the bank is different than the current bank.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bBank
            The bank of registers.

        UCHAR bOffset
            The register offset.

        UCHAR bValue
            The data value.

    Return (None):
*/

void HardwareWriteRegByte (
    PHARDWARE pHardware,
    UCHAR     bBank,
    UCHAR     bOffset,
    UCHAR     bValue )
{
    if ( bBank != pHardware->m_bBank )
    {
        HardwareSelectBank( pHardware, bBank );
    }
    HW_WRITE_BYTE( pHardware, bOffset, bValue );
}  /* HardwareWriteRegByte */


/*
    HardwareReadRegWord

    Description:
        This routine reads a word from specified bank and register.  It calls
        HardwareSelectBank if the bank is different than the current bank.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bBank
            The bank of registers.

        UCHAR bOffset
            The register offset.

        PUSHORT pwData
            Pointer to word to store the data.

    Return (None):
*/

void HardwareReadRegWord (
    PHARDWARE pHardware,
    UCHAR     bBank,
    UCHAR     bOffset,
    PUSHORT   pwData )
{
    if ( bBank != pHardware->m_bBank )
    {
        HardwareSelectBank( pHardware, bBank );
    }
    HW_READ_WORD( pHardware, bOffset, pwData );
}  /* HardwareReadRegWord */


/*
    HardwareWriteRegWord

    Description:
        This routine writess a word to specific bank and register.  It calls
        HardwareSelectBank if the bank is different than the current bank.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bBank
            The bank of registers.

        UCHAR bOffset
            The register offset.

        USHORT wValue
            The data value.

    Return (None):
*/

void HardwareWriteRegWord (
    PHARDWARE pHardware,
    UCHAR     bBank,
    UCHAR     bOffset,
    USHORT    wValue )
{
    if ( bBank != pHardware->m_bBank )
    {
        HardwareSelectBank( pHardware, bBank );
    }
    HW_WRITE_WORD( pHardware, bOffset, wValue );
}  /* HardwareWriteRegWord */

/*
    HardwareReadRegDWord

    Description:
        This routine reads a double word (32-bit) from specified bank and register.  It calls
        HardwareSelectBank if the bank is different than the current bank.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bBank
            The bank of registers.

        UCHAR bOffset
            The register offset.

        PULONG pwData
            Pointer to long to store the data.

    Return (None):
*/

void HardwareReadRegDWord (
    PHARDWARE pHardware,
    UCHAR     bBank,
    UCHAR     bOffset,
    PULONG    pwData )
{
    if ( bBank != pHardware->m_bBank )
    {
        HardwareSelectBank( pHardware, bBank );
    }
    HW_READ_DWORD( pHardware, bOffset, pwData );
}  /* HardwareReadRegDWord */


/*
    HardwareWriteRegDWord

    Description:
        This routine writess a double word (32-bit) to specific bank and register.  It calls
        HardwareSelectBank if the bank is different than the current bank.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bBank
            The bank of registers.

        UCHAR bOffset
            The register offset.

        ULONG wValue
            The data value.

    Return (None):
*/

void HardwareWriteRegDWord (
    PHARDWARE pHardware,
    UCHAR     bBank,
    UCHAR     bOffset,
    ULONG     wValue )
{
    if ( bBank != pHardware->m_bBank )
    {
        HardwareSelectBank( pHardware, bBank );
    }
    HW_WRITE_DWORD( pHardware, bOffset, wValue );
}  /* HardwareWriteRegDWord */


#ifdef SH_32BIT_ACCESS_ONLY
void HardwareWriteIntMask (
    PHARDWARE pHardware,
    ULONG     ulValue )
{
    if ( REG_INT_MASK_BANK != pHardware->m_bBank )
    {
        HardwareSelectBank( pHardware, REG_INT_MASK_BANK );
    }
    HW_WRITE_DWORD( pHardware, REG_INT_MASK_OFFSET, ulValue );
}  /* HardwareWriteIntMask */


void HardwareWriteIntStat (
    PHARDWARE pHardware,
    ULONG     ulValue )
{
    ULONG ulIntEnable;

    if ( REG_INT_STATUS_BANK != pHardware->m_bBank )
    {
        HardwareSelectBank( pHardware, REG_INT_STATUS_BANK );
    }
    HW_READ_DWORD( pHardware, REG_INT_MASK_OFFSET, &ulIntEnable );
    ulIntEnable &= 0x0000FFFF;
    ulIntEnable |= ulValue;
    HW_WRITE_DWORD( pHardware, REG_INT_MASK_OFFSET, ulIntEnable );
}  /* HardwareWriteIntStat */
#endif

#endif  /* #ifndef INLINE */

/* -------------------------------------------------------------------------- */

/*
    HardwareReadBuffer

    Description:
        This routine is used to read data into a buffer if the operating system
        does not provide one.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bOffset
            The register offset.

        PULONG pdwData
            Pointer to word buffer.

        USHORT wLength
            The length of the buffer.

    Return (None):
*/

void HardwareReadBuffer (
    PHARDWARE pHardware,
    UCHAR     bOffset,
    PULONG    pdwData,
    int       length )
{
    int lengthInDWord = length >> 2;
    int remainLengthInByte = length % 4;

    HardwareSelectBank( pHardware, REG_DATA_BANK );

    while ( lengthInDWord--)
    {
        HW_READ_DWORD( pHardware, bOffset, pdwData++ );
    }

    if ( remainLengthInByte > 0 )
    {
        HW_READ_DWORD( pHardware, bOffset, pdwData++ );
    }

}  /* HardwareReadBuffer */



/*
    HardwareWriteBuffer

    Description:
        This routine is used to write data from a buffer if the operating system
        does not provide one.

    Parameters:
        PHARDWARE pHardware
            Pointer to hardware instance.

        UCHAR bOffset
            The register offset.

        PULONG pdwData
            Pointer to word buffer.

        USHORT wLength
            The length of the buffer.

    Return (None):
*/

void HardwareWriteBuffer (
    PHARDWARE pHardware,
    UCHAR     bOffset,
    PULONG    pdwData,
    int       length )
{
    int lengthInDWord = length >> 2;
    int remainLengthInByte = length % 4;

    HardwareSelectBank( pHardware, REG_DATA_BANK );

    while ( lengthInDWord-- )
    {
        HW_WRITE_DWORD( pHardware, bOffset, *pdwData++ );
    }

    if ( remainLengthInByte > 0 )
    {
        HW_WRITE_DWORD( pHardware, bOffset, *pdwData++ );
    }

}  /* HardwareWriteBuffer */


#endif /* #ifdef KS_ISA_BUS */

/* -------------------------------------------------------------------------- */


#define PHY_STAT_SPEED_100MBIT      ( PORT_STAT_SPEED_100MBIT << 8 )
#define PHY_STAT_FULL_DUPLEX        ( PORT_STAT_FULL_DUPLEX << 8 )


#ifdef KS_PCI_BUS

/* PCI Bus Interface */

#define HW_READ_PHY_CTRL( phwi, phy, data )                                 \
    HW_READ_WORD( phwi, phy + REG_PHY_CTRL_OFFSET, &data )

#define HW_WRITE_PHY_CTRL( phwi, phy, data )                                \
    HW_WRITE_WORD( phwi, phy + REG_PHY_CTRL_OFFSET, data )

#define HW_READ_PHY_LINK_STATUS( phwi, phy, data )                          \
    HW_READ_WORD( phwi, phy + REG_PHY_STATUS_OFFSET, &data )

#define HW_READ_PHY_AUTO_NEG( phwi, phy, data )                             \
    HW_READ_WORD( phwi, phy + REG_PHY_AUTO_NEG_OFFSET, &data )

#define HW_WRITE_PHY_AUTO_NEG( phwi, phy, data )                            \
    HW_WRITE_WORD( phwi, phy + REG_PHY_AUTO_NEG_OFFSET, data )

#define HW_READ_PHY_REM_CAP( phwi, phy, data )                              \
    HW_READ_WORD( phwi, phy + REG_PHY_REMOTE_CAP_OFFSET, &data )

#define HW_READ_PHY_CROSSOVER( phwi, phy, data )                            \
    HW_READ_WORD( phwi, phy + REG_PHY_CTRL_OFFSET, &data )

#define HW_WRITE_PHY_CROSSOVER( phwi, phy, data )                           \
    HW_WRITE_WORD( phwi, phy + REG_PHY_CTRL_OFFSET, data )

#define HW_READ_PHY_POLARITY( phwi, phy, data )                             \
    HW_READ_WORD( phwi, phy + REG_PHY_PHY_CTRL_1_OFFSET, &data )

#define HW_READ_PHY_LINK_MD( phwi, phy, data )                              \
    HW_READ_WORD( phwi, phy + REG_PHY_LINK_MD_1_OFFSET, &data )

#define HW_WRITE_PHY_LINK_MD( phwi, phy, data )                             \
    HW_WRITE_WORD( phwi, phy + REG_PHY_LINK_MD_1_OFFSET, data )

#else

/* Generic Bus Interface */

#define HW_READ_PHY_CTRL( phwi, phy, data )                                 \
    HW_READ_WORD( phwi, REG_PHY_CTRL_OFFSET, &data )

#define HW_WRITE_PHY_CTRL( phwi, phy, data )                                \
    HW_WRITE_WORD( phwi, REG_PHY_CTRL_OFFSET, data )

#define HW_READ_PHY_LINK_STATUS( phwi, phy, data )                          \
    HW_READ_WORD( phwi, REG_PHY_STATUS_OFFSET, &data )

#define HW_READ_PHY_AUTO_NEG( phwi, phy, data )                             \
    HW_READ_WORD( phwi, REG_PHY_AUTO_NEG_OFFSET, &data )

#define HW_WRITE_PHY_AUTO_NEG( phwi, phy, data )                            \
    HW_WRITE_WORD( phwi, REG_PHY_AUTO_NEG_OFFSET, data )

#define HW_READ_PHY_REM_CAP( phwi, phy, data )                              \
    HW_READ_WORD( phwi, REG_PHY_REMOTE_CAP_OFFSET, &data )

#define HW_READ_PHY_CROSSOVER( phwi, phy, data )                            \
    HW_READ_WORD( phwi, REG_PHY_CTRL_OFFSET, &data )

#define HW_WRITE_PHY_CROSSOVER( phwi, phy, data )                           \
    HW_WRITE_WORD( phwi, REG_PHY_CTRL_OFFSET, data )

#define HW_READ_PHY_POLARITY( phwi, phy, data )                             \
    HW_READ_WORD( phwi, REG_PHY_PHY_CTRL_1_OFFSET + phy *                   \
        PHY_SPECIAL_INTERVAL, &data )

#define HW_READ_PHY_LINK_MD( phwi, phy, data )                              \
    HW_READ_WORD( phwi, REG_PHY_LINK_MD_1_OFFSET + phy *                    \
        PHY_SPECIAL_INTERVAL, &data )

#define HW_WRITE_PHY_LINK_MD( phwi, phy, data )                             \
    HW_WRITE_WORD( phwi, REG_PHY_LINK_MD_1_OFFSET + phy *                   \
        PHY_SPECIAL_INTERVAL, data )

⌨️ 快捷键说明

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