📄 firmware.cpp
字号:
#include <windows.h>
#include <halether.h>
#include <eglobal.h>
#include "alt_def.h"
#include "bootldr.h"
#include "xmodem.hpp"
#include "flash.hpp"
#include "firmware.h"
VOID LoadFirmware(VOID)
{
CXModem xm;
CFlash<CFlashData32> BootRom;
ADDRESS RawData = 0x80001000;
ULONG ulBinSize;
ULONG ulFlashLocation;
UINT uFlashSize;
uFlashSize = BootRom.Check(KSEG1_BASE + FLASH_BASE);
if ( uFlashSize == 0)
{
EdbgOutputDebugString("Flash device not found\r\n");
return;
}
ulFlashLocation = KSEG1_BASE + BOOT_BASE;
EdbgOutputDebugString("\nUpload raw firmware file via serial port\r\n");
ulBinSize = xm.Receive(RawData);
if (ulBinSize == 0)
{
EdbgOutputDebugString("\r\n Receive 0 byte, do nothing\r\n");
return;
}
if(!BootRom.WriteRegion(ulFlashLocation, RawData, ulBinSize))
{
BootRom.ShowError();
return;
}
// compare data
{
ULONG i;
BYTE *pbSrc = (BYTE *)RawData;
BYTE *pbDest = (BYTE *)ulFlashLocation;
EdbgOutputDebugString("Comparing Data\r\n");
for (i = 0; i< ulBinSize; i++)
{
if (*pbSrc != *pbDest)
{
EdbgOutputDebugString("ERROR: Flash Write at %X SRC=%B DEST=%B\r\n",pbDest,
*pbSrc,
*pbDest);
}
}
}
}
VOID UpdateFlashIPData(DWORD dwIp, DWORD dwSubnetMask)
{
DEVICE_NETWORK_INFO FlashNetworkInfo;
CFlash <CFlashData32> BootROM;
memcpy(&FlashNetworkInfo, (const void *)DEVICE_NETWORK_INFO_LOCATION,
sizeof(DEVICE_NETWORK_INFO));
if ((FlashNetworkInfo.dwSignature == VALID_INFO_SIGNATURE) &&
(FlashNetworkInfo.dwIP == dwIp) &&
(FlashNetworkInfo.dwSubnetMask == dwSubnetMask))
{
return;
}
EdbgOutputDebugString(" *** New IP Address assigned...\r\n");
EdbgOutputDebugString("Storing IP Address = %s\n", inet_ntoa(dwIp));
EdbgOutputDebugString("Storing SubnetMask = %s\n", inet_ntoa(dwSubnetMask));
FlashNetworkInfo.dwSignature = VALID_INFO_SIGNATURE;
FlashNetworkInfo.dwIP = dwIp;
FlashNetworkInfo.dwSubnetMask = dwSubnetMask;
BootROM.Check(KSEG1_BASE + FLASH_BASE);
if(!BootROM.WriteRegion((ADDRESS)DEVICE_NETWORK_INFO_LOCATION,
(ADDRESS)&FlashNetworkInfo,
sizeof(DEVICE_NETWORK_INFO)))
{
BootROM.ShowError();
}
}
extern "C"
{
VOID UpdateFlashMACData(PUSHORT pMAC)
{
DEVICE_NETWORK_INFO FlashNetworkInfo;
CFlash <CFlashData32> BootROM;
memcpy(&FlashNetworkInfo, (const void *)DEVICE_NETWORK_INFO_LOCATION,
sizeof(DEVICE_NETWORK_INFO));
// Clear IP/subnet information since we potentially have a new MAC
// address for the device...
//
FlashNetworkInfo.dwSignature = VALID_INFO_SIGNATURE;
FlashNetworkInfo.dwIP = 0x00;
FlashNetworkInfo.dwSubnetMask = 0x00;
// Store MAC information...
FlashNetworkInfo.dwMACSignature = VALID_MAC_ADDRESS;
FlashNetworkInfo.wMAC[0] = pMAC[0];
FlashNetworkInfo.wMAC[1] = pMAC[1];
FlashNetworkInfo.wMAC[2] = pMAC[2];
EdbgOutputDebugString(" *** New MAC Address assigned...\r\n");
EdbgOutputDebugString("MAC Address = %x%x%x\n", pMAC[0], pMAC[1], pMAC[2]);
BootROM.Check(KSEG1_BASE + FLASH_BASE);
if(!BootROM.WriteRegion((ADDRESS)DEVICE_NETWORK_INFO_LOCATION,
(ADDRESS)&FlashNetworkInfo,
sizeof(DEVICE_NETWORK_INFO)))
{
BootROM.ShowError();
}
}
}
extern "C"
{
VOID UpdateFlashLaunchAddrData(DWORD dwLaunchAddr)
{
DEVICE_NETWORK_INFO FlashNetworkInfo;
CFlash <CFlashData32> BootROM;
memcpy(&FlashNetworkInfo, (const void *)DEVICE_NETWORK_INFO_LOCATION,
sizeof(DEVICE_NETWORK_INFO));
if (FlashNetworkInfo.dwSignature != VALID_INFO_SIGNATURE)
{
FlashNetworkInfo.dwSignature = VALID_INFO_SIGNATURE;
FlashNetworkInfo.dwIP = 0x00;
FlashNetworkInfo.dwSubnetMask = 0x00;
}
// Store launch address...
//
FlashNetworkInfo.dwLaunchAddr = dwLaunchAddr;
BootROM.Check(KSEG1_BASE + FLASH_BASE);
if(!BootROM.WriteRegion((ADDRESS)DEVICE_NETWORK_INFO_LOCATION,
(ADDRESS)&FlashNetworkInfo,
sizeof(DEVICE_NETWORK_INFO)))
{
BootROM.ShowError();
return;
}
EdbgOutputDebugString("INFO: Launch address successfully stored to flash (0x%x).\r\n", dwLaunchAddr);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -