S3C2440移植uboot过程全解+移植记录
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、Uboot移植前的准备
1、修改makefile、配置文件
在配置文件之前,需要修改makeflie相关内容:修改如下:
(1)修改编译器,这里我们的makefile已经设置为arm-linux-无需再修改,如下所示:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
Endif
(2)添加fl2440的配置项,如下所示:
fl2440_config:unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t fl2440 step s3c24x0
注意:在添加的fl2440_config的第二行,必须以Table开头,不能有任何多余的符号,否则极易导致编译错误。
Uboot支持多种处理器和平台,在编译uboot之前需要对其进行配置,使其支持我们自己的开发平台。在执行编译make之前,需要进行配置即make fl2440_config。通过查看顶层目录的makeflie文件,通过以下语句:MKCONFIG := $(SRCTREE)/mkconfig得出实际执行的命令为:
./mkconfig fl2440 arm arm920t fl2440 step s3c24x0
执行完这句后,产生如下结果:
(1)开发板名称为fl2440;
(2)将include中的头文件连接到同平台相关的头文件中,这里的连接为:
asm->asm-arm
arch->arch-s3c24x0
proc->proc-armv
(3)创建顶层Makefile包含的文件inclued/config.mk,该文件内容如下
ARCH = arm
CPU = arm920t
BOARD = fl2440
VENDOR = step
SOC = s3c24x0
(4)创建开发板相关头文件include/config.h,该文件中包含了对开发板的相关配置,如下所示:
#include
从上面可以知道,在将uboot配置为适合自己的平台的时候,需要在路径/include/configs下添加配置头文件fl2440.h。这里我们修改/include/configs/sbc2410x.h的文件名为fl2440.h,并在头文件中加入以下内容:#define CONFIG_FL2440 1/* on a FL2440 Board */
#define CONFIG_S3C2440 1/* specifically a SAMSUNG S3C2440 SoC*/
打开fl2440.h,里面有两类宏,一类前缀应该是CONFIG_,这类宏用于选择CPU、SOC、系统时钟、选择设备驱动等;另一类前缀是CFG_,这类宏用于设置参数,例如malloc大小等。
2、创建board级文件
在Board目录中添加step目录,注意此step目录要和Makefile的fl2440_config 下的step名字保持一致。在step中建立fl2440目录,并将Board目录中的sbc2410x 目录中的所有文件复制到fl2440目录中。修改fl2440目录中sbc2410x.c为fl2440.c.
修改fl2440目录下的Makefile文件,将
COBJS:= sbc2410x.o flash.o
修改为:COBJS:= fl2440.o flash.o
至此,配置过程完成。配置的目的是通过设置相关参数、链接相关头文件,使得uboot适合我们的开发平台。
3、uboot编译、链接过程
Uboot的编译最终生成的u-boot.bin二进制文件,生成u-boot.bin的依赖关系由makefile指定,通过分析makefile可以得到两点:
(1)u-boot第一个执行的文件是start.s;
(2)如何链接各个文件生成的.o文件,由/board/step/fls2240中的U-boot.lds 和config.mk决定。
U-Boot的编译流程为:首先编译cpu/$(CPU)/start.S,对于不同的CPU,还可能编译cpu/$(CPU)下的其他文件。然后,对于平台/开发板相关的每个目录、每
个通用目录都使用它们各自的Makefile生成相应的库。将前面两步生成的.o、.a 文件按照board/$(BOARDDIR)/config.mk文件中指定的代码段起始地址、board/$(BOARDDIR)/U-Boot.lds连接脚本进行连接得到ELF格式的U-Boot,后面Makefile还会将它转换为二进制格式、S-Record格式。这部分具体可以参考《嵌入式linux应用开发完全手册》第十五章内容15.2.3。
到此修改构成一个段落,此处的修改只是构建了fl2440开发板的框架,其核心的东西还是sbc2410x的,下文会进行深层次的修改。不过在这里,要首先,测试配置和编译一下,检测我们的框架是否搭建合理。
# make fl2440_config
Configuring for FL2440 board...
# make
如果没有错误,则执行make distclean 和make clean将编译的文件清空。如果有错误,则查看上面的步骤,是否处理正确
二、Uboot第一阶段分析
1、uboot第一阶段作用
Uboot第一阶段主要完成硬件设备初始化、为加载Bootloader的第二阶段代码准备RAM空间、代码重定向、为调用C语言准备好堆栈空间。
硬件设备初始化依次完成如下设置:将CPU的工作模式设为管理模式(svc),关闭WATCHDOG,设置FCLK、HCLK、PCLK的比例(即设置CLKDIVN寄存器),关闭MMU、CACHE,代码都在cpu/arm920t/start.S中。
所谓准备RAM空间,就是初始化内存芯片,使它可用。对于S3C2410/S3C2440,通过在start.S 中调用lowlevel_init 函数来设置存储控制器,使得外接的SDRAM 可用,代码在board/step/fl2440/lowlevel_init.S中。
代码重定向是将bootloader代码从nand flash中读取出来放到sdram的指定地址中,这里指定的地址为0x33f80000。
准备堆栈空间实际就是设置全局参数空间、malloc空间、指定堆栈指针,清空bss段等内容
2、第一阶段代码分析