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

📄 firmware.cpp

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