13846|36

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

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

 
本帖最后由 yuanlai2010 于 2014-7-14 08:19 编辑

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

参与Helper2416开发板助学计划心得
07-14 应网友要求 已附上源码包 欢迎下载
游客,如果您要查看本帖隐藏内容请回复

直接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的一篇文档 CHxx_IROM_ApplicationNote_Rev0.2_080618.pdf (201.7 KB, 下载次数: 49) 中截取的,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. 以下 SD/MMC 的卡的存储结构
  11. SD/MMC 1Block = 512 Byte
  12. =========================================================================================
  13. |                                    SD/MMC Device                                      |
  14. =========================================================================================
  15. |                  | Recommendation |                    Mandatory                      |
  16. | User File System |=====================================================================
  17. |                  | Kernel |  BL2  | BL1(8K)  | Signature(512Byte) | Reserved(512Byte) |
  18. |                  |        |       | 16 Block |       1 Block      |     1 Block       |
  19. =========================================================================================
  20. *****************************************************************************************/
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <stdlib.h>

  24. #define BUFSIZE                 (8*1024)
  25. #define IMG_SIZE                (8*1024)

  26. int main (int argc, char *argv[])
  27. {
  28.         FILE                        *in_fp,        *out_fp;
  29.         char                        *Buf, *tmp;
  30.         int                                BufLen,        nbytes, fileLen;
  31.         unsigned int        count;
  32.         
  33.         // 1. 判断是否是三个参数(mkbl1 <source file> <destination file>)
  34.         if (argc != 3)
  35.         {
  36.                 printf("Usage: mkbl1 <source file> <destination file>\n");
  37.                 return -1;
  38.         }

  39.         // 2. 分配8K的buffer
  40.         BufLen = BUFSIZE;
  41.         Buf = (char *)malloc(BufLen);
  42.         if (!Buf)
  43.         {
  44.                 printf("Alloc buffer failed!\n");
  45.                 return -1;
  46.         }

  47.         memset(Buf, 0x00, BufLen);

  48.         // 3. 读源bin到buffer
  49.         // 3.1 打开源bin
  50.         in_fp = fopen(argv[1], "rb");
  51.         if( in_fp == NULL)
  52.         {
  53.                 printf("source file open error\n");
  54.                 free(Buf);
  55.                 return -1;
  56.         }
  57.         // 3.2 获取源bin长度
  58.         fseek(in_fp, 0L, SEEK_END);
  59.         fileLen = ftell(in_fp);
  60.         fseek(in_fp, 0L, SEEK_SET);
  61.         // 3.3 源bin长度不得超过8K
  62.         count = (fileLen < IMG_SIZE)
  63.                 ? fileLen : IMG_SIZE;
  64.         // 3.4 读源bin到buffer
  65.         nbytes = fread(Buf, 1, count, in_fp);
  66.         if ( nbytes != count )
  67.         {
  68.                 printf("source file read error\n");
  69.                 free(Buf);
  70.                 fclose(in_fp);
  71.                 return -1;
  72.         }
  73.         fclose(in_fp);

  74.         // 4. 拷贝buffer中的内容到目的bin
  75.         // 4.1 打开目的bin
  76.         out_fp = fopen(argv[2], "wb");
  77.         if (out_fp == NULL)
  78.         {
  79.                 printf("destination file open error\n");
  80.                 free(Buf);
  81.                 return -1;
  82.         }
  83.         // 4.2 将8k的buffer拷贝到目的bin中
  84.         tmp = Buf;
  85.         nbytes        = fwrite( tmp, 1, BufLen, out_fp);
  86.         if ( nbytes != BufLen )
  87.         {
  88.                 printf("destination file write error\n");
  89.                 free(Buf);
  90.                 fclose(out_fp);
  91.                 return -1;
  92.         }

  93.         free(Buf);
  94.         fclose(out_fp);

  95.         return 0;
  96. }
复制代码

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. %.o : %.c
  10.         arm-linux-gcc -o $@ [        DISCUZ_CODE_211        ]lt; -c
  11.         
  12. clean:
  13.         rm -f  mk2416sdbin led_on.elf led_on_elf.dis *.bin *.o
复制代码
附上昨天的led_on.S
  1. @******************************************************************************
  2. @ File:led_on.S
  3. @ 功能:LED点灯程序,关闭看门狗,点亮D8
  4. @******************************************************************************   
  5. .text
  6. .global _start
  7. _start:
  8.                 LDR                R0,        =0x53000000                @R0设为WTCON寄存器
  9.                 LDR                R1, [R0]                        @把WTCOM寄存器的值读入到R1
  10.                 BIC                R1,        R1, #0x01                @清除最低位
  11.                 STR                R1,        [R0]                        @把值写入WTCON寄存器关闭看门狗
  12.                         

  13.                 LDR                R0,        =0x4c000034                @R0设为PCLKCON 寄存器
  14.                 LDR                R1, =0xffffffff               
  15.                 STR                R1,        [R0]                        @把值写入PCLKCON寄存器开启所有PHB上的外设时钟
  16.                         
  17.                 LDR     R0,        =0x56000010                @ R0设为GPBCON寄存器。此寄存器
  18.                                                                                 @ 用于选择端口B各引脚的功能:
  19.                                                                                 @ 是输出、是输入、还是其他
  20.                 MOV     R1,        #0x00000004        
  21.                 STR     R1,        [R0]            @ 设置GPB1为输出口, 位[3:2]=0b01
  22.             
  23.                 LDR     R0,        =0x56000014     @ R0设为GPBDAT寄存器。此寄存器
  24.                                                                                 @ 用于读/写端口B各引脚的数据
  25.                 MOV     R1,        #0x00000000     @ 此值改为0x00000002,
  26.                                                                                 @ 可让D8熄灭
  27.                 STR     R1,        [R0]            @ GPB5输出0,D8点亮
  28.                         
  29. MAIN_LOOP:
  30.                 B       MAIN_LOOP
  31.                         
  32. .end
复制代码

编译运行后生成app.bin  按我上一篇帖子的方法直接烧写到SD卡就可以lo!


在此感谢BOSS昨天的指点!
不知道我的帖子什么时候能加精啊

论坛ID:yuanlai2010

发表时间:2014-07-11








最新回复

开发板助学计划心得  详情 回复 发表于 2015-11-9 19:57

赞赏

2

查看全部赞赏

点赞 关注

回复
举报

44

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
感谢分享哈。楼主辛苦。
 
个人签名刚开始学习飞行的菜鸟一只。。。
 

回复

43

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
看到你发了好多帖子了。。我的班子才从到。。。还没去拿快递呢,,,求指导啊

点评

急什么,对于你来说,分分钟超神的,期待你的分享,好让我跟着你的步伐前进啊!  详情 回复 发表于 2014-7-13 19:16
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

4
 
kctime 发表于 2014-7-13 19:06
看到你发了好多帖子了。。我的班子才从到。。。还没去拿快递呢,,,求指导啊

急什么,对于你来说,分分钟超神的,期待你的分享,好让我跟着你的步伐前进啊!
 
 
 

回复

43

帖子

0

TA的资源

一粒金砂(中级)

5
 
那你先用linux把那个该死的独显关掉吧。
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

6
 
本帖最后由 sdwuyawen 于 2014-7-13 21:50 编辑

刚接触arm9,一步一步跟着楼主的帖子学的。。这个的Makefile没看懂,楼主是不是粘出来乱码了?我抄了一个这样的,好像能make,希望楼主指点一下。



点评

建议你可以先去看下有关makefile有关的文档…比如GNU MAKE……我明天把有关资料都贴出来……你可以下载下来看看……不懂得咱们再一起探讨……其实我也是初学者  详情 回复 发表于 2014-7-13 23:52
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

7
 
晕,我粘出来也不对了。重新试一下。
  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
复制代码
 
 
 

回复

1461

帖子

1

TA的资源

纯净的硅(中级)

8
 
我试了楼主的代码发现好像是有乱码还是啥的原因,make就各种报错,楼主能分享下led-on.s这个文件吗?

点评

嗯嗯……可以……我也不知道是什么原因……代码贴出来总是有乱码………现在电脑在实验室………明天我再把工程打包贴上来吧  详情 回复 发表于 2014-7-13 23:47
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

9
 
shihuntaotie 发表于 2014-7-13 23:27
我试了楼主的代码发现好像是有乱码还是啥的原因,make就各种报错,楼主能分享下led-on.s这个文件吗?

嗯嗯……可以……我也不知道是什么原因……代码贴出来总是有乱码………现在电脑在实验室………明天我再把工程打包贴上来吧
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

10
 
sdwuyawen 发表于 2014-7-13 21:48
刚接触arm9,一步一步跟着楼主的帖子学的。。这个的Makefile没看懂,楼主是不是粘出来乱码了 ...

建议你可以先去看下有关makefile有关的文档…比如GNU MAKE……我明天把有关资料都贴出来……你可以下载下来看看……不懂得咱们再一起探讨……其实我也是初学者
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(中级)

11
 
正在进行这一步,上来学习经验
 
 
 

回复

1万

帖子

16

TA的资源

版主

12
 
谢谢分享,顶一下
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

13
 
看看,学习下
 
 
 

回复

65

帖子

2

TA的资源

一粒金砂(中级)

14
 
看看
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

15
 
mark
 
 
 

回复

26

帖子

1

TA的资源

一粒金砂(中级)

16
 
大神啊,发现好多问题都能在你的帖子里面找到答案啊

点评

不敢当,因为我们走着同样的道路,只不过我比你早接触几天而已,一起学习啦  详情 回复 发表于 2014-7-18 16:32
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

17
 
lyp260846137 发表于 2014-7-18 16:30
大神啊,发现好多问题都能在你的帖子里面找到答案啊

不敢当,因为我们走着同样的道路,只不过我比你早接触几天而已,一起学习啦
 
 
 

回复

496

帖子

18

TA的资源

一粒金砂(高级)

18
 
谢谢分享!顶!
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

19
 
支持一个感谢楼主分享
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

20
 
过来学习些经验
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表