分类: 嵌入式
2011-05-04 21:02:20
要跑操作系统免不了需要bootloader,我理解吧,bootloader这类的东西就是为操作系统准备一个好的启动环境,把什么内存啊、 网络都初始化好,让操作系统能够快乐的启动起来。嵌入式系统的硬件环境千变万化,嵌入式工程师常常要面对一个全新的硬件环境,而一个软件系统,往往就像一辆汽车,起步时是最艰难的,起步的好,各方面都初始化的合适,往后的运行就爽歪歪,否则,可能开了两步就熄火了。软件系统的起步就是bootloader,为了能够方便开发,使bootloader与操作系统分离,各公司、组织开发了许多bootloader,比如什么Windows里面用的ntloader、Linux桌面版用得比较多的grub、以及嵌入式系统里面的bootRom、redBoot和现在大红大紫的uboot。我们这篇文章要移植Vxwork,虽然有个官方推荐的bootRom,不过本人打算以后再弄,先学习一下uboot吧,毕竟资源比较多。
编一个helloworld程序交叉编译生成main,这个main是elf格式的,用objcopy生成二进制文件
- arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
再用TI提供的raw2coff转换为coff格式
- raw2coff 0xC1080000 main.out main
打开AisGen for D800K001这个软件,用默认设置,根据上面资料的提示生成main.ais这个ais可以烧到FLASH里面,可以用aisparse.exe 来解析main.ais的结构:
- unsigned int nvram_image[] = {
- /* 0x00000000 */ 0x41504954, // MAGIC 标示符
- /* 0x00000004 */ 0x5853590D, // Function Execute 初始化PLL
- /* 0x00000008 */ 0x00020000, // Function[0]
- /* 0x0000000C */ 0x18010104, // Arg[0]
- /* 0x00000010 */ 0x000601B9, // Arg[1]
- /* 0x00000014 */ 0x5853590D, // Function Execute 初始化SDRAM-EMIFB
- /* 0x00000018 */ 0x00040002, // Function[2]
- /* 0x0000001C */ 0x00018421, // Arg[0]
- /* 0x00000020 */ 0x10912A08, // Arg[1]
- /* 0x00000024 */ 0x70090005, // Arg[2]
- /* 0x00000028 */ 0x000003FA, // Arg[3]
- /* 0x0000002C */ 0x58535904, // Disable CRC
- /* 0x00000030 */ 0x58535901, // Section Load 加载一段DSP要执行的代码,初始化FLASH、开启ARM等等
- /* 0x00000034 */ 0x11800020, // Address
- /* 0x00000038 */ 0x00000340, // Size
- /* 0x0000003C */ // Data
- /* 0x0000003C */ 0x01BD14F6,
- /* 0x00000040 */ 0x00002000,
- ................省略
- /* 0x000003D4 */ 0x58535905, // Jump 执行刚刚加载的DSP代码
- /* 0x000003D8 */ 0x11800280, // Address
- /* 0x000003DC */ 0x58535901, // Section Load
- /* 0x000003E0 */ 0xC1080000, // Address 加载hello world代码到SDRAM
- /* 0x000003E4 */ 0x00001F47, // Size
- /* 0x000003E8 */ // Data
- /* 0x000003E8 */ 0x464C457F,
- /* 0x000003EC */ 0x00010101,
- /* 0x000003F0 */ 0x00000000,
- /* 0x000003F4 */ 0x00000000,
- /* 0x000003F8 */ 0x00280002,
- ...........................
- /* 0x00002330 */ 0x58535965, // ARM Entry Point 设定ARM程序入口
- /* 0x00002334 */ 0xC1080000, // Address
- /* 0x00002338 */ 0x58535901, // Section Load
- /* 0x0000233C */ 0x11800000, // Address 加载DSP代码为原地踏步
- /* 0x00002340 */ 0x00000020, // Size
- /* 0x00002344 */ // Data
- /* 0x00002344 */ 0x0001E000,
- /* 0x00002348 */ 0x00000012,
- /* 0x0000234C */ 0x00008000,
- /* 0x00002350 */ 0x00000000,
- /* 0x00002354 */ 0x00000000,
- /* 0x00002358 */ 0x00000000,
- /* 0x0000235C */ 0x00000000,
- /* 0x00002360 */ 0x00000000,
- /* 0x00002364 */ 0x58535906, // Jump N Close 结束,交出执行权
- /* 0x00002368 */ 0x11800000, // Address
- };
这个工具可以说非常方便,但是有一些帖子反映新版本的RBL(D800K003)及工具对ARM的启动支持有问题,貌似很多机制发生了变化。这个放到后面再深入探讨吧。以下是乱七八糟的参考资料:http://hi.baidu.com/614/blog/item/d630e7c11b5762db38db4965.html