友善的superboot是不开放源码的,在经历了友善的折磨之后,决心自己做一个superboot。当然,这只是一个开始~~~
碰到的第一个困难是:
我编译生成了stepldr.nb0,eboot.nb0,bootimage.nb0,板子不支持UART启动,下边如何办呢?
经过对s5pv210相关文档的窥探,得知如下信息:
(1) SD卡必须先格式化为2个分区,三星的IROM code所限制。
(2) 从SD卡启动,需要编译的映像是bootimage.nb0。(set BSP_NOSDMMC_BOOT=,设置为从SD启动,然后编译)
(3) 如果要烧写bootimage.nb0(或者说stepldr.nb0),需要烧写在第1个block(block0 reserved)
(4) bootimage.nb0的第8~12个字节,是check sum,需要手动填写,ROM code才会识别。
(5) 所谓的check sum,是stepldr(16k)的所有字节的和。
第一步,请参考我的前一篇日志,关于SD卡,如何在xp系统下格式化的方法。(当然,这里也可以直接复制SD卡的block0,用winhex直接写,更简单)
第三步/第四步,使用winhex 烧写SD卡。
自己写了一个写checksum的工具,比较简单,附上计算check sum的代码,拖2个button即可:
bool bFileOpen; TCHAR m_szFilePath[_MAX_PATH]; //文件夹路径 TCHAR m_szFileName[_MAX_PATH]; //文件名称,不带后缀 TCHAR m_szFile[_MAX_PATH]; //file全路径
void Ccalu_checksumDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
CString csTemp;
TCHAR * pFilePath;
int i4Length;
int i=0;
//选择 文件
CFileDialog fileDlg(TRUE,_T(".nb0"),
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("nb0 file (*.nb0)|*.nb0|bin file (*.bin)|*.bin|All Files (*.*)|*.*||")
);
if(IDOK==fileDlg.DoModal())
{
bFileOpen = true;
//获取 文件全路径
csTemp = fileDlg.GetPathName();
pFilePath = (TCHAR *)(LPCTSTR)csTemp;
i4Length = csTemp.GetLength();
memcpy(m_szFile,pFilePath,i4Length*2+2);
//获取 文件夹路径
memcpy(m_szFilePath,m_szFile,i4Length*2+1);
for(i=i4Length; i>0; i--)
{
if(m_szFilePath[i] == '\\')
{
m_szFilePath[i+1] = '\0';
break;
}
if(i == 0)
break;
}
//获取文件名
csTemp = fileDlg.GetFileTitle();
pFilePath = (TCHAR *)(LPCTSTR)csTemp;
i4Length = csTemp.GetLength();
memcpy( m_szFileName, pFilePath, i4Length*2+1 );
}
else
{
bFileOpen = false;
}
return;
}
void Ccalu_checksumDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
UINT u4CheckSum = 0;
UINT u4FileSize = 0;
HANDLE hfile = NULL;
int i = 0;
int j = 0;
DWORD dwReaded = 0;
unsigned char buffer[1];
if(!bFileOpen)
return ;
//open file
hfile = CreateFile(m_szFile,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS,
NULL
);
if (hfile == INVALID_HANDLE_VALUE)
{
MessageBox(_T("CreateFile error!"));
return;
}
//caculate check sum
u4CheckSum = 0;
u4FileSize = GetFileSize(hfile, NULL);
SetFilePointer(hfile, 16, NULL, FILE_BEGIN);
for(i=0; i<16*1024 - 16; i++)
{
ReadFile(hfile,buffer, 1, &dwReaded, NULL);
u4CheckSum+= buffer[0];
}
//write check sum
SetFilePointer(hfile, 0x8, NULL, FILE_BEGIN);
WriteFile(hfile,&u4CheckSum, 4, &dwReaded, NULL);
CloseHandle(hfile);
OnOK();
}