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

📄 progmac.cpp

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 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 + -