首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Uboot在S3C2440上的移植

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
继承事业,薪火相传
返回列表