📄 progmac.cpp
字号:
//
// File: ProgMac.cpp
//
// DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER!
//
// Using this program will overwrite the platform's MAC address!
// This program is being supplied as a resource in case the customer receives
// a platform from the board manufacturer (Intel) without the MAC address programmed.
//
// It is required that all Ethernet devices have a unique MAC address to distinguish
// themselves from other Ethernet devices. Contact your board supplier if the MAC
// address hasn't been programmed into the Ethernet chip's EEPROM to obtain this
// unique number.
//
// If necessary, one may use the Ethernet MAC address from some Ethernet card that is
// to be discarded (removed from some old computer). Don't use a random number!
//
// Manufacturers of Ethernet connected equipment are required to purchase a block of
// MAC addresses to be used with their equipment.
//
// Note: Ethernet MAC addresses are all serialized and can be traced to the
// manufacturer of origin.
//
// DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER!
#include <windows.h>
#include <tchar.h>
#include <ethdbg.h>
#include "sa11x0bd.h"
#include "Sa11X1DB.h"
#define countof(x) (sizeof(x)/sizeof(*(x)))
extern "C" {
BOOL SMCWriteEEPROM( UINT16 EEPROMAddress, UINT16 Data );
BOOL SMCReadEEPROM( UINT16 EEPROMAddress , UINT16 *pwVal);
BOOL SMCInit( BYTE *pbBaseAddress, DWORD dwMultiplier, USHORT MacAddr[3]);
};
extern "C" DWORD OEMEthGetSecs( void )
{
return (GetTickCount()/1000);
}
extern "C" void EdbgOutputDebugString(LPCSTR szFormat, ...) {;};
extern "C" VOID SC_WriteDebugLED(WORD wIndex, DWORD dwPattern) {;};
extern "C" DWORD EdbgDebugZone=0;
void TRACE(LPCTSTR szFormat, ...) {
TCHAR szBuffer[1024] = TEXT("ProgMac: ");
va_list pArgs;
va_start(pArgs, szFormat);
_vsntprintf(szBuffer + 8, countof(szBuffer) - 11, szFormat, pArgs);
va_end(pArgs);
_tcscat(szBuffer, TEXT("\r\n"));
OutputDebugString(szBuffer);
}
typedef union {
BYTE bMacAddr[6];
unsigned short wMacAddr[3];
} MacAddress;
BOOL ProGramMacAddress(MacAddress m_macAddress)
{
MacAddress m_pmacAddress;
SMCReadEEPROM( 0x20, &m_pmacAddress.wMacAddr[0] );
SMCReadEEPROM( 0x21, &m_pmacAddress.wMacAddr[1] );
SMCReadEEPROM( 0x22, &m_pmacAddress.wMacAddr[2] );
TRACE(TEXT("Preious Mac address is %02X:%02X:%02X:%02X:%02X:%02X\r\n"),
m_pmacAddress.bMacAddr[0],
m_pmacAddress.bMacAddr[1],
m_pmacAddress.bMacAddr[2],
m_pmacAddress.bMacAddr[3],
m_pmacAddress.bMacAddr[4],
m_pmacAddress.bMacAddr[5]
);
SMCWriteEEPROM( 0x20, m_macAddress.wMacAddr[0] );
SMCWriteEEPROM( 0x21, m_macAddress.wMacAddr[1] );
SMCWriteEEPROM( 0x22, m_macAddress.wMacAddr[2] );
TRACE(TEXT("Current Mac address is %02X:%02X:%02X:%02X:%02X:%02X\r\n"),
m_macAddress.bMacAddr[0],
m_macAddress.bMacAddr[1],
m_macAddress.bMacAddr[2],
m_macAddress.bMacAddr[3],
m_macAddress.bMacAddr[4],
m_macAddress.bMacAddr[5]
);
return TRUE;
}
UINT ConvertoByte(LPTSTR lpCmdLine,PBYTE pByteData)
{
ASSERT(lpCmdLine);
ASSERT(pByteData);
UINT rtLength=0;
TCHAR tData=0;
for (int i=0;i<2;i++) {
tData *=16;
if (*lpCmdLine>=_T('0') && *lpCmdLine<=_T('9'))
tData += *lpCmdLine -_T('0');
else
if (*lpCmdLine>=_T('a') && *lpCmdLine<=_T('f'))
tData += *lpCmdLine -_T('a')+10;
else
if (*lpCmdLine>=_T('A') && *lpCmdLine<=_T('A'))
tData += *lpCmdLine -_T('A')+10;
else
return rtLength;
rtLength++;
lpCmdLine++;
};
*pByteData=(BYTE)tData;
return rtLength;
}
BOOL GetMacAddress(MacAddress *pmacAddress,LPTSTR lpCmdLine)
{
while (lpCmdLine && *lpCmdLine) {
if (*lpCmdLine == _T(' '))
lpCmdLine++;
else
break;
}
if (lpCmdLine) {
BOOL bSuccess=TRUE;
for (int i=0;i<6;i++) {
BYTE mByteData;
UINT uByteLength=0;
if ((uByteLength=ConvertoByte(lpCmdLine,&mByteData))>=2) {
pmacAddress->bMacAddr[i]=mByteData;
lpCmdLine+=uByteLength;
}
else {
bSuccess=FALSE;
break;
};
}
return bSuccess;
}
return FALSE;
}
extern "C"
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPTSTR lpCmdLine, // pointer to command line
int nShowCmd // show state of window
)
{
MacAddress m_macAddress;
TRACE(TEXT("Command line is:%s\n"),lpCmdLine);
if (GetMacAddress(&m_macAddress,lpCmdLine)) {
volatile struct SA1111DBRegisterBlock * v_pDCCTLReg = (struct SA1111DBRegisterBlock *)DC_NCR_BA;
WRITE_BITFIELD(struct ncrBits,&(v_pDCCTLReg->ncr[0]),enet_osc_en,1);
// Also enable the chip via the Attribute space that has been mapped.
// NOTE: Address bit 17 must be set to get to the attribute space.
// The first assignment sets the IOIS8 and the second assignment
// for the function enable.
*((volatile PBYTE) SMC_ETHER_ATTR_BASE+0x20008) = 0x20;
*((volatile PBYTE) SMC_ETHER_ATTR_BASE+0x20000) = 1;
MacAddress m_DummyMac;
if (SMCInit( (BYTE *)(SMC_ETHER_IO_BASE/*+DEFAULT_ETHER_IO_BASE*4*/), 4, m_DummyMac.wMacAddr)) {
if (!ProGramMacAddress(m_macAddress)) {
TRACE(TEXT("Error return From GetMacAddress \n"));
}
}
else
TRACE(TEXT("Error return From SMCInit "));
}
else
TRACE(TEXT("Error for GetMacAddress from %s\n"),lpCmdLine);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -