嵌入式学习-uboot-lesson3-6410uboot启动流程分析
2016-06-24 11:47
429 查看
主要分为:
一.6410启动方式
二.6410地址布局
三.6410启动流程
四.uboot分析
1.SROM(NORFLASH)
2.oneNAND 一种特殊的NANDFlash(既具有norflash特性也具有nandFlash的特性)
3.MODEN
4.IROM(intern rom)下分为SD和NANDFlash启动
通过配置引脚,从而选择不同的启动方式
从上图可以看到6410的iROM 和 Stepping Stone的地址,6410的内存是从0x50000000开始的
众所周知,启动的时候都是从0地址开始的,但是看上面的图,MIRRORED REGION 镜像区域,也就是,如果选择irom启动方式,则启动的时候,则将irom地址空间里面的内容映射到0地址去,根据不同的选择,镜像区域映射不同的设备。
上电之后,整个启动流程分为三个部分:
第一部分:irom被映射到0地址处,然后运行iROM里面的数据,
irom里面存放着芯片厂商相关的程序(包括把设备device里面的BL1拷贝到垫脚石中)和信息,称之为BL0,即bootloader0
第二部分:把bootloader放到垫脚石去运行,称为BL1
第三部分:若bootloader大于8KB,则BL1会把大于8KB部分的bootloader(BL2)放入内存中
如下:
smdk6410代表了相关文件存放的目录的名字,
在代码段最前的是 cpu/s3c64xx/start.o这个目标文件,也就是cpu/s3c64xx/目录下start.s这个文件会最先运行
在链接器脚本中上方有ENTRY(_start) 这句话,代表_start为整个程序的入口
也就是在start.s中 _start是最先被运行的
然后查看代码
可以知道,第一步是跳转到reset部分去,然后转到reset部分,可以看到其第一部分为 set the CPU to SVC32 模式
继续查看,下一步是ONENAND的初始化,但是6410并没有选择onenand,因此跳过
继续往下查看
上图说明要跳转到lowlevel_init去
打开smdk6410目录里面的lowlevel_init.s
6410是从NAND falsh启动的
copy_from_nand 把bootloader复制到内存中去
没有用MMU,因此不用
打开board.c
可以看到init_sequence这个指针,并且指针循环进行调用,跳转到指针处
可以看到,进行了一系列的初始化,而关于硬件方面的初始化时串口的初始化
关于start.S更详细的分析,请参考:
uboot start.s分析
菜鸟一枚,如有错误,多多指教。。。
一.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更详细的分析,请参考:
uboot start.s分析
菜鸟一枚,如有错误,多多指教。。。
相关文章推荐
- 如何在PPT中插入视频
- 返回值是JSON的阿贾克斯方法
- bootstrap 模态框提交按钮之后就关闭模态框
- 《第一份工作,请干足五年》读后感
- Android异步加载访问网络图片-解析json
- linux下查看进城(ps)的方法 与 杀死进程(kill)的N种方法
- mysql整数
- jquery选择器中的空格与大于号>、加号+与波浪号~的区别介绍
- JavaWeb 服务启动时,在后台启动加载一个线程。
- 鼠标浮动文本的实现
- 系统服务
- svn服务器出现网页能登陆库访问,但tortoise无法登陆
- IDEA 15 java -source问题
- 第十六周项目一(1)-小玩文件
- 学期总结
- 使用面向对象对XML进行解析:dom和dom4j的用法
- JavaIO(04)字符流--Writer and Reader
- jquery表单插件Autotab使用方法详解
- MySQL:内联视图与标量子查询
- 编写一个程序,打印输入中单词长度的直方图