u-boot  S5PV210加头文件

因为S5PV210在启动的时候,第一阶段:运行iROM里面的BL0(固化好的),BL0的作用是把BL1复制到SRAM中去,在复制完了后,210会做一个检查校验。BL1必须有一个头信息数据,共16字节, 被分为4部分,每一部分位4个字节。这个头信息数据包含 (BL1大小、用户写进去的校验码(长度))在复制完后,会把BL1大小和用户写进去的长度做一个校验比较,如果相同,则继续程序执行。这里有一个校验算法其实就是计算复制后的BL1里面1的个数,这一步校验算法在复制完BL1后系统自己运行,计算后的结果和用户填进去的长度进行比较。在用户填写校验码的时候也要使用和它相同的校验算法。

推荐阅读S5PV210_iROM_ApplicationNote_Preliminary手册
//这里引用国嵌的加头文件,再此感谢国嵌的分享
#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. 计算校验和
  // 4.1 从第16byte开始统计buffer中共有几个1
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值