Porting uClinux to Samsung S3C44B0X Board

发 布 时 间 : 2008-11-18 来 源 : http://www.mcublog.com 作 者 : Calendar 浏 览 :
一.Bootloader

理论上,uClinux引导时并非一定需要一个独立于Kernel Image的Bootloader Image。然而,将Bootloader与Kernel分开设计能够使软件架构更加清晰,也有助于灵活地支持多种引导方式,实现一些有用的辅助功能。Bootloader的主要任务可以概括如下:

1.硬件初始化和系统引导;
2.加载uClinux Kernel Image (如果需要);
3.设置需要传递给Kernel的启动参数(如果需要);
4.调用uClinux Kernel;
5.辅助功能:从主机下载新的Image;
6.辅助功能:烧写Flash Memory;
7.辅助功能:支持功能5和6所需的人机界面,如串行终端上的命令行接口。

对于常见的几类处理器内核,现在一般都找得到现成的Bootloader可用,不过需要针对具体的Board做些移植。在实现上述功能的前提下,也可以选择自行开发。由于Bootloader Image在物理上独立于Kernel Image,因此不一定选择GNU作为开发工具。对于以ARM7TDMI为内核的S3C44B0X处理器,完全可以使用ADS来开发Bootloader。

1.硬件初始化和系统引导

完整的Bootloader引导流程可描述如下:

硬件初始化阶段一 -> 复制二级Exception Vector Table -> 初始化各种处理器模式 -> 复制RO和RW,清零ZI -> (跳转到C代码入口函数) -> 初始化Exception/Interrupt Handler Entry Table -> 初始化Device Drivers -> 硬件初始化阶段二 -> 建立人机界面

下面对上述各步骤逐一加以说明。

1.1 硬件初始化阶段一

板子上电或复位后,程序从位于地址0x0的Reset Exception Vector处开始执行,因此需要在这里放置Bootloader的第一条指令:b ResetHandler,跳转到标号为ResetHandler处进行第一阶段的硬件初始化,主要内容为:关Watchdog Timer,关中断,初始化PLL和时钟,初始化Memory Controller。比较重要的是PLL的输出频率要算正确,这里把它设置为50MHz;后面在计算SDRAM的Refresh Count和UART的Baud Rate等参数时还要用到。

1.2 复制二级Exception Vector Table

Exception Vector Table是Bootloader与uClinux Kernel发生联系的地方之一(另两处是加载and/or调用Kernel,以及向Kernel传递启动参数)。ARM7规定Exception Vector Table的基地址是0x0,所以Flash Memory的基地址也必须是0x0;而S3C44B0X处理器又不支持Memory Remap,这意味着无论运行什么样的上层软件,一旦发生中断,程序就得到Flash Memory中的Exception Vector Table里去打个转(中断Interrupt是异常Exception的一种)。对于uClinux而言,它会在RAM中建立自己的二级Exception Vector Table(后面将提到基地址被设为0x0C000000),所以在编写Bootloader时,地址0x0处的一级Exception Vector Table只需简单地包含向二级Exception Vector Table跳转的内容:

b ResetHandler ;Reset Handler
ldr pc,=0x0c000004 ;Undefined Instruction Handler
ldr pc,=0x0c000008 ;Software Interrupt Handler
ldr pc,=0x0c00000c ;Prefetch Abort Handler
ldr pc,=0x0c000010 ;Data Abort Handler
b .
ldr pc,=0x0c000018 ;IRQ Handler
ldr pc,=0x0c00001c ;FIQ Handler
LTORG

如果在Bootloader执行的全过程中都不必响应中断,那么上面的设置已能满足要求。但如果某些Bootloader功能要求使用中断(例如用Timer Interrupt实现精确定时,或利用External Interrupt支持Ethernet Driver以实现TFTP下载),那么Bootloader必须在同样的地址处配置自己的二级Exception Vector Table,以便同uClinux兼容。这张表事先存放在Flash Memory里,引导过程中由Bootloader将其复制到RAM地址0x0C000000:

存放:

RelocatedExceptionVectorStart
mov pc,#0
b HandlerUndef
b HandlerSWI
b HandlerPAbort
b HandlerDAbort
b .
b HandlerIRQ
b HandlerFIQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerPAbort HANDLER HandlePAbort
HandlerDAbort HANDLER HandleDAbort
HandlerIRQ HANDLER HandleIRQ
HandlerFIQ HANDLER HandleFIQ
LTORG
RelocatedExceptionVectorEnd

复制:

adr r0, RelocatedExceptionVectorStart
ldr r2, =0x0c000000
adr r3, RelocatedExceptionVectorEnd
0
cmp r0, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc

上一篇:嵌入式系统内存管理方案研究 下一篇:uClinux 2.6 porting s3c44B0 based on uClinux-armsys-050101.tar.gz