读取DBAU1200开发板的BOOT FLASH参考代码
2008-05-31 10:35
441 查看
//========================================================================
//TITLE:
// 读取DBAU1200开发板的BOOT FLASH参考代码
//AUTHOR:
// norains
//DATE:
// Saturday 31-May-2008
//Environment:
// VS2005 + DBAU1200 BOARD + MIPSII SDK
//========================================================================
该段代码用来读取DBAU1200开发板的BOOT FLASH,并保存为SREC格式。
CFlashAmd主要是用来读取BOOT FLASH,该类可在此获取:http://blog.csdn.net/norains/archive/2008/05/31/2498178.aspx
需要注意的是,本文所列的代码为参考代码,还有很多不完善的地方,比如读取的FLASH大小必须为16的整数倍等等,使用的时候需要小心。
#include "stdafx.h"
#include "flashamd.h"
#include <vector>
#include <string>
#include <algorithm>
//DBAU1200开发板的FLASH起始地址
#define DEFAULT_DBAU1200_FLASH_ADDRESS_BASE 0x9C000000
//读取的偏移地址
#define DEFAULT_DBAU1200_FLASH_OFFSET_READ 0x3C00000
//读取的FLASH大小
#define MAX_SIZE_READ (1024 * 1024) // 1Mbyte
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CFlashAmd flash;
flash.SetFlashInfo(Flash::FLASH_INFO_AM29LV256M);
flash.SetFlashAddressBase(DEFAULT_DBAU1200_FLASH_ADDRESS_BASE);
std::vector<BYTE> vtBuf(MAX_SIZE_READ,0);
flash.ReadFlash(DEFAULT_DBAU1200_FLASH_OFFSET_READ,&vtBuf[0],MAX_SIZE_READ);
//Change it to S3 type
const DWORD dwDataPerLine = 16;
DWORD dwStoreCount = 0;
std::string strStore;
DWORD dwChkSum = 0;
DWORD dwAddress = DEFAULT_DBAU1200_FLASH_ADDRESS_BASE + DEFAULT_DBAU1200_FLASH_OFFSET_READ;
while(true)
{
if(dwStoreCount + dwDataPerLine > vtBuf.size())
{
break;
}
//Clear the check sum.
dwChkSum = 0;
//The type and length
std::string strLine;
strLine += "S315";
dwChkSum += 0x15;
//The buffer for storing the convert string
std::vector<char> vtCnvt(9,0);
//The address
_ultoa(dwAddress,&vtCnvt[0],16);
strLine += reinterpret_cast<char *>(&vtCnvt[0]);
dwChkSum += dwAddress >> 24;
dwChkSum += (dwAddress >> 16) & 0xFF;
dwChkSum += (dwAddress >> 8) & 0xFF;
dwChkSum += dwAddress & 0xFF;
dwAddress += dwDataPerLine;
//The data
for(int i = 0; i < dwDataPerLine; i ++)
{
_ultoa(vtBuf[dwStoreCount + i],&vtCnvt[0],16);
if(vtBuf[dwStoreCount + i] > 0x0F)
{
strLine += reinterpret_cast<char *>(&vtCnvt[0]);
}
else
{
strLine = strLine + "0" + reinterpret_cast<char *>(&vtCnvt[0]);
}
dwChkSum += vtBuf[dwStoreCount + i];
}
dwStoreCount += dwDataPerLine;
//The check sum
dwChkSum = 0xFF - (dwChkSum & 0xFF);
_ultoa(dwChkSum,&vtCnvt[0],16);
if(dwChkSum > 0x0F)
{
strLine += reinterpret_cast<char *>(&vtCnvt[0]);
}
else
{
strLine = strLine + "0" + reinterpret_cast<char *>(&vtCnvt[0]);
}
strLine += "/r/n";
//Store to the buffer
strStore += strLine;
}
//to upper
transform(strStore.begin(),strStore.end(),strStore.begin(),toupper);
//Save the data to file
HANDLE hFile = CreateFile(TEXT("bootsave.rec"),GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwWrite = 0;
WriteFile(hFile,&strStore[0],strStore.size(),&dwWrite,NULL);
CloseHandle(hFile);
return 0;
}
//TITLE:
// 读取DBAU1200开发板的BOOT FLASH参考代码
//AUTHOR:
// norains
//DATE:
// Saturday 31-May-2008
//Environment:
// VS2005 + DBAU1200 BOARD + MIPSII SDK
//========================================================================
该段代码用来读取DBAU1200开发板的BOOT FLASH,并保存为SREC格式。
CFlashAmd主要是用来读取BOOT FLASH,该类可在此获取:http://blog.csdn.net/norains/archive/2008/05/31/2498178.aspx
需要注意的是,本文所列的代码为参考代码,还有很多不完善的地方,比如读取的FLASH大小必须为16的整数倍等等,使用的时候需要小心。
#include "stdafx.h"
#include "flashamd.h"
#include <vector>
#include <string>
#include <algorithm>
//DBAU1200开发板的FLASH起始地址
#define DEFAULT_DBAU1200_FLASH_ADDRESS_BASE 0x9C000000
//读取的偏移地址
#define DEFAULT_DBAU1200_FLASH_OFFSET_READ 0x3C00000
//读取的FLASH大小
#define MAX_SIZE_READ (1024 * 1024) // 1Mbyte
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CFlashAmd flash;
flash.SetFlashInfo(Flash::FLASH_INFO_AM29LV256M);
flash.SetFlashAddressBase(DEFAULT_DBAU1200_FLASH_ADDRESS_BASE);
std::vector<BYTE> vtBuf(MAX_SIZE_READ,0);
flash.ReadFlash(DEFAULT_DBAU1200_FLASH_OFFSET_READ,&vtBuf[0],MAX_SIZE_READ);
//Change it to S3 type
const DWORD dwDataPerLine = 16;
DWORD dwStoreCount = 0;
std::string strStore;
DWORD dwChkSum = 0;
DWORD dwAddress = DEFAULT_DBAU1200_FLASH_ADDRESS_BASE + DEFAULT_DBAU1200_FLASH_OFFSET_READ;
while(true)
{
if(dwStoreCount + dwDataPerLine > vtBuf.size())
{
break;
}
//Clear the check sum.
dwChkSum = 0;
//The type and length
std::string strLine;
strLine += "S315";
dwChkSum += 0x15;
//The buffer for storing the convert string
std::vector<char> vtCnvt(9,0);
//The address
_ultoa(dwAddress,&vtCnvt[0],16);
strLine += reinterpret_cast<char *>(&vtCnvt[0]);
dwChkSum += dwAddress >> 24;
dwChkSum += (dwAddress >> 16) & 0xFF;
dwChkSum += (dwAddress >> 8) & 0xFF;
dwChkSum += dwAddress & 0xFF;
dwAddress += dwDataPerLine;
//The data
for(int i = 0; i < dwDataPerLine; i ++)
{
_ultoa(vtBuf[dwStoreCount + i],&vtCnvt[0],16);
if(vtBuf[dwStoreCount + i] > 0x0F)
{
strLine += reinterpret_cast<char *>(&vtCnvt[0]);
}
else
{
strLine = strLine + "0" + reinterpret_cast<char *>(&vtCnvt[0]);
}
dwChkSum += vtBuf[dwStoreCount + i];
}
dwStoreCount += dwDataPerLine;
//The check sum
dwChkSum = 0xFF - (dwChkSum & 0xFF);
_ultoa(dwChkSum,&vtCnvt[0],16);
if(dwChkSum > 0x0F)
{
strLine += reinterpret_cast<char *>(&vtCnvt[0]);
}
else
{
strLine = strLine + "0" + reinterpret_cast<char *>(&vtCnvt[0]);
}
strLine += "/r/n";
//Store to the buffer
strStore += strLine;
}
//to upper
transform(strStore.begin(),strStore.end(),strStore.begin(),toupper);
//Save the data to file
HANDLE hFile = CreateFile(TEXT("bootsave.rec"),GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwWrite = 0;
WriteFile(hFile,&strStore[0],strStore.size(),&dwWrite,NULL);
CloseHandle(hFile);
return 0;
}
相关文章推荐
- 由于QSPI Flash读取方式不正确,导致板卡boot不启动现象
- Windowform 窗体关联数据库存储,读取图片,参考代码
- volatile(在寄存器操作的时候要注意,具体的例子可以参考uboot里面代码)
- [转].net读取硬件信息的参考代码
- Spring Boot参考教程(七)Spring Boot Jar方式读取资源文件
- U-Boot在GOLD44B0X开发板上的移植以及代码分析
- jz2440开发板移植U-boot之修改代码支持DM9000网卡
- U-Boot在44B0X开发板上的移植以及代码分析
- C#简单嵌套flash读取数据的实现代码
- U-Boot在44B0X开发板上的移植以及代码分析
- 归纳STM32 FLASH 擦除(以及如何防止误擦除程序代码)、写入、读取方法
- 基于TQ2440开发板的U-boot-1.1.6的start.S代码分析
- 飞凌OK6410开发板之u-boot-2011.06-rc2移植之愚见续—SOLVE FLASH FAILED
- U-boot之flash初始化完全代码分析
- U-Boot 在44B0X 开发板上的移植以及代码分析
- TQ2440开发板学习纪实(8)--- 从NAND Flash读取数据,把代码搬运到SDRAM运行
- U-Boot 在44B0X 开发板上的移植以及代码分析
- 基于TQ2440开发板的U-boot-1.1.6的start.S代码分析
- 文章生成器,Split方法截取字符串。从硬盘读取文件,和向硬盘存储文件参考代码
- jling openjling jflash 开发板直接烧写bootleader进flash