📄 niceeprom.c
字号:
/*******************************************************************************
*** Note: Copy rights resevered to Beijing Pacific Linkair Communications Co.
***
*** File Name: NICEeprom.c
*** Purpose : Supply the NIC EEPROM Accessing Layer Routines and some other definitions
***
*** Author : Guangzhao Tian
*** Modified : By Guangzhao Tian at 2000/9/7
***
**/
#include "NICMacro.h"
#include "NICWinReg.h"
#include "NICCommand.h"
#include "NICEeprom.h"
#include "NICData.h"
#include "NICHelper.h"
#include "NICExport.h"
/*********************************************************
*** send command into NIC and wait it completed
***/
NIC_STATUS NIC_COMMAND_WAIT(IN NIC_INFORMATION * pAdapter,IN USHORT Command )
{
DWORD count;
USHORT value;
register int ix;
NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress,INTSTATUS_COMMAND_REGISTER,Command);
for (ix = 0; ix < NIC_WAITTIMES; ix++)
{
value = NIC_READ_PORT_USHORT(pAdapter->IoBaseAddress,INTSTATUS_COMMAND_REGISTER);
if (!(value & INTSTATUS_COMMAND_IN_PROGRESS) ) break;
NIC_DELAY(NIC_RESETWAITTIME);
}
if (ix == NIC_WAITTIMES)
{
DebugMsg(" It seems the Command Never Completed !\n");
return NIC_STATUS_FAILURE;
}
return NIC_STATUS_SUCCESS;
}
/**********************************************************************
** Fill EEPROM Data to Global Controlling Variable
*/
NIC_STATUS NIC_EEPROMFillGlobal(IN NIC_INFORMATION * pAdapter)
{
WORD nRetValue=0;
int nCount=0;
DebugMsg("Now Reading the EEPROM Values from the Card \n");
/************** Get Device ID from EEPROM ********************/
if(NIC_STATUS_FAILURE == NIC_EEPROMRead(pAdapter, EEPROM_DEVICE_ID, &nRetValue) )
{
DebugMsg("Failure to read EEPROM Registers: DEVICE ID ! \n " );
return NIC_STATUS_FAILURE;
}
else
pAdapter->EEPROMInfo.wDeviceID=(USHORT) nRetValue;
DebugMsg("Device ID in EEPROM: 0x%08X ! \n",pAdapter->EEPROMInfo.wDeviceID );
/*************** Get 3 OEM Node Addresses ********************/
for (; nCount <3;nCount ++)
{
if(NIC_STATUS_FAILURE == NIC_EEPROMRead(pAdapter,
EEPROM_OEM_NODE_ADDRESS_WORD_0+nCount, &nRetValue) )
{
DebugMsg("Failure to read EEPROM Registers: OEM Addr[ 0x%04X] ! \n ",nCount );
return NIC_STATUS_FAILURE;
}
else
pAdapter->EEPROMInfo.wOEMNodeAddress[nCount]=(USHORT) nRetValue;
DebugMsg("OEM Device Address[ 0x%04X ] in EEPROM: 0x%08X ! \n",nCount,
pAdapter->EEPROMInfo.wOEMNodeAddress[nCount] );
}
/****----------- Read the compatability word from EEPROM ------****/
if(NIC_STATUS_FAILURE == NIC_EEPROMRead(pAdapter, EEPROM_COMPATABILITY_WORD, &nRetValue) )
{
DebugMsg("Failure to read EEPROM Registers: COMPATABILITY_WORD ! \n " );
return NIC_STATUS_FAILURE;
}
else
pAdapter->EEPROMInfo.wDeviceID=(USHORT) nRetValue;
DebugMsg("COMPATABILITY_WORD in EEPROM: 0x%08X ! \n",pAdapter->EEPROMInfo.wDeviceID );
/****----------- Read the capabilities information from EEPROM ------****/
if (NIC_STATUS_FAILURE == NIC_EEPROMRead (pAdapter ,EEPROM_CAPABILITIES_WORD, &nRetValue ) )
{
DebugMsg("Can not read capabilities information from EEPROM \n");
return NIC_STATUS_FAILURE;
}
else
pAdapter->EEPROMInfo.wCapabilitiesWord = nRetValue;
DebugMsg("Capabilities Word in EEPROM: 0x%08X ! \n",pAdapter->EEPROMInfo.wCapabilitiesWord );
/************* Get Media Options from EEPROM **************/
if(NIC_STATUS_FAILURE == NIC_EEPROMRead(pAdapter, EEPROM_MEDIAOPTIONS, &nRetValue) )
{
DebugMsg("Failure to read EEPROM Registers: Media Options ! \n " );
return NIC_STATUS_FAILURE;
}
else
pAdapter->EEPROMInfo.wDeviceID=(USHORT) nRetValue;
DebugMsg("Media Options in EEPROM: 0x%08X ! \n",pAdapter->EEPROMInfo.wDeviceID );
return NIC_STATUS_SUCCESS;
}
/***********************************************************************
**** Check if EEPROM is Busy, if not we can do our work, if is, wait
until it becomes idle
*/
NIC_STATUS NIC_EEPROMIsBusy( IN NIC_INFORMATION * pAdapter )
{
USHORT nCommand = 0;
DWORD count;
register int ix;
for (ix = 0; ix < EEPROM_WAITTIMES; ix++)
{
nCommand = NIC_READ_PORT_USHORT(pAdapter->IoBaseAddress,EEPROM_COMMAND_REGISTER);
if (!(nCommand & EEPROM_BUSY_BIT)) break;
NIC_DELAY(EEPROM_TIMEOUT);
}
if (ix == EEPROM_WAITTIMES)
{
DebugMsg("It seems the EEPROM Never get tired, Maybe She has gone off!\n");
return NIC_STATUS_FAILURE;
}
return NIC_STATUS_SUCCESS;
}
/********************************************************************
*** Read some information from the nonvoliant EEPROM
*/
NIC_STATUS NIC_EEPROMRead (IN NIC_INFORMATION * pAdapter,
IN USHORT EEPROMAddress, OUT PUSHORT pValue )
{
USHORT lowerOffset = 0;
USHORT upperOffset = 0;
if (EEPROMAddress > 0x003F)
{
lowerOffset = EEPROMAddress & 0x003F;
upperOffset = (EEPROMAddress & 0x03C0) << 2;
EEPROMAddress = upperOffset | lowerOffset;
}
NIC_COMMAND( (pAdapter->IoBaseAddress),
(USHORT)(COMMAND_SELECT_REGISTER_WINDOW | REGISTER_WINDOW_0) );
/* Check if EEPROM is busy */
if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
{
DebugMsg("Can not read EEPROM: it's busy! \n");
return NIC_STATUS_FAILURE;
}
/* Issue the read eeprom data command */
NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress, EEPROM_COMMAND_REGISTER,
(USHORT)(EEPROM_COMMAND_READ + (USHORT)EEPROMAddress));
/* Check if EEPROM is busy */
if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
{
DebugMsg("the EEPROM keep on reading the value forever ! \n");
return NIC_STATUS_FAILURE;
}
/* Save value read from eeprom */
*pValue =(USHORT) NIC_READ_PORT_USHORT(pAdapter->IoBaseAddress, EEPROM_DATA_REGISTER);
return NIC_STATUS_SUCCESS;
}
/**********************************************************************
** Write Data to EEPROM of NIC
*/
NIC_STATUS NIC_EEPROMWrite(IN NIC_INFORMATION * pAdapter,
IN USHORT EEPROMAddress, IN USHORT Data)
{
USHORT lowerOffset = 0;
USHORT upperOffset = 0;
if (EEPROMAddress > 0x003F)
{
lowerOffset = EEPROMAddress & 0x003F;
upperOffset = (EEPROMAddress & 0x03C0) << 2;
EEPROMAddress = upperOffset | lowerOffset;
}
NIC_COMMAND( (pAdapter->IoBaseAddress),(COMMAND_SELECT_REGISTER_WINDOW | REGISTER_WINDOW_0) );
/* Check if EEPROM is busy */
if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
{
DebugMsg("Can not enable EEPROM: it's busy");
return NIC_STATUS_FAILURE;
}
/*Enable the EEPROM write for erasing */
NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress ,
EEPROM_COMMAND_REGISTER, (USHORT)EEPROM_WRITE_ENABLE);
/* Check if EEPROM is busy */
if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
{
DebugMsg("Can not Erase EEPROM: it's keep on enable the writing");
return NIC_STATUS_FAILURE;
}
/* Issue erase register command prior to writing */
NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress , EEPROM_COMMAND_REGISTER,
(USHORT)(EEPROM_ERASE_REGISTER + (USHORT)EEPROMAddress));
/* Check if EEPROM is busy */
if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
{
DebugMsg("Can not write EEPROM: it's busy erasing the EEPROM");
return NIC_STATUS_FAILURE;
}
/* Load data to the EepromData register for writting */
NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress, EEPROM_DATA_REGISTER, Data);
/*Enable the EEPROM write once more ,this time for writing*/
NIC_WRITE_PORT_USHORT(pAdapter->IoBaseAddress ,
EEPROM_COMMAND_REGISTER, (USHORT)EEPROM_WRITE_ENABLE);
/* Check if EEPROM is busy */
if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
{
DebugMsg("Can not write EEPROM: it's keep on enable the writing");
return NIC_STATUS_FAILURE;
}
/* Issue the Write command ,this do the real working */
NIC_WRITE_PORT_USHORT ( pAdapter->IoBaseAddress ,EEPROM_COMMAND_REGISTER,
(USHORT)(EEPROM_WRITE_REGISTER + (USHORT)EEPROMAddress));
/* Check if EEPROM is busy */
if (NIC_EEPROMIsBusy(pAdapter) != NIC_STATUS_SUCCESS)
{
DebugMsg("Can not write EEPROM: it's busy");
return NIC_STATUS_FAILURE;
}
return NIC_STATUS_SUCCESS;
}
/***********************************************************************
*** Checksum the EEPROM
*/
WORD NIC_EEPROMChecksum(IN NIC_INFORMATION * pAdapter )
{
NIC_STATUS nStatus;
USHORT checksum=0;
USHORT value=0;
USHORT index;
NIC_COMMAND(pAdapter->IoBaseAddress , COMMAND_SELECT_REGISTER_WINDOW | REGISTER_WINDOW_0);
for (index = EEPROM_NODE_ADDRESS_WORD_0; index < EEPROM_CHECKSUM_1; index++)
{
nStatus = NIC_EEPROMRead(pAdapter, index, &value);
if (nStatus == NIC_STATUS_FAILURE)
{
DebugMsg("cann't checksum the eeprom, since we cannot read all the data from it");
return NIC_STATUS_FAILURE;
}
checksum ^= (USHORT)LOBYTE(value);
checksum ^= (USHORT)HIBYTE(value);
}
return((USHORT)checksum);
}
/*** Above are routines about EEPROM
*** End of EEPROM.c
************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -