怎样把一段二进制编译到mtk的bin里面去

来源:互联网 发布:淘宝网账户冻结 编辑:程序博客网 时间:2024/05/16 00:46
最近需要让mtk在加电时把一个firmware的原原本本的download到我们芯片的指定位置中去,仔细分析了mtk的scattle和arm汇编后,发现可以采用如下方法实现。
 
mtk的sattle文件在costom/system中,在mak文件里的SYSGEN_ENABLE 宏代表是否自动产生sattle。
 
一.mtk系统中一般有一个连续的norflash空间和一片连续的sdram空间
所有的code当然事先都存入norflash里,到系统加电时有一些代码直接放在norflash上就地运行,而有些被搬到sdram中去运行
所以这样mtk系统中就有一个加载域和两个运行域(其中一个运行域就在nor上,而另外一个在sdram上)
 
 
ROM 0x00000000 0x00e00000  {
     ROM 0x00000000 0x00400000
     {
......
     }
     ROM2 +0x0 0x00400000
{
.......
 }
 
ROM3 +0x0 0x00400000
{
     .ANY (+RO-CODE)
}
ROM4 +0x0 0x00400000
{
         .ANY (+RO-CODE)
}
ROM5 +0x0 
{
      .ANY (+RO-DATA)
}
 
 INTSRAM_CODE 0xA0000000 0x7600
{
...
}
}
1.从MTK的Sattle文件看,mtk只有一个加载域,也就是最外层的那个大括号代表的域。
 注意0x00000000 代表加载域的起始地址,简化起见,以下我们都用Load_start表示 0x00e00000代表加载域的最高地址,以下我们用Load_end表示。加载域是指代码和数据在系统未运行,也就是没有加电时所存放的位置,一般指flash.
 
2.在最外层大括号里的每个大括号包裹的区域代表一个运行时域,例如: ROM2 +0x0 0x00400000 ;+0x0代表运行时域的起始址,以下我们都用RUNNING_START表示;而0x00400000代表运行时域的最高地址,我们用 RUNNING_END表示。运行时域是指代码和数据在真正运行时所在的位置。
 
3.如果一个运行域的位置就包含在加载域之中,也就是说RUNNING_START在 Load_start和Load_end之间,那么就说明,加载域和运行域重叠了。意思就是这块代码就直接在flash里面运行,而不必被搬到sdram 中去。如果运行时域的位置不在加载域之中的话,也就是说RUNNING_START不在Load_start和Load_end之间,那么就说明该代码在运行时必须由bootload搬移到sdram中去运行。
 
二.建立一个汇编文件,文件名为cmmb.s代码如下。
AREA    TEST, CODE, READONLY, ALIGN =2
INCBIN TEST.bin
END
 这样编译出来的目标文件叫cmmb.o
 
三.修改scattle file, 在其中的ROM4中添加 "cmmb.o (TEST)"
 
四.把test.bin拷贝到和这个汇编文件同一目录,编译后生成cmmb.o
在scattle文件中的任意ROMx的运行时域中添加 cmmb.o(TEST)
 
.在要去读取test.bin的代码中做如下声明
extern uint32 TEST[];
 
后续的代码可以通过TEST的标示符去访问test.bin里面的内容。
后续可以通过i2c,spi等等接口download
(注意,这段代表必须要确定是有机会调用的,否则编译器很可能在优化过程中不把cmmb.o中的TEST代码段link进image中)
原创粉丝点击