标题:
Uboot在S3C2440上的移植
[打印本页]
作者:
yuyang911220
时间:
2015-2-26 14:46
标题:
Uboot在S3C2440上的移植
摘 要:
通过分析Uboot的文件结构及其启动流程,详细给出了Uboot在基于ARM920T开发板上的移植方案,包括编译、调试全过程,最终能够在Uboot命令方式下加载映像文件,完成Linux内核与yaffs映像文件的调试,具有Bootloader移植的通用性。
关键词:
Uboot; S3C2440; ARM920T; 引导过程; 启动代码
1 Uboot移植环境准备
1.1 移植平台的硬件组成
硬件平台是ARM9的体系结构,ARM920T的CPU, SOC芯片是三星的S3C2440,支持Nand Flash与Nor Flash的可选启动方式,其主要硬件资源如表1所示[1]。
支持Nand Flash与Nor Flash启动,可以通过跳线来选择启动方式。Nand Flash启动时,最开始4 KB数据被硬拷贝到内部Boot Internal SRAM,且被映射到nGCS0的片选空间0x0000,0000—0x0800,0000;Nor Flash方式启动时,它直接被映射到nGCS0的片选空间。所以,在Uboot移植时,要考虑将Uboot烧写到Nor flash上还是Nand Flash上。
1.2 Uboot工作原理
Uboot的整体结构如图1所示。
从图1可以看出,这种分层结构的Uboot分模块化了,给移植带来了很大的方便。由于协议层与应用层是与目标硬件无关的,因此移植工作主要集中在物理层和驱动层上面的修改。而Uboot支持串口下载、网络下载,并提供了很多交互式命令。整个Uboot编译、连接过程如下:
(1)创建编译环境
在MAKEFILE中会调用根目录下的mkconfig文件,如下:
MKCONFIG:= $(SRCTREE)/mkconfig
qq2440v3_config:unconfig
@$(MKCONFIG)$(@:_config=)arm ARM920T qq2440v3 NULL s3c24x0
Mkconfig文件引用传入的参数$1=qq2440v3、$2=arm、$3=arm920t、$4=qq2440v3、$5=NULL、$6=s3c24x0,流程如图2所示。
(2)编译流程
编译流程如图3所示。
最终生成内存映像图文件U-boot.map和可执行二进制映像elf文件U-boot[2],可以直接将生成的U-boot下载到SDRAM来单步调试。
2 Uboot的移植操作
2.1存储器映射与存储器重映射
存储器映射,实现了统一编址,方便了程序在32 bit寻址(4 GB寻址空间)的范围内能够寻址到任意的物理存储区。
S3C2440芯片不带片内Flash,带片内4 KB的SRAM,被映射到了0x4000_0000~0x4000_1000的地址空间,外部的SDRAM被映射到bank6,网卡被映射到bank3,Flash被映射到bank0。
由于Uboot是上电后就运行,因此需要将代码定位在Flash从0x0000_0000的上电入口处。为了提高系统加载速度并且实现在线编程功能,需要将整个Uboot从Flash中搬到RAM运行,即代码从定位,将整个代码定位到SDRAM的0x3300_0000之后,来作为其实际的运行地址,具体如图4所示。
2.2 配置主机运行环境
Uboot与Linux系统密切相关,笔者在RH Linux的虚拟机中搭建了整个运行环境,采用的是2.2.4的Linux内核,arm-linux-gcc-3.4.1的交叉编译工具[3],需要在/root/.bashrc文件中做一下交叉编译工具路径的声明,即加上如下一句:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
保存并退出,在终端下输入“arm-linux-gcc-version”并回车,如果能看到输出版本信息为3.4.1,则代表路径设置正确,交叉编译工具链已经成功安装。
2.3 修改CPU相关代码
在调试Uboot时,如果每次都将二进制映像烧录到Flash中,不仅需要等待,而且操作麻烦,本文是在调试阶段将二进制映像直接烧录到外部存储器SDRAM中,然后直接从该处运行,这样直接在内存中运行,可以很方便地完成Uboot调试。
Uboot启动的第一阶段,从.\cpu\arm920t\start.s开始执行,依次完成关闭看门狗、关闭中断、设置CPU分频比、初始化SDRAM、代码重定位、设置堆栈,最后跳转到C函数的入口点。当在SDRAM中调试时,内存的初始化已经预先完成了,因此不需要初始化SDRAM和代码重定位的功能。
在.\include\configs\qq2430.h添加宏定义define CONFIG_SKIP_LOWLEVEL_INIT,就会跳过cpu_init_crit处的初始化SDRAM函数,代码如下所示:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
…
当Uboot在SDRAM中运行时,代码的入口地址_start与代码在SDRAM中重定位的地址_TEXT_BASE相同,直接跳转到堆栈初始化处stack_setup,跳过了代码的Flash到RAM的搬运。代码如下所示:
adr r0, _start
ldr r1, _TEXT_BASE
cmp r0, r1
beq stack_setup
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0