Linux 启动过程描述
Linux的启动可分为三级,
Ø 第1级内嵌于AT91SAM9260内部
Ø 第2级为BootStrap
Ø 第3级为U-Boot
第1级
AT91SAM9260 的内嵌存储器有一个32KB的ROM(0x10,0000 ~ 0x10,7FFF),两个4KB的RAM(0x20,0000 ~0x20,0FFF 与 0x30,0000 ~ 0x30,0FFF)。
启动时,BMS=1,REMAP=0,芯片从内部ROM启动,该启动程序即上面所述的第1级引导程序,该引导程序将DataFlash / NandFlash /SMA-BA程序下载到SRAM0,后执行重映射,将SRAM0映射到地址0x00,0000。重新进行引导。
关于如何判断DataFlash / NandFlash内是否有有效的程序镜像,依据如下:
检测前28个字节(对应于ARM异常向量),DataFlash 引导程序寻找有效的应用。这些字节必须是跳转或装载PC(偏移地址装载)等ARM指令。
第6个向量(0x14),包含了需要下载的镜像的尺寸。用户必须利用自己的向量替换之。(在NANDFlash Boot中,无需在第6向量指定下载镜像的尺寸,而是固定下载4096个字节)
第2级(BootStrap)
其功能如下:
Ø 初始化时钟、PIO等设置
Ø 初始化PIO、PMC、SDRAM等外设
Ø 初始化DataFlash、NandFlash等
Ø 从DataFlash、NandFlash中装载U-Boot到SDRAM,并跳转执行
lds 文件格式
crt0_gnu.s 文件流程
文件注解如下:crt0_gnu.s
芯片时钟
时钟生成器共生成如下四个时钟:
Ø SCLK:慢速时钟,唯一一个永久运行的时候
Ø MAINCK:主振荡器输出的时钟,也叫Main Clock
Ø PLLACK:PLLA 输出的时钟
Ø PLLBCK:PLLB 输出的时钟
利用上述四个时钟,电源管理芯片提供如下5个时钟
Ø MCK :也叫Master Clock
Ø PCK :处理器时钟
Ø 外设时钟:通常是MCK
Ø UHPCK :USB主机所需时钟
Ø 可编程时钟输出: PCKx管脚的输出
Main.c
包括硬件初始化、从DataFlash/NandFlash装载U_Boot程序两部分
hw_Init函数
其中SDRAM的初始化是按照Datasheet描述进行的,需要说明的是刷新时间:存储体中电容的数据有效保存期上限是64ms, 此处每个BANK为8092行,行时间间隔为7us,则总共需要57ms
Load_df函数
load_nandflash函数
NandFlash 信息结构说明:
流程图如下:
Makefile
在该Makefile中,包含了.config、driver/*.mk、board/$(BOARD)/$(BOARD).mk等文件,其中BOARD在.config文件中有定义,定义为:at91sam9260ek;
该Makefile文件中所需要编译的文件在:driver/driver.mk中,为变量COBJS-y所定义,至于该程序是从NandFlash还是DataFlash加载U-boot,是由CONFIG_NANDFLASH与CONFIG_DATAFLASH所指定,这两个常数在.config有定义(可仅定义需要编译的代码)。
编译过程中所包含头文件由PROJECT所指定,在顶层Makefile中有INCL=board/$(BOARD)/$(PROJECT),其中INCL在后面是作为-I的参数使用,表示编译过程中可查找头文件的目录。
board/$(BOARD)/$(BOARD).mk中所定义的两个参数:
n LINK_ADDR 在ld链接命令时使用,作为链接过程的基地址(也即是日后程序运行的地方)
n TOP_OF_MEMORY:在gcc时使用,做堆栈底部使用
这两个地址均为内部SRAM的地址。
在这个Makefile文件内,没有调用gcc的地方,按照make的缺省规则,CC、CFLAG、CPPFLAG等变量代表了编译过程中调用的命令以及参数。