主要分为:
一.6410启动方式
二.6410地址布局
三.6410启动流程
四.uboot分析
一.6410启动方式
根据下图可以看到支持的启动方式有:
1.SROM(NORFLASH)
2.oneNAND 一种特殊的NANDFlash(既具有norflash特性也具有nandFlash的特性)
3.MODEN
4.IROM(intern rom)下分为SD和NANDFlash启动
通过配置引脚,从而选择不同的启动方式
二.6410地址布局
从上图可以看到6410的iROM 和 Stepping Stone的地址,6410的内存是从0x50000000开始的
众所周知,启动的时候都是从0地址开始的,但是看上面的图,MIRRORED REGION 镜像区域,也就是,如果选择irom启动方式,则启动的时候,则将irom地址空间里面的内容映射到0地址去,根据不同的选择,镜像区域映射不同的设备。
三.6410启动流程
在S3C6410_Internal_ROM_Booting.pdf中,
上电之后,整个启动流程分为三个部分:
第一部分:irom被映射到0地址处,然后运行iROM里面的数据,
irom里面存放着芯片厂商相关的程序(包括把设备device里面的BL1拷贝到垫脚石中)和信息,称之为BL0,即bootloader0
第二部分:把bootloader放到垫脚石去运行,称为BL1
第三部分:若bootloader大于8KB,则BL1会把大于8KB部分的bootloader(BL2)放入内存中
四.uboot分析
uboot的主要分为 第一阶段程序 和 第二阶段程序 ,第一阶段程序主要是采用汇编指令编写的,第二阶段程序主要是采用C编写的
1.程序入口
通过查Makefile看相对应的开发板的硬件平台,
如下:
smdk6410代表了相关文件存放的目录的名字,
2.然后进入/uboot/board/samsung/smdk6410目录
如下:
3.然后打开链接器脚本 uboot.lds查看来观察:
在代码段最前的是 cpu/s3c64xx/start.o这个目标文件,也就是cpu/s3c64xx/目录下start.s这个文件会最先运行
在链接器脚本中上方有ENTRY(_start) 这句话,代表_start为整个程序的入口
也就是在start.s中 _start是最先被运行的
4.打开start.s
5.第1阶段程序分析
5.1设置中断向量表
在start.s开始的位置,看其描述部分可知其功能是中断向量表
然后查看代码
可以知道,第一步是跳转到reset部分去,然后转到reset部分,可以看到其第一部分为 set the CPU to SVC32 模式
5.2 设置处理器为SVC模式
继续往下查看
5.3刷新IDcache
继续查看
5.4关闭MMU和cache
5.5外设基地址的初始化
继续查看,下一步是ONENAND的初始化,但是6410并没有选择onenand,因此跳过
继续往下查看
上图说明要跳转到lowlevel_init去
打开smdk6410目录里面的lowlevel_init.s
5.6点亮led
5.7关闭看门狗
5.8关闭所有中断
5.9初始化时钟
5.10初始化串口
5.11nand flash简单的初始化
5.12初始化内存
然后返回start.s继续往下查看
6410是从NAND falsh启动的
copy_from_nand 把bootloader复制到内存中去
5.13 复制nand flash中的bootloader到内存中
没有用MMU,因此不用
5.14设置堆栈
5.15清除bss段
然后ldr pc, _start_armboot代表绝对跳转到_start_armboot地方去
6.第2阶段程序分析
start_armboot 在/lib_arm/board.c中
打开board.c
可以看到init_sequence这个指针,并且指针循环进行调用,跳转到指针处
可以看到,进行了一系列的初始化,而关于硬件方面的初始化时串口的初始化
6.1串口初始化
6.2lcd初始化
6.3网卡初始化
6.4led初始化
最后进入循环 main_loop 其主要作用是,在控制台上对用户输入的命令进行解析
关于start.S更详细的分析,请参考:
菜鸟一枚,如有错误,多多指教。。。