[原创] Helper2416-08——裸机第二弹——制作可从SD卡启动的bin文件(附上源码包)

yuanlai2010   2014-7-11 11:31 楼主

 

裸机第二弹——制作可从SD卡启动的bin文件

 

 

参与Helper2416开发板助学计划心得

 

 
07-14 应网友要求 已附上源码包 欢迎下载
okhxyyo,如果您要查看本帖隐藏内容请回复
直接make就行了

 

在上一篇帖子裸机第一弹——点亮LED+SD启动中为了让直接编译生成的bin文件可以从SD卡运行,我是使用网友分享的一个小软件把bin文件处理了一下,但是有点麻烦。所以今天就为大家分享一下我自己编写的这C程序,在mekefile里面调用它来生成可直接在SD启动的bin文件,那是相当的方便!

 

 

首先讲解下原理:

 

 

在BL0阶段,IROM内固化的代码读取SD卡内特定位置的8K内容(BL1),
IROM_Fusing_tools从TOTAL_SECTOR – 2 - SIZE_OF_IMAGE/512扇区开始烧写;
其中TOTAl_SECTOR是这个磁盘总的扇区数目,它是通过读取磁盘的MBR扇区判断是否为FAT32格式然后获得
TOTAl_SECTOR的(这也是为什么SD卡必须为FAT32格式),
SIZE_OF_IMAGE/512是这个bin文件将要占据的扇区数
(这里是以
512Byte为扇区大小的,如果SD卡的扇区大小非512Byte,就需要重新计算和修改程序了)

以下是 SD/MMC 的卡的存储结构 从6410的一篇文档中截取的,2416同样适用。
SD/MMC 1Block = 512 Byte



在SD启动方式下,S3C2416内部的IROM程序BL0首先运行,并将SD中的最后18个扇区开始的16个扇区内容复制到片内 的8K SRAM,也就是SteppingStone,接着跳转到这块SRAM的开始地址开始运行,现在玩裸机的话程序暂时没超过8K 就先让它在SteppingStone运行就行,后续使用上SDRAM就可运行更大的程序了。所以就先让我们的裸机程序放在这8K里面咯!
附上源码及重新编写的makefile文件
mk2416sdbin.c
  1. /***************************************************************************************
  2. 文件:mk2416sdbin.c
  3. 作者:yuanlai2010
  4. 版本:2014-07-11
  5. NOTE:
  6. 在BL0阶段,Irom内固化的代码读取SD卡内特定位置的8K内容(BL1),
  7. IROM_Fusing_tools从TOTAL_SECTOR – 2 - SIZE_OF_IMAGE/512扇区开始烧写;
  8. 其中TOTAl_SECTOR是这个磁盘总的扇区数目;SIZE_OF_IMAGE/512是这个bin文件将要占据的扇区数
  9. (这里是以512为扇区大小的)
  10.  
  11. 以下 SD/MMC 的卡的存储结构
  12. SD/MMC 1Block = 512 Byte
  13. =========================================================================================
  14. |                                    SD/MMC Device                                      |
  15. =========================================================================================
  16. |                  | Recommendation |                    Mandatory                      |
  17. | User File System |=====================================================================
  18. |                  | Kernel |  BL2  | BL1(8K)  | Signature(512Byte) | Reserved(512Byte) |
  19. |                  |        |       | 16 Block |       1 Block      |     1 Block       |
  20. =========================================================================================
  21. *****************************************************************************************/
  22. #include
  23. #include
  24. #include
  25.  
  26. #define BUFSIZE                 (8*1024)
  27. #define IMG_SIZE                (8*1024)
  28.  
  29. int main (int argc, char *argv[])
  30. {
  31.         FILE                        *in_fp,        *out_fp;
  32.         char                        *Buf, *tmp;
  33.         int                                BufLen,        nbytes, fileLen;
  34.         unsigned int        count;
  35.         
  36.         // 1. 判断是否是三个参数(mkbl1
  37.         if (argc != 3)
  38.         {
  39.                 printf("Usage: mkbl1 \n");
  40.                 return -1;
  41.         }
  42.  
  43.         // 2. 分配8K的buffer
  44.         BufLen = BUFSIZE;
  45.         Buf = (char *)malloc(BufLen);
  46.         if (!Buf)
  47.         {
  48.                 printf("Alloc buffer failed!\n");
  49.                 return -1;
  50.         }
  51.  
  52.         memset(Buf, 0x00, BufLen);
  53.  
  54.         // 3. 读源bin到buffer
  55.         // 3.1 打开源bin
  56.         in_fp = fopen(argv[1], "rb");
  57.         if( in_fp == NULL)
  58.         {
  59.                 printf("source file open error\n");
  60.                 free(Buf);
  61.                 return -1;
  62.         }
  63.         // 3.2 获取源bin长度
  64.         fseek(in_fp, 0L, SEEK_END);
  65.         fileLen = ftell(in_fp);
  66.         fseek(in_fp, 0L, SEEK_SET);
  67.         // 3.3 源bin长度不得超过8K
  68.         count = (fileLen < IMG_SIZE)
  69.                 ? fileLen : IMG_SIZE;
  70.         // 3.4 读源bin到buffer
  71.         nbytes = fread(Buf, 1, count, in_fp);
  72.         if ( nbytes != count )
  73.         {
  74.                 printf("source file read error\n");
  75.                 free(Buf);
  76.                 fclose(in_fp);
  77.                 return -1;
  78.         }
  79.         fclose(in_fp);
  80.  
  81.         // 4. 拷贝buffer中的内容到目的bin
  82.         // 4.1 打开目的bin
  83.         out_fp = fopen(argv[2], "wb");
  84.         if (out_fp == NULL)
  85.         {
  86.                 printf("destination file open error\n");
  87.                 free(Buf);
  88.                 return -1;
  89.         }
  90.         // 4.2 将8k的buffer拷贝到目的bin中
  91.         tmp = Buf;
  92.         nbytes        = fwrite( tmp, 1, BufLen, out_fp);
  93.         if ( nbytes != BufLen )
  94.         {
  95.                 printf("destination file write error\n");
  96.                 free(Buf);
  97.                 fclose(out_fp);
  98.                 return -1;
  99.         }
  100.  
  101.         free(Buf);
  102.         fclose(out_fp);
  103.  
  104.         return 0;
  105. }
  106.  
复制代码

makefile
  1. led_on.bin : led_on.o
  2.         arm-linux-ld -Ttext 0x40000000 -o led_on.elf $^
  3.         arm-linux-objdump -D led_on.elf > led_on_elf.dis
  4.         arm-linux-objcopy -O binary -S led_on.elf led_on.bin
  5.         gcc mk2416sdbin.c -o mk2416sdbin
  6.         ./mk2416sdbin led_on.bin app.bin
  7. %.o : %.S
  8.         arm-linux-gcc -o $@ [        DISCUZ_CODE_211        ]lt; -c
  9.  
  10. %.o : %.c
  11.         arm-linux-gcc -o $@ [        DISCUZ_CODE_211        ]lt; -c
  12.         
  13. clean:
  14.         rm -f  mk2416sdbin led_on.elf led_on_elf.dis *.bin *.o
复制代码

 

提示词:如果您需要查看本帖隐藏内容,请登录或者注册

回复评论 (36)

2推荐 ccgzkr 

感谢分享哈。楼主辛苦。
刚开始学习飞行的菜鸟一只。。。
点赞  2014-7-21 09:25
看到你发了好多帖子了。。我的班子才从到。。。还没去拿快递呢,,,求指导啊
点赞  2014-7-13 19:06
引用: kctime 发表于 2014-7-13 19:06
看到你发了好多帖子了。。我的班子才从到。。。还没去拿快递呢,,,求指导啊

急什么,对于你来说,分分钟超神的,期待你的分享,好让我跟着你的步伐前进啊!
点赞  2014-7-13 19:16
那你先用linux把那个该死的独显关掉吧。
点赞  2014-7-13 19:25
刚接触arm9,一步一步跟着楼主的帖子学的。。这个的Makefile没看懂,楼主是不是粘出来乱码了?我抄了一个这样的,好像能make,希望楼主指点一下。 本帖最后由 sdwuyawen 于 2014-7-13 21:50 编辑
点赞  2014-7-13 21:48
晕,我粘出来也不对了。重新试一下。
  1. led_on.bin : led_on.o
  2.         arm-linux-ld -Ttext 0x40000000 -o led_on.elf $^
  3.         arm-linux-objdump -D led_on.elf > led_on_elf.dis
  4.         arm-linux-objcopy -O binary -S led_on.elf led_on.bin
  5.         gcc mk2416sdbin.c -o mk2416sdbin
  6.         ./mk2416sdbin led_on.bin app.bin
  7. %.o : %.S
  8.         arm-linux-gcc -o $@ -c $<

  9. %.o : %.c
  10.         arm-linux-gcc -o $@ -c $<
  11.         
  12. clean:
  13.         rm -f  mk2416sdbin led_on.elf led_on_elf.dis *.bin *.o
点赞  2014-7-13 21:50
我试了楼主的代码发现好像是有乱码还是啥的原因,make就各种报错,楼主能分享下led-on.s这个文件吗?
点赞  2014-7-13 23:27
引用: shihuntaotie 发表于 2014-7-13 23:27
我试了楼主的代码发现好像是有乱码还是啥的原因,make就各种报错,楼主能分享下led-on.s这个文件吗?

嗯嗯……可以……我也不知道是什么原因……代码贴出来总是有乱码………现在电脑在实验室………明天我再把工程打包贴上来吧
点赞  2014-7-13 23:47
引用: sdwuyawen 发表于 2014-7-13 21:48
刚接触arm9,一步一步跟着楼主的帖子学的。。这个的Makefile没看懂,楼主是不是粘出来乱码了 ...

建议你可以先去看下有关makefile有关的文档…比如GNU MAKE……我明天把有关资料都贴出来……你可以下载下来看看……不懂得咱们再一起探讨……其实我也是初学者
点赞  2014-7-13 23:52
正在进行这一步,上来学习经验
点赞  2014-7-14 10:28
谢谢分享,顶一下
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2014-7-15 06:12
看看,学习下
点赞  2014-7-15 21:44
看看
点赞  2014-7-16 16:12
mark
点赞  2014-7-17 23:37
大神啊,发现好多问题都能在你的帖子里面找到答案啊
点赞  2014-7-18 16:30
引用: lyp260846137 发表于 2014-7-18 16:30
大神啊,发现好多问题都能在你的帖子里面找到答案啊

不敢当,因为我们走着同样的道路,只不过我比你早接触几天而已,一起学习啦
点赞  2014-7-18 16:32
谢谢分享!顶!
点赞  2014-7-19 11:07
支持一个感谢楼主分享
点赞  2014-7-20 22:24
过来学习些经验
点赞  2014-7-21 19:06
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复