📄 hardware.c
字号:
/*---------------------------------------------------------------------------
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 + -