一、一级启动bootstrap和二级启动u-boot内存地址
1、一级启动代码Bootstrap修改的文件在Bootstrap-v1.16\board\at91sam9261ek\nandflash目录下的at91sam9261ek.h中的(在项目程序中未作修改)
#define IMG_ADDRESS 0x20000 /* Image Address in NandFlash */
#define IMG_SIZE 0x40000 /* Image Size in NandFlash */
IMG_ADDRESS为Uboot在Nandflash中存放的起始地址,IMG_SIZE为文件大小,单位为KB,根据实际情况设定。
另外添加了支持的Nandflash的信息在Bootstrap-v1.16\include目录下的nand_ids.h文件中的
{0xecF1, 0x400, 0x20000, 0x800, 0x40, 0x0, "K9F1G08U0B\0"},
具体意义见Bootstrap-v1.16\include目录下的nandflash.h中的介绍
Bootstrap编译过程:在Bootstrap-v1.16\board\at91sam9261ek\nandflash目录下有个makefile文件,只需用gcc编译工具(本程序是在Cygwin环境下)make目录中的makefile文件即可在当前文件下生成所需的可执行文件,然后用SAM-BA工具烧写到Nandflash中(具体方法在此不做说明)。
2、Uboot修改的文件在u-boot-1.3.4\include\configs目录下的at91sam9261ek.h文件中的
#undef CFG_USE_DATAFLASH_CS0
/*#undef CFG_USE_NANDFLASH */
#define CFG_USE_NANDFLASH 1
和
#define CFG_ENV_IS_IN_NAND 1
#define CFG_ENV_OFFSET 0x60000
#define CFG_ENV_OFFSET_REDUND 0x80000
#define CFG_ENV_SIZE 0x20000 /* 1 sector = 128 kB */
#define CONFIG_BOOTCOMMAND "nand read 0x22000000 0xa0000 0x200000; bootm"
CFG_ENV_OFFSET和CFG_ENV_OFFSET_REDUND为存放uboot环境变量的起始地址,大小为0x20000。从0xa0000为应用程序代码存放的起始地址,大小为0x200000。
编译过程:修改完以上环境变量后,在根用户下进入到u-boot-1.3.4目录执行以下命令
[root@localhost u-boot-1.3.4]#make distclean
[root@localhost u-boot-1.3.4]# make at91sam9261ek_config
Configuring for at91sam9261ek board...
[root@localhost u-boot-1.3.4]#make
然后等待编译完成,需要一段时间,编译完成后在u-boot-1.3.4文件目录下就会生成u-boot.bin文件
然后通过SAM-BA烧写到Nandflash中。
二、开发过程中遇到的问题以及解决实例
1、 开发板提供的Bootstrap的源代码中,会有提示这个版本的Bootstrap可以支持的有哪些类型的开发板,其实这个代码是可以在官网上下载的,只不过不同版本可能支持的开发板类型有所不同。在编译Bootstrap前一般首先配置这个板子的文件,这个配置也就申明了和这款开发板相关的基本配置。当第一条make at91sam9g45ekes_nandflash_config这个命令执行后,在include/config.mk文件里的东西就是板子配置好的默认信息。信息中汇说明你的板子类型和架构类型。
2、 但是自我觉得u-boot和bootstrap结合的部分肯定有地址映射部分,u-boot在最终编译好的bin文件,里面在内存的地址映射是写死的,如果在编译u-boot的时候指定配置文件的话(比如上边的就是指定的文件),在make进行编译的时候会根据这个这个配置文件加载编译,这里可以举一个例子来说明。
u-boot中board/atmel目录是说明板子的类型。在board/atmel目录下的文件目录有支持的各种板子类型(可能是根据CPU类型规定的),这里的每一个目录都是一种板子的类型,假如使用的开发板类型就是at91sam9m10g45ek,这个目录里有congfig.mk文件,这个文件只用一行,就是TEXT_BASE = 0X73F00000.这个就是在编译好u-boot之后,在u-boot.map文件里说明的地址映射。这个映射时一定要和bootstrap保持一致的。如果修改这个文件里的内容,修改基址地址,再重新编译,在u-boot.map文件里的映射地址就会修改。
3、 关于这个地址:这个地址是内存的地址,比如在bootstrap启动之后,会到内存的某个地址找u-boot进行启动u-boot,这个地址说明的就是内存地址,这两个地址一定要吻合才能正确启动,也就是bootstrap中指定bootloader到内存的某个地址寻找u-boot和u-boot中的TEXT_BASE指定的将来存放到内存的某个地址。两个地址不吻合时不能启动成功。为了使两个地址吻合,也就产生了谁去迁就谁的问题。可以让bootstrap修改去迁就u-boot但是有的开发板上的bootstrap是从官网上下载的编译好的程序,没办法修改,同时也不知道在哪里修改,但是如果知道这个bootstrap想从内存的哪个地址启动u-boot,可以修改u-boot的内容,按照指定的手册操作后便可以启动,比如这个地址是0x73f00000,但是开发板上的u-boot上指定的映射地址是0x77f00000,所以修改了上述文件里的地址再从新编译后,在u-boot.map文件中,映射地址便为0x73f00000。对于两个文件的地址吻合问题,只要是相互对应即可,可以修改u-boot代码内容,也可以修改bootstrap代码中的内容。
4、 在bootstrap源代码中,可以找到与u-boot相互对应的映射地址,在bootstrap目录下,在和开发板相关的配置目录下有和这些相关的配置信息。
在这个配置文件中,一般都有下面这几项信息。从手册参考这个定义可得知:
IMG_ADDRESS0X20000 是u-boot在nandflash中的位置,从nandflash的这个位置开始,u-boot的大小为 IMG_SIZE 0X40000
下面是LOGO_SIZE 0X100000 是标志的大小(在实际应用上没有什么作用)
LOGO_ADDRESS 0Xa0000 是表示标志信息在nandflash中的地址
LOGO_RAM0X71000000 是映射到内存的地址
但是JUMP_ADDR 0X77F00000 是最终bootstrap跳转到的内存地址,从这个内存地址来启动u-boot。
所以,上述得知,关于这个地址映射问题,只要是两个部分的地址能够吻合便可以启动,bootstrap和u-boot的内存地址映射的定义在哪里都已经说明。