分类:
2012-02-11 13:55:59
原文地址:uboot笔记之第一阶段分析和移植 作者:gc5084
本文只对其中实现过程做简单记录的学习笔记。本节主要参考资料
1.uboot工作流程(网上找到资料,具体出处不明)
2.mini2440之uboot移植详细手册
首先从cpu/arm920t/start.S文件运行。对此文件进行分析。
Include的文件包括common.h 和config.h. 在makefile文件中的编译选项中已经指定了,搜索的默认目录,即顶层的include目录。
common.h文件包含的头文件如下:
等等
其他根据CONFIG项还会包含其他头文件.并且声明了许多.c文件的函数。config.h文件中的数据是由脚本生成。本例中包含如下两行
及configs/$(board ),而asm/config.h 中arm文件夹是连接文件夹,它已经连接到了asm-arm。
mini2440.h文件包含了所有板级CONFIG配置选项。注意这个文件是复制2410的所以将一些相应的选项改为2440的。asm/config.h文件 仅包含了一个配置项 #define CONFIG_RELOC_FIXUP_WORKS
接着看start.S文件,首先是一个中断向量表。然后在跳转到start_code,在set cup to svc mode这一段后面注视掉bl coloured_LED_init 和 bl red_LED_on这两行(点亮LED操作)。在接着注释语句turn off watch dog上面一行添加||defined(CONFIG_S3C2440),CONFIG_S3C2440项在configs/mini2440.h文件中定义出来。然后是中断掩码和CPU初始频率的设置,这个根据移植手册和芯片手册。代码正常启动(即不定义CONFIG_SKIP_LOWLEVEL_INIT)接着会跳转到cpu_init_crit。此函数完成,关闭cacha,关闭MMU相关,跳转到lowlevel_init。
lowlevel_init在board目录的lowlevel_init.S中,它主要将所有存储器控制寄存器的值初始化。这里找到SMRDATA标识的存储寄存器的数据表格,是用了SMRDATA和TEXT_BASE的差值,可以表示SMRDATA的偏移地址,因为差值是偏移地址,所以无论是在哪里运行,只要保证连接代码时这些代码是被连续连接在开始地址的就可以,代码:
本例lsd有如下部分:
详细看参考资料1。另外在移植手册中提到Jtag调试时会有bug,这是因为调试时是运行在内存中的,而上面的是相对于0x0地址的偏移地址,所以会错误,可以修改成如下代码:
而后relocate这段,查看开始开始地址是否和RAM加载地址TEXT_BASE相同。决定是否需要跳转过搬运代码到RAM这一段。
接着可以添加代码同时支持NOR FLASH和NAND FLASH,移植手册上是通过想0x4开始的地址写数据来判度,而似乎也可以使用这种方法 ”直接读BWSCON[2:1]的值是最简单快捷的方式,它们是由OM[1:0]决定的。而OM[1:0]的状态也就决定NAND或NOR“,资料1中又可以通过给0地址写入数据,nand flash是内部4k,所以可写,而nor flash不可以。因而有多种方法。 这部分稍后在分析。(但是有一个疑问,现在没有为C全局变量清BSS段,而直接跳到读nand flash等C语言函数中会不会有问题)
在这里首先使用了移植手册上的方法,手册中的代码设置了sp的值,BSS段的设置没有,但因为没有全局变量所以也没事。
nor flash中搬运代码则相对简单。norboot:标号处, _armboot_start定义为开始的向量表,它与bss_start的差值就是uboot代码的长度。
然后执行到stack_setup,设置堆栈指针sp,从TEXT_BASE开始减去#CONFIG_SYS_MALLOC_LEN区域和CONFIG_SYS_GBL_DATA_SIZE区域等,将sp指向所得到的地址。然后清除BSS段,再跳转到start_armboot,在lib_arm/board.c,进入第二阶段。内存地址图如下:
+发现+发现