因为S5PV210在启动的时候,第一阶段:运行iROM里面的BL0(固化好的),BL0的作用是把BL1复制到SRAM中去,在复制完了后,210会做一个检查校验。BL1必须有一个头信息数据,共16字节,
被分为4部分,每一部分位4个字节。这个头信息数据包含
(BL1大小、用户写进去的校验码(长度))在复制完后,会把BL1大小和用户写进去的长度做一个校验比较,如果相同,则继续程序执行。这里有一个校验算法其实就是计算复制后的BL1里面1的个数,这一步校验算法在复制完BL1后系统自己运行,计算后的结果和用户填进去的长度进行比较。在用户填写校验码的时候也要使用和它相同的校验算法。
推荐阅读S5PV210_iROM_ApplicationNote_Preliminary手册
//这里引用国嵌的加头文件,再此感谢国嵌的分享
// 4.1 从第16byte开始统计buffer中共有几个1
#include
#include
#include
#define BUFSIZE
(16*1024)
#define IMG_SIZE
(16*1024)
#define SPL_HEADER_SIZE
16
#define SPL_HEADER
"S5PC110 HEADER
"
int main (int argc, char *argv[])
{
FILE *fp;
char *Buf, *a;
int BufLen;
int nbytes, fileLen;
unsigned int checksum, count;
int i;
// 1. 3个参数
if (argc != 3)
{
printf("Usage: mkbl1 \n");
return -1;
}
// 2. 分配16K的buffer
BufLen = BUFSIZE;
Buf = (char *)malloc(BufLen);
if (!Buf)
{
printf("Alloc buffer failed!\n");
return -1;
}
memset(Buf, 0x00, BufLen);
// 3. 读源bin到buffer
// 3.1 打开源bin
fp = fopen(argv[1], "rb");
if( fp == NULL)
{
printf("source file open error\n");
free(Buf);
return -1;
}
// 3.2 获取源bin长度
fseek(fp, 0L, SEEK_END);
fileLen = ftell(fp);
fseek(fp, 0L, SEEK_SET);
// 3.3 源bin长度不得超过16K-16byte
count = (fileLen < (IMG_SIZE - SPL_HEADER_SIZE))
? fileLen : (IMG_SIZE - SPL_HEADER_SIZE);
// 3.4 buffer[0~15]存放"S5PC110 HEADER
"
memcpy(&Buf[0], SPL_HEADER, SPL_HEADER_SIZE);
// 3.5 读源bin到buffer[16]
nbytes = fread(Buf + SPL_HEADER_SIZE, 1, count, fp);
if ( nbytes != count )
{
printf("source file read error\n");
free(Buf);
fclose(fp);
return -1;
}
fclose(fp);
// 4. 计算校验和
a = Buf + SPL_HEADER_SIZE;
for(i = 0, checksum = 0; i < IMG_SIZE - SPL_HEADER_SIZE; i++)
checksum += (0x000000FF) & *a++;
// 4.2 将校验和保存在buffer[8~15]
a = Buf + 8;
*( (unsigned int *)a ) = checksum;
// 5. 拷贝buffer中的内容到目的bin
// 5.1 打开目的bin
fp = fopen(argv[2], "wb");
if (fp == NULL)
{
printf("destination file open error\n");
free(Buf);
return -1;
}
// 5.2 将16k的buffer拷贝到目的bin中
a = Buf;
nbytes = fwrite( a, 1, BufLen, fp);
if ( nbytes != BufLen )
{
printf("destination file write error\n");
free(Buf);
fclose(fp);
return -1;
}
free(Buf);
fclose(fp);
return 0;
}