Chinaunix首页 | 论坛 | 博客
  • 博客访问: 479573
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 955
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-21 09:30
文章分类

全部博文(100)

文章存档

2017年(1)

2016年(16)

2015年(83)

我的朋友

分类: 嵌入式

2015-09-09 17:48:54

TQ210的u-boot应放在第49个扇区(按首扇区从0开始算),BL1放在扇区1,大小可以取8K,取16K也可以,只要能运行到搬运代码即可。
u-boot需要添加16字节的头信息,网上有个mkv210_image.c,还有zjh写的addheader.c,都差不多,由于TQ210的u-boot头部已经填充了16字节,所以需要该一下源码。
mktq210spl.c :

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. #define IMG_SIZE    (8 * 1024)//BL1=8K
  5. #define HEADER_SIZE    16 //16字节
  6. #define DATA_OFFSET 16    //16字节
  7. #define UBOOT_SIZE (512* 1024)

  8. /*
  9. * Requirement:
  10. * IROM code reads first 14K bytes from boot device.
  11. * It then calculates the checksum of 14K-4 bytes and compare with data at
  12. * 14K-4 offset.
  13. *
  14. * This function takes two filenames:
  15. * IN "u-boot-spl.bin" and
  16. * OUT "u-boot-mmc-spl.bin" as filenames.
  17. * 1. 开辟缓冲区buffer
  18. * 2. 读取输入文件到缓冲区u-boot-spl.bin
  19. * 3. 计算校验和,存放头信息到buffer的前面16个字节
  20. * 4. 保存buffer到输出文件u-boot-mmc-spl.bin
  21. */

  22. int main (int argc, char *argv[])
  23. {
  24.     FILE            *fp;
  25.     unsigned        char *buffer;
  26.     int                bufferLen;
  27.     int                nbytes, fileLen;
  28.     unsigned int    checksum, count;
  29.     int                i;

  30.     if (argc != 3)
  31.     {
  32.         printf("Usage: %s \n", argv[0]);
  33.         return -1;
  34.     }

  35.     /* 分配16KByte的buffer,BL1最大为16KByte,并初始化为0 */
  36.     buffer = calloc(1, UBOOT_SIZE);
  37.     if (!buffer)
  38.     {
  39.         perror("Alloc buffer failed!");
  40.         return -1;
  41.     }

  42.     /* 打开源bin文件 */
  43.     fp = fopen(argv[1], "rb");
  44.     if( fp == NULL)
  45.     {
  46.         perror("source file open error");
  47.         free(buffer);
  48.         return -1;
  49.     }
  50.     
  51.     /* 获取源bin文件的长度 */
  52.     fseek(fp, 0L, SEEK_END);//指针定位到文件末尾
  53.     fileLen = ftell(fp);//计算当前指针到相对于文件首的偏移字节数,即文件长度
  54.     fseek(fp, 0L, SEEK_SET);
  55.     /* 源bin文件不得超过512KByte */
  56.     if (fileLen > UBOOT_SIZE)
  57.     {
  58.         fprintf(stderr, "Source file is too big(> 16KByte)\n");
  59.         free(buffer);
  60.         fclose(fp);
  61.         return 0;
  62.     }
  63.     if (fileLen > IMG_SIZE)
  64.     {
  65.         fileLen = IMG_SIZE;
  66.     }
  67.     /* 计算校验和 */
  68.     i = 0;
  69.     checksum = 0;
  70.     fseek(fp, DATA_OFFSET, SEEK_SET);//指针指向数据起始位置,即spl的第16字节
  71.     /* 从buffer[HEADER_SIZE]开始,复制bl1的(8K-16)字节 */
  72.     for (i = 0; i < (fileLen - DATA_OFFSET); i++)
  73.     {
  74.         fread(buffer + HEADER_SIZE + i, 1, 1, fp);
  75.         checksum += buffer[HEADER_SIZE + i];
  76.     }
  77.     printf("\ni = %d ", i);
  78.     printf("checksum = 0x%x\n", checksum );
  79.     fclose(fp);

  80.     /* 计算BL1的大小(BL1的大小包括BL1的头信息),并保存到buffer[0~3]*/
  81.     fileLen -= DATA_OFFSET;
  82.     printf("Length of BL1 = %d\n", fileLen );
  83.     
  84.     //保存BL1的长度(包含头信息)到buffer的最前面4个字节。
  85.     memcpy(buffer, &fileLen, 4);

  86.     // 将校验和保存在buffer[8~15]
  87.     memcpy(buffer + 8, &checksum, 4);

  88.     /* 打开目标文件 */
  89.     fp = fopen(argv[2], "wb");
  90.     if (fp == NULL)
  91.     {
  92.         perror("destination file open error");
  93.         free(buffer);
  94.         return -1;
  95.     }
  96.     // 将buffer拷贝到目标bin文件中
  97.     nbytes    = fwrite(buffer, 1, fileLen, fp);
  98.     if (nbytes != fileLen)
  99.     {
  100.         perror("destination file write error");
  101.         free(buffer);
  102.         fclose(fp);
  103.         return -1;
  104.     }

  105.     free(buffer);
  106.     fclose(fp);

  107.     return 0;
  108. }
使用addheader的烧写脚本:
#!/bin/sh
dd bs=1 count=8176 if=u-boot.bin of=spl.bin skip=16
./addheader spl.bin bl1.bin
dd bs=512 iflag=dsync oflag=dsync if=bl1.bin of=/dev/sdb seek=1
dd bs=512 iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdb seek=49

或者使用修改后的mktq210spl:
#!/bin/sh
./mktq210spl u-boot.bin bl1.bin
dd bs=512 iflag=dsync oflag=dsync if=bl1.bin of=/dev/sdb seek=1
dd bs=512 iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdb seek=49


阅读(1951) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~