当前位置:首页 > 邵林军 - 于ARM7的bootloader移植和设计 - 图文
段地址空间被划分为系统寻址的RAM单元。S3C44B0系统加电或者复位后,从物理地址0x00000000开始执行第一段代码,而我们将Flash映射到了这个地址上。当BootLoader放到Flash的起始处后,系统在加电或者复位后,CPU将首先执行BootLoader程序[11]。
综合分析后,对Flash和SDRAM的空间分配如4-1、4-2所示。 在图4-1中,物理地址的0x00000000用于存放BootLoader的镜像,内核镜像放在0x00100000之后大约1M左右的空间,通常内核经过压缩后都小于1M。BootLoader首先在Flash中运行,然后被拷贝到SDRAM中,这样BootLoader的启动速度会大大加快。而内核映像则在0x0c008000处执行,在此之前预留了一段空间用来存放一些全局数据结构,比如启动参数表和中断向量表等。
图4-1 flash中映像分布图
28
图4-2 SDRAM中映像分布图
4.4 BootLoder移植中的关键问题
4.4.1 处理器异常
异常是由内部或者外部源产生以引起处理器一个事件,在处理异常之前,处理器状态必须保留,以便在异常处理完成之后,原来的程序能够重新运行。同一时刻可能出现多个异常。在每种异常模式的异常向量处放置一条跳转语句,接着完成以下操作:保护现场(堆栈、寄存器),异常处理,恢复现场[10]。
在异常处理实际调试中应注意两点:
1.复位上有上电复位、睡眠复位、硬件复位、看门狗复位,GPIO等多种复位模式,由于不同复位模式的复位后默认的寄存器设置和SDRAM等现场不同,复位以后要查找相应寄存器,以确定复位类型,执行相应的操作;
2.通常情况下,异常处理可以往屏幕上打印一条消息或往串口上发送数据。但是在初始化部分调试的时候,这些办法都不太适合,因为这些硬件部分驱动还没有设置成功。 4.4.2 GPIO设置
BootLoader的初始化设置中,GPIO的设置时变化最大也是工作量较大的一个部分,以S3C44B0处理器为例,S3C44B0一共有71个通用可编程多功能输入输出引脚(GPIO),通过24个寄存器来控制这些引脚的方向、功能以及状态。每个端口都可以通过软件设置来满足各种各样的系统设置和设计要求。每个端口都可以通过软件设置来满足各种各样的系统设置和设计要求。每个端口的功能通常都要在主程序开始前被定义。如果一个引脚的多功能没有使用,那么这个引脚将被设置为I/O端口。在引脚配置之前,需要对引脚的初始化状态进行设定,以避免一些问题的出现[8]。
GPIO设置中有两点需要注意的地方:
1.在初始化设置时将不用的I/O口设置为输出,这样可以节省电源。 2.大部分GPIO口都有复用功能,如果引脚用作特殊功能,要根据硬件电路的链接关系进行相应配置,如果引脚用作通用I/O功能,通过设置GPDR决定引脚的输入和输出,若引脚当前状态时输入,则引脚编程的输出状态在引脚被设置为输出时才起作用。 4.4.3 内存初始化
在BootLoader移植当中,一个很重要的部分就是动态内存初始化,它是BootLoader是否能够移植成功的关键。针对不同的处理器,动态内存的
29
初始化必须遵循严格的步骤,否则就会出现问题,使内存不能使用[6]。 4.5 U-boot移植操作
4.5.1 移植参考板的选择和使用
因为EV44B0板使用的处理器是S3C44B0而B2板使用的处理器也是S3C44B0因此在这里选择的是B2板作为移植参考板。
1)修改Makefile文件,为EV44B0添加一个编译选项如下图4-3。
图4-3 为EV44B0添加一个编译选项
arm:cpu的架构(ARCH)
s3c44b0:CPU的类型(CPU),其对应于cpu/s3c44b0子目录 EV44B0:开发板的型号(BOARD),对应于EV44B0目录 xyz:开发者或者经销商
2)在board子目录中建立EV44B0如图4-4。
图4-4 board子目录中建立EV44B0目录
30
3)在include/configs/中建立配置头文件。
$cd include/configs //进入include/configs目录 $cp B2.h EV44B0.h //复制B2.h文件并命名为EV44B0.h 4)修改EV44B0目录下的Makefile文件,如图4-5。
图 4-5 修改EV44B0下的Makefile文件
把原来的B2.o改成EV44B0.o
4.5.2 具体修改操作
1.CPU相关寄存器值的修改 首先奥修改的就是CPU的相关寄存器的初始化值,包括一些中断、看门狗、主时钟、内部Cache等寄存器的控制。这些初始值有些是有问题的。这些修改都在文件cpu/s3c44b0/start.s中,具体修改如表4-1。
表4-1 CPU相关寄存器值的修改
寄存器 WTCON INTMSK LOCKTIME PLLCON CLKCON 地址 0x01d30000 0x01e0000c 0x01d8000c 0x01d80000 0x01d80004 原值 0x0 0x03fffeff 800 0x7ffc 0x7ff8 修改值 0x0 0x07ffffff 2000 0x480302 0x7ff8 说明 禁止看门狗 禁止所有中断 时钟管理 控制CPU主频 电源管理 以上内容都是按照参考手册进行修改,其中最主要的是PLLCON寄存器值的修改。如果还要对电源管理等进行优化,另外还有一些寄存器的值也要修改。
2.内存相关寄存器值的修改 内存在使用之前必须先设置内存的各个参数。S3C44B0的CPU内部自带了8k的片内Cache,而这8k的Cache是需要初始化的,而且还可以当作高速内存来使用,所以在未初始化SDRAM前可以在片内内存中进行操作(地址见手册)。与内存控制器相关的寄存器操作都在board/xyz/ev44b0/memsetup.s中。具体修改如表4-2所列:
表4-2内存相关寄存器值的修改
31
共分享92篇相关文档