OK6410开发板Uboot学习总结----(一)Uboot启动分析
OK6410开发板的Uboot是在1.1.6版本上进行移植的,为了便于分析,创建一个Source Insight工程,把源码下board目录里跟samsung相关的文件、cpu目录下s3c64xx文件夹、include目录里asm-arm和configs下的smdk6410.h文件,还有lib_arm目录下board.c文件都添加到工程中,然后就可以分析Uboot启动流程了。
Uboot启动分两个阶段
第一阶段:主要是SOC内部的初始化,板级的初始化比较少,所以移植的修改量比较小。此阶段完全由汇编语言编写,代码主体分布在/uboot1.1.6/cpu/s3c64xx/start.S和/uboot1.1.6/board/samsung/smdk6410/ lowlevel_init.S文件中。
第二阶段:主要是板级的初始化,SOC内部的初始化比较少,移植时修改量主要在此。该阶段主要由c语言编写,代码主体分布在/uboot/lib_arm/board.c中。
先来分析第一阶段
得先分析u-boot.lds链接脚本,才能知道程序入口,首先看uboot1.1.6\board\samsung\smdk6410\u-boot.lds文件:
ENTRY定义了程序入口,指定_start为程序入口,第一段代码在start.o中,所以先看start.S文件:
代码很简单,直接跳转reset标签,代码如下:
由于复位后中断向量表未初始化,所以这里先禁IRQ(普通中断)和FIQ(快速中断),然后设置SVC模式,即超级用户模式,好进行相应配置。下面进入cpu_init_crit函数:
这里禁用了MMU和缓存Cache,MMU是内存管理单元,负责转换虚拟地址与物理地址的,为避免操作上麻烦,先要禁掉MMU;而禁Cache是因为上电后DDR未初始化,当CPU从cache中取数据时,可能导致数据预取异常。剩下的代码就不分析了,直接看如何到lowlevel_init.S文件的:
这里直接一个长跳转搞定,来分析lowlevel_init.S文件:
显然lowlevel_init函数已经定义为全局的了,这个函数里初始化相关GPIO,禁止看门狗,初始化时钟,初始化串口:
这里初始化串口只是测试一下串口0,波特率都是固定的:
uart_asm_init函数具体代码下一篇“修改调试串口号”文章里再详细分析,串口初始化后打印字母O进行测试:
4F在ASCII里面对应的就是大写字母O,之后函数返回到lowlevel_init中:
uart_asm_init函数结束后,又往r1里放了4b(对应字母K),这就是为什么OK6410上电时会输出一个OK了。lowlevel_init函数结束后回到start.S中:
这段代码比较重要,判断Uboot目前是从哪里启动的,然后完成自身的拷贝工作,OK6410支持从SD卡启动也是这部分处理的,关于如何完成Uboot拷贝的,后面“OK6410从SD卡启动分析”专题再解释这部分内容。这里直接看拷贝后执行的代码:
这里使能MMU单元,继续往下看:
初始化堆栈设置,为加载C代码做好准备,终于分析到了汇编代码的尾声:
代码最后,把_start_armboot赋值给pc寄存器,到这里第一阶段就完成了,开始进入第二阶段。_start_armboot指向的是C程序的start_armboot函数,代码在uboot1.1.6\lib_arm\board.c文件中:
开始的全局变量初始化就不说了,看底层初始化工作:
这里把init_fnc_ptr这个函数指针指向了init_sequence数组:
数组里初始化的内容还比较多,这部分都初始化没问题,才能进行下面的flash初始化,环境变量设置等工作,最后进入死循环,等待命令处理:
到这里Uboot的主体启动流程就分析完了,以后再专题介绍重要部分的分析。
OK6410开发板Uboot学习总结----(一)Uboot启动分析相关推荐
- S3C6410(OK6410开发板介绍)
S3C6410(OK6410开发板介绍) 1. 系统资源 A.处理器 Samsung S3C6410处理器,ARM1176JZF-S内核,主频533MHz/667MHz B.FLASH 1G字节N ...
- OK6410开发板Uboot学习总结----(三)从SD卡启动分析
前面讲了Uboot启动流程和如何修改调试串口,相信大家对Uboot已经有了初步的了解,今天来进行更深一点的分析.上篇文章 OK6410开发板Uboot学习总结----(二)修改调试打印串口 遗留一个问 ...
- 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2
Part0 准备知识 0.1 关键参数说明 0.1.1 开发板说明 OK6410是飞凌公司发布的一款开发板,当前有2个版本,OK6410-A和OK6410-B,我当前使用的是前者:前者也经历过升级,所 ...
- 基于OK6410开发板Uboot源码简单分析
2018-04-07 OK6410开发板是基于三星S3C6410芯片设计的一款开发板,资源比较丰富,可是想要使用这些资源就需要编写相应的启动引导程序,即BootLoader.当然,想要自己凭空写出Bo ...
- Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot
Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot 一.下载u-boot源码 git clone https://git ...
- OK6410开发板学习之外部中断(按键点亮led和蜂鸣器)
中断在嵌入式里面是很常见的一个功能了.通过这个功能,可以让CPU减轻很多负担,不用不断的查询设备的状态.提高了CPU的效率. 中断的大体过程如下: 中断源检测中断信号产生,然后将中断信号发送给中断控制 ...
- OK6410开发板学习之一步一步实现精简BootLoader(BL1部分)
众所周知,ok6410开发板是一块基于s3c6410芯片的开发板,板载资源丰富.s3c6410是三星电子生产的基于arm11内核的芯片.本文旨在总结一下bootloader操作步骤,用于以后复习.查找 ...
- OK6410开发板学习之安装linux系统至开发板
说来惭愧,OK6410开发板自从买来就一直在躺灰,当时连教程也花了1千多大洋了,近来感觉前途迷茫,遂决定将其拿出来研究研究,看是否能够给我新出路. 废话不多说,先上一张OK6410开发板大图: 不要问 ...
- 迅为IMX6ULL开发板Linux学习教程
1800+页使用手册(持续更新)+入门视频教程+实战视频教程 关注VX公众号:迅为电子 , 回复 :终结者,免费获取产品资料 让教程更细致,终结入门难! 所有教程由迅为原创,是迅为工作多年的工程师 ...
最新文章
- 不要62 ---数位DP
- 我是Redis,MySQL大哥被我害惨了!
- '_NamespacePath' object has no attribute 'sort'
- bootstrap form表单提交_[Selenium]28. 处理表单元素
- 用python简单处理图片(5):图像直方图
- RabbitMQ之交换机总结(图文并茂讲解)
- windows server 2008 R2 SP1多国语言包官方下载
- rapidminer简介与安装
- 防护等级 ipx9、ipx9k、ip69、ip69k之间的区别
- HDFS容错性设计有哪些?
- 人力资源管理六大模块体系解读
- 扩展名为ifo的文件怎么播放
- aauto桌面小应用-简单番茄钟
- 当免费模式遭遇安全价值观
- git bash无法复制和黏贴
- js实现公司年会抽奖活动(亲测可用)
- 清空数据库表结构的几种方式
- go zap + lumberjack 日志按大小分割demo整理
- Mybatis报错:Could not resolve type alias
- C#读取QQWry.Dat文件实现IP查询