s5pv210 SD boot (2)

友善的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();
}



 

 

你可能感兴趣的:(退却的激情)