您的位置:首页 > 其它

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

2010-02-03 16:27 141 查看
最近需要让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中)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: