简单说说U-boot的修改

  • 格式:pdf
  • 大小:162.83 KB
  • 文档页数:23

简单说说U-boot的修改的修改

uboot是一个通用的免费开放源码的boot程序,支持很多的处理器。

以下是现在网上下载一个u-boot-1.1.1版本,用于at91rm9200系统的修改的例子。最后在

redhat8.0上,用gcc2.95编译通过。

在网上下载了uboot-1.1.1版本。要用于自己的at91rm9200的系统,这个系统的情况是:

SDRAM: 32Mbytes NCS1

FLASH: 8Mbytes NCS0

涉及到的文件有四个:

common.h

flash.c

flash.h

”./board/at91rm9200dk/config.mk”

以下简单的说说。

一、首先读读uboot自带的readme文件,了解了一个大概。

二、看看common.h,这个文件定义了一些基本的东西,并包含了一些必要的头文件。再看看

flash.h,这个文件里面定义了flash_info_t为一个struct。包含了flash的一些属性定义。

并且定义了所有的flash的属性,其中,AMD的有:AMD_ID_LV320B,定义为“#define AMD_

ID_LV320B 0x22F922F9”。

三、对于“./borad/at91rm9200dk/flash.c”的修改,有以下的方面:

“void flash_identification(flash_info_t *info)”这个函数的目的是确认flash的型

号。注意的是,这个函数里面有一些宏定义,直接读写了flash。并获得ID号。

四、修改:”./board/at91rm9200dk/config.mk”为

TEXT_BASE=0x21f80000 为TEXT_BASE=0x21f00000 (当然,你应该根据自己的板子来修改,

和一级boot的定义的一致即可)。

五、再修改”./include/configs/at91rm9200dk.h”为

修改flash和SDRAM的大小。

六、另外一个要修改的文件是:

./borad/at91rm9200dk/flash.c。这个文件修改的部分比较的多。

1. 首先是OrgDef的定义,加上目前的flash。 2. 接下来,修改”#define FLASH_BANK_SIZE 0x200000”为自己flash的容量

3. 在修改函数flash_identification(flash_info_t * info)里面的打印信息,这部分将

在u-boot启动的时候显示。

4. 然后修改函数flash_init(void)里面对一些变量的赋值。

5. 最后修改的是函数flash_print_info(flash_info_t * info)里面实际打印的函数信息。

6. 还有一个函数需要修改,就是:“flash_erase”,这个函数要检测先前知道的flash类

型是否匹配,否则,直接就返回了。把这里给注释掉。

七、接下来看看SDRAM的修改。

这个里面对于“SIZE”的定义都是基于字节计算的。

只要修改”./include/configs/at91rm9200dk.h”里面的

“#define PHYS_SDRAM_SIZE 0X200000”就可以了。注意,SIZE是以字节为单位的。

八、还有一个地方要注意

就是按照目前的设定,一级boot把u_boot加载到了SDRAM的空间为:21F00000 -> 21F16B

10,这恰好是SDRAM的高端部分。另外,BSS为21F1AE34。

九、编译后,可以写入flash了。

1. 压缩这个u-boot.bin

“gzip –c u-boot.bin > u-boot.gz”

压缩后的文件大小为:

43Kbytes

2. 接着把boot.bin和u-boot.gz烧到flash里面去。

Boot.bin大约11kBytes,在flash的0x1000 0000 ~ 0x1000 3fff

免费参加,名额有限!2005DVTF;MP3 U盘礼物...

zlei 发表于 2005-1-16 12:31 ARM 论坛 ←返回版面

U-Boot 在44B0X 开发板上的移植以及代码分析(ZT)

armboot的原理

1、BIOS的源码,其作用是初始化硬件,并COPY Boot到SDRAM中

2、在SDRAM中运行BOOT达到在线升级的目的。

3、此源代码与硬件无关,在44b0x上测试通过 4、串口通讯协议自己制定,很好理解。在线升级很快

5、目前只支持SST39LVF160,可以自己修改成相信的NOR FLASH

U-Boot 在44B0X 开发板上的移植以及代码分析

1. u-boot 介绍

u-boot 是一个open source 的bootloader,目前版本是0.4.0。u-boot 是在ppcboot 以及

armboot 的基础上发展而来,虽然宣称是0.4.0 版本,却相当的成熟和稳定,已经在许多嵌

入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。唯一遗憾的是并不

支持我们现在学习所用samsung 44B0X 的开发板。

为什么我们需要u-boot?显然可以将ucLinux 直接烧入flash,从而不需要额外的

引导装载程序(bootloader)。但是从软件升级的角度以及程序修补的来说,软件的自

动更新非常重要。事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的自

动更新的需要就说明我们的开发是必要的。同时,u-boot 移植的过程也是一个对嵌入式系统

包括软硬件以及操作系统加深理解的一个过程。

2. u-boot 移植的框架

移植u-boot 到新的开发板上仅需要修改和硬件相关的部分。在代码结构上:

1) 在board 目录下创建ev44b0ii 目录,创建ev44b0ii.c 以及flash.c,memsetup.S,u-bo

ot.lds等。不需要从零开始,可选择一个相似的目录,直接复制过来,修改文件名以及内容。

我在移植u-boot 过程中,选择的是ep7312 目录。由于u-boot 已经包含基于s3c24b0 的开

发板目录,作为参考,也可以复制相应的目录。

2) 在cpu 目录下创建arm7tdmi 目录,主要包含start.S,interrupts.c 以及cpu.c,seria

l.c几个文件。同样不需要从零开始建立文件,直接从arm720t 复制,然后修改相应内容。

3) 在include/configs 目录下添加ev44b0ii.h,在这里放上全局的宏定义等。

4) 找到u-boot 根目录下Makefile 修改加入

ev44b0ii_config : unconfig

@./mkconfig $(@:_config=) arm arm7tdmi ev44b0ii

5) 运行make ev44bii_config,如果没有错误就可以开始硬件相关代码移植的工作

3. u-boot 的体系结构

1) 总体结构

u-boot 是一个层次式结构。从上图也可以看出,做移植工作的软件人员应当提供串口驱动(UART Driver),以太网驱动(Ethernet Driver),Flash 驱动(Flash 驱动),USB 驱动(USB

Driver)。目前,通过USB 口下载程序显得不是十分必要,所以暂时没有移植USB 驱动。驱

动层之上是u-boot 的应用,command 通过串口提供人机界面。我们可以使用一些命令做一

些常用的工作,比如内存查看命令md。

Kermit 应用主要用来支持使用串口通过超级终端下载应用程序。TFTP 则是通过网络方式来

下载应用程序,例如uclinux 操作系统。

2) 内存分布

在flash rom 中内存分布图ev44b0ii 的flash 大小2M(8bits),现在将0-40000 共256k

作为u-boot 的存储空间。由于u-boot 中有一些环境变量,例如ip 地址,引导文件名等,

可在命令行通过setenv 配置好,通过saveenv 保存在40000-50000(共64k)这段空间里。

如果存在保存好的环境变量,u-boot 引导将直接使用这些环境变量。正如从代码分析中可以

看到,我们会把flash 引导代码搬移到DRAM 中运行。下图给出u-boot 的代码在DRAM中的

位置。引导代码u-boot 将从0x0000 0000 处搬移到0x0C700000 处。特别注意的由于ev44

b0ii uclinux 中断向量程序地址在0x0c00 0000 处,所以不能将程序下载到0x0c00 0000

出,通常下载到0x0c08 0000 处。

4. start.S 代码结构

1) 定义入口

一个可执行的Image 必须有一个入口点并且只能有一个唯一的全局入口,通常这个入口放在

Rom(flash)的0x0 地址。例如start.S 中的

.globl _start

_start:

值得注意的是你必须告诉编译器知道这个入口,这个工作主要是修改连接器脚本文件(lds)。

2) 设置异常向量(Exception Vector)

异常向量表,也可称为中断向量表,必须是从0 地址开始,连续的存放。如下面的就包括了

复位(reset),未定义处理(undef),软件中断(SWI),预去指令错误(Pabort),数据错误(Dabo

rt),保留,以及IRQ,FIQ 等。注意这里的值必须与uclinux 的vector_base 一致。这就是

说如果uclinux 中vector_base(include/armnommu/proc-armv/system.h)定义为0x0c00 00

00,则HandleUndef 应该在

0x0c00 0004。

b reset //for debug