一. 在flash里,首先存放bootload, 其次启动参数,是内核和根文件系统。bootloader分两个部分,stage1和stage2:stage1: 汇编部分执行简单的硬件初始化.
1. 硬件设备初始化
2. 为加载bootloader的stage2准备RAM空间
3. 设置好堆栈
4. 跳转到stage2的C入口
stage2: C语言部分负责复制数据,设置启动参数和串口通信等
1. 初始化本阶段使用到的硬件设备
2. 检测系统内存映像
3. 将kernel映像和根文件映像从flash读到RAM中
4. 为内核设置启动参数
5. 调用内核
二. S3C2440A启动程序步骤:
1. 屏蔽所有中断,关看门狗。
2. 根据工作频率设置PLL寄存器
3. 初始化存储控制相关寄存器
4. 初始化各模式下的栈指针
5. 设置缺省中断处理函数
6. 将数据段拷贝到RAM中,将零初始化数据段清零
7. 跳转到C语言Main入口函数中
三. S3C2440A启动代码分析:
1.option.inc -->可修改的的配置选项.包括一些起始地址,初始状态,总线宽度,时钟频率等。倘若以后对系统的设置有变化,直接修改”option.inc”中的配置即可,无需大量改动boot loader.
_STACK_BASEADDRESS EQU 0x33ff8000;定义STACK 的起始地址
_MMUTT_STARTADDRESS EQU 0x33ff8000; 定义MMU表基地址
_ISR_STARTADDRESS EQU 0x33ffff00; 定义中断起始地址
PLL_ON_START; 设置PLL 初始状态
ENDIAN_CHANGE; 选择ENDIAN,具体值应该根据硬件的设置来定
ENTRY_BUS_WIDTH; 配置入口总线宽度
BUSWIDTH; 配置GPIO的总线宽度
CPU_SEL; 配置ARM chip ID
UCLK; 配置USB clock (见芯片手册214页)
XTAL_SEL; 配置晶振频率
FCLK; 配置FLCK
CLKDIV_VAL; 设置CLOCK DIVISION
根据设置CPU_SEL, UCLK, XTAL_SEL, FCLK, CLIKDIV_VAL是用 “if”语句来配置相应的参数如M_MDIV, M_PDIV, M_SDIV, U_MIDV, U_PDIV, U_SDIV
公式如下:Mpll=(2*m*Fin)/(p*2^s)
m=M(the value for divider M)+8, p=P(the value for divider P)+2
2.memcfg.inc-->配置ARM memory寄存器.
BANK1~BANK7的BWSCON
B1_BWSCON
B1_Tacs
B1_Tcos
B1_Tacc
B1_Tcoh
B1_Tah
B1_Tacp
B1_PMC
如果是SDRAM, 则还需设置REFRESH寄存器
3.2440addr.inc-->2440特殊寄存器地址定义。(未完待续)