嵌入式学习-uboot-lesson3-6410uboot启动流程分析

主要分为:
一.6410启动方式
二.6410地址布局
三.6410启动流程
四.uboot分析

一.6410启动方式

根据下图可以看到支持的启动方式有:
1.SROM(NORFLASH)
2.oneNAND 一种特殊的NANDFlash(既具有norflash特性也具有nandFlash的特性)
3.MODEN
4.IROM(intern rom)下分为SD和NANDFlash启动

通过配置引脚,从而选择不同的启动方式

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第1张图片

二.6410地址布局

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第2张图片

从上图可以看到6410的iROM 和 Stepping Stone的地址,6410的内存是从0x50000000开始的

众所周知,启动的时候都是从0地址开始的,但是看上面的图,MIRRORED REGION 镜像区域,也就是,如果选择irom启动方式,则启动的时候,则将irom地址空间里面的内容映射到0地址去,根据不同的选择,镜像区域映射不同的设备。

三.6410启动流程

在S3C6410_Internal_ROM_Booting.pdf中,
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第3张图片

上电之后,整个启动流程分为三个部分:
第一部分: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目录

如下:
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第4张图片

3.然后打开链接器脚本 uboot.lds查看来观察:

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第5张图片
在代码段最前的是 cpu/s3c64xx/start.o这个目标文件,也就是cpu/s3c64xx/目录下start.s这个文件会最先运行
在链接器脚本中上方有ENTRY(_start) 这句话,代表_start为整个程序的入口
也就是在start.s中 _start是最先被运行的

4.打开start.s

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第6张图片

5.第1阶段程序分析

5.1设置中断向量表

在start.s开始的位置,看其描述部分可知其功能是中断向量表
这里写图片描述
然后查看代码
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第7张图片
可以知道,第一步是跳转到reset部分去,然后转到reset部分,可以看到其第一部分为 set the CPU to SVC32 模式
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第8张图片

5.2 设置处理器为SVC模式

继续往下查看
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第9张图片

5.3刷新IDcache

继续查看

5.4关闭MMU和cache

5.5外设基地址的初始化


继续查看,下一步是ONENAND的初始化,但是6410并没有选择onenand,因此跳过
继续往下查看
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第10张图片
上图说明要跳转到lowlevel_init去
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第11张图片
打开smdk6410目录里面的lowlevel_init.s
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第12张图片

5.6点亮led

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第13张图片

5.7关闭看门狗

5.8关闭所有中断

5.9初始化时钟

5.10初始化串口

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第14张图片

5.11nand flash简单的初始化

5.12初始化内存

然后返回start.s继续往下查看
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第15张图片
6410是从NAND falsh启动的
copy_from_nand 把bootloader复制到内存中去

5.13 复制nand flash中的bootloader到内存中

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第16张图片
没有用MMU,因此不用
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第17张图片

5.14设置堆栈

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第18张图片

5.15清除bss段

然后ldr pc, _start_armboot代表绝对跳转到_start_armboot地方去

6.第2阶段程序分析

start_armboot 在/lib_arm/board.c中
打开board.c

可以看到init_sequence这个指针,并且指针循环进行调用,跳转到指针处
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第19张图片
可以看到,进行了一系列的初始化,而关于硬件方面的初始化时串口的初始化

6.1串口初始化

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第20张图片

6.2lcd初始化

嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第21张图片

6.3网卡初始化

6.4led初始化

最后进入循环 main_loop 其主要作用是,在控制台上对用户输入的命令进行解析
嵌入式学习-uboot-lesson3-6410uboot启动流程分析_第22张图片

关于start.S更详细的分析,请参考:

uboot start.s分析

菜鸟一枚,如有错误,多多指教。。。

你可能感兴趣的:(嵌入式,启动流程,u-boot,6410)