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启动分析相关推荐

  1. S3C6410(OK6410开发板介绍)

    S3C6410(OK6410开发板介绍) 1.   系统资源 A.处理器 Samsung S3C6410处理器,ARM1176JZF-S内核,主频533MHz/667MHz B.FLASH 1G字节N ...

  2. OK6410开发板Uboot学习总结----(三)从SD卡启动分析

    前面讲了Uboot启动流程和如何修改调试串口,相信大家对Uboot已经有了初步的了解,今天来进行更深一点的分析.上篇文章 OK6410开发板Uboot学习总结----(二)修改调试打印串口 遗留一个问 ...

  3. 飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2

    Part0 准备知识 0.1 关键参数说明 0.1.1 开发板说明 OK6410是飞凌公司发布的一款开发板,当前有2个版本,OK6410-A和OK6410-B,我当前使用的是前者:前者也经历过升级,所 ...

  4. 基于OK6410开发板Uboot源码简单分析

    2018-04-07 OK6410开发板是基于三星S3C6410芯片设计的一款开发板,资源比较丰富,可是想要使用这些资源就需要编写相应的启动引导程序,即BootLoader.当然,想要自己凭空写出Bo ...

  5. Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot

    Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot 一.下载u-boot源码 git clone https://git ...

  6. OK6410开发板学习之外部中断(按键点亮led和蜂鸣器)

    中断在嵌入式里面是很常见的一个功能了.通过这个功能,可以让CPU减轻很多负担,不用不断的查询设备的状态.提高了CPU的效率. 中断的大体过程如下: 中断源检测中断信号产生,然后将中断信号发送给中断控制 ...

  7. OK6410开发板学习之一步一步实现精简BootLoader(BL1部分)

    众所周知,ok6410开发板是一块基于s3c6410芯片的开发板,板载资源丰富.s3c6410是三星电子生产的基于arm11内核的芯片.本文旨在总结一下bootloader操作步骤,用于以后复习.查找 ...

  8. OK6410开发板学习之安装linux系统至开发板

    说来惭愧,OK6410开发板自从买来就一直在躺灰,当时连教程也花了1千多大洋了,近来感觉前途迷茫,遂决定将其拿出来研究研究,看是否能够给我新出路. 废话不多说,先上一张OK6410开发板大图: 不要问 ...

  9. 迅为IMX6ULL开发板Linux学习教程

    1800+页使用手册(持续更新)+入门视频教程+实战视频教程 关注VX公众号:迅为电子 ,  回复 :终结者,免费获取产品资料  让教程更细致,终结入门难! 所有教程由迅为原创,是迅为工作多年的工程师 ...

最新文章

  1. 不要62 ---数位DP
  2. 我是Redis,MySQL大哥被我害惨了!
  3. '_NamespacePath' object has no attribute 'sort'
  4. bootstrap form表单提交_[Selenium]28. 处理表单元素
  5. 用python简单处理图片(5):图像直方图
  6. RabbitMQ之交换机总结(图文并茂讲解)
  7. windows server 2008 R2 SP1多国语言包官方下载
  8. rapidminer简介与安装
  9. 防护等级 ipx9、ipx9k、ip69、ip69k之间的区别
  10. HDFS容错性设计有哪些?
  11. 人力资源管理六大模块体系解读
  12. 扩展名为ifo的文件怎么播放
  13. aauto桌面小应用-简单番茄钟
  14. 当免费模式遭遇安全价值观
  15. git bash无法复制和黏贴
  16. js实现公司年会抽奖活动(亲测可用)
  17. 清空数据库表结构的几种方式
  18. go zap + lumberjack 日志按大小分割demo整理
  19. Mybatis报错:Could not resolve type alias
  20. C#读取QQWry.Dat文件实现IP查询

热门文章

  1. 鸟哥的服务器博客目录
  2. matlab 数组差分,matlab中计算三维数组的差分
  3. c语言选择结构的语句有,选择结构
  4. c语言define变量字符串拼接,C语言#define的用法
  5. 探索Kotlin的隐性成本
  6. 大V推荐!高级java工程师面试题库
  7. UE4 时间变慢,时间子弹类似
  8. 《俄罗斯方块》发布 | 历史上的今天
  9. 【搜索】泡泡龙 DFS
  10. 国家版权局关于对出版和复制境外电子出版物和计算机软件进行著作权授权合同登记和认证的通知