S5PV210之UBOOT-2011.06启动过程解析

s5pv210-Uboot启动流程 一、启动流程 1.s5pv210的启动过程 根据三星公司的《S5PV210_UM_REV1.1》手册可知,S5PV210 启动过程主要可 分为 3 个阶段 S5PV210 上电复位后将从 IROM 处执行已固化的启动代码 -------BL0 在 BL0 里初始化过程中对启动设备进行判断,并从启动设备拷贝 BL1(最大16KB ) 到 IRAM 处 , 即 刚 才 所 说 的 0xD0 阅读详情
//主题:S5PV210之UBOOT-2011.06启动过程解析

//作者:kevinjz2010@gmail.com

//版权:kevinjz原创

//平台:S5PV210 ARMV7 TINY210

//发布日期:2012-05-24

//最后修改:2012-05-24

//注意事项:欢迎转载,但不得在转载的时候擅自修改、删除文章的任何部分

//-------------------------------------------------------------------------------------------------

本文使用的UBOOT版本:u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)

源码地址:http://blog.youkuaiyun.com/liukun321/article/details/7438880#comments

感谢作者liukun321的辛勤劳动啊,呵呵!

一、配置与使用

1、在系统根目录下的Makefile中的第601行,通过下列语句:

sinclude$(obj).boards.depend

$(obj).boards.depend: boards.cfg

awk'(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config;$$(MAKE)" }' $< > $@

读取了boards.cfgboards.cfg中关于tiny210_onfig的配置项,其中.boards.depend是隐藏文件;

2、在Makefile的106行添加: 

+ ifeq($(ARCH), arm)

+ CROSS_COMPILE= arm-none-linux-gnueabi-

+ endif

这样配置好了默认的编译器;

3、在根目录下执行:

$make tiny210_config

$make -j

即可在根目录得到tiny210-uboot.bin,可用于SD卡启动和NAND启动;

4、烧入SD卡的时候使用下面命令:

$sudodd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1

dd命令用于对SD进行烧写,根据三星手册《S5PV210_iROM_ApplicationNote_Preliminary_20091126》,将tiny210-uboot.bin烧写到,SD卡的第一个Block,保留第0个block不用,每个block=512B。

5、从SD卡启动后可以就可以将UBOOT烧写到nand里了:

$tftp 21000000 tiny210-uboot.bin

$nand erase 0 40000

$nand write 21000000 0 40000

二、启动流程分析

按照三星《S5PV210_UM_REV1.1》手册上说明的启动流程,S5PV210上电将从IROM处执行固化的启动代码,对时钟等初始化、对启动设备进行判断,并从启动设备中复制BL1(最大16KB)到IRAM(0xd002_0000处,其中0xd002_0010之前的16个字节储存的BL1的校验信息和BL1尺寸)中,并对BL1进行校验,校验OK转入BL1进行执行;BL1继续初始化,并将BL2复制到IRAM中并对其校验,OK后转入BL2;BL2则要进行比较复杂的初始化,包括DRAM的初始化,完成后将OS代码复制到DRAM中,并转入到OS中执行并完成启动引导。

但是,上述的IRAM只有96K大小,对于日益复杂的uboot来说,肯定是不够的,所以使用UBOOT启动引导的时候,也没全按三星手册上说的执行,具体如下:

首先解释一下我认为的BL0、BL1、BL2:

BL0:是指S5PV210的IROM中固化的启动代码;

BL1:是指在IRAM中执行的UBOOT的部分代码;

BL2:是指在内存中执行的的UBOOT的完整代码;

此版本的UBOOT,其实会编译两个UBOOT.bin,即最终生成的tiny210-uboot.bin包括两部分,前段是spl(重用u-boot中既有的驱动,来生成更小的secondaryprogramloader)文件夹内的tiny210-spl.bin,后段是用于在RAM中执行的完整UBOOT代码。所以学习UBOOT代码是也要两个部分来看。

1、第一步与三星手册上一致,执行IROM内固化的代码,即BL0,BL0会将存储于启动设备的UBOOT代码的前16KB:tiny210-spl.bin复制到IRAM。(tiny210-spl.bin设置为24KB了,但实际绝不会超过16KB,后面全填充的0,所以拷不完也OK。这里是liukun321为了统一MMC与NAND启动而作的修改,也许改成16K就应该OK了,应为IROM里的代码最多拷贝16K进IRAM嘛,一会改改试试。所以呢实际上执行BL1就是执行tiny210-spl.bin。在UBOOT的代码中并不会看到tiny210-spl.bin和完整的UBOOT代码分开两套文件进行编写,都在同样的文件中,只是通过宏定义来控制执行流程,SPL文件夹内由自己的Makefile文件。

2、第一步入口程序是/arch/arm/cpu/armv7/start.S中的_start,设置异常向量地址(地址由ARM 架构决定,不能改变),执行reset,进入SVC32模式,并调用cpu_init_crit对ARM的CP15寄存器进行设置,如清空TLB,关闭MMU等,进入/board/samsung/tiny210/lowlevel_init.S中的lowlevel_init中,进行低级初始化,主要是对时钟、内存、串口、nand等进行初始化,为下一步的代码拷贝做准备。

3、从lowlevel_init出来之后执行call_board_init_f,通过读取OMR_OFFSET寄存器的值,对启动设备进行判断,看看是从mmc启动还是nand启动,判断好后跳入mmc_boot.c或nand_cp.c中,将UBOOT代码拷贝到内存中,地址为_TEXT_BASE:在tiny210.h中定义为0x23e0_0000,换成别的地方也可以,比如3000_0000(注:在跳转到内存中执行之前,所有的语句都是基于PC寻址的,也就是说和代码具体存放的地址没有关系,进行跳转的时候都会计算出跳转目标相对与PC的位置,在跳转过去。)。这里有一个很大的问题,稍后讨论。拷贝完成后直接冲0x23e0_0000出开始执行。那么执行的是什么呢,那先看看拷贝的是什么吧!

a.nand启动

在/arch/arm/cpu/armv7/s5pc1xx/nand_cp.c中,第105行:

for(i = (0x6000>>page_shift); i < (size>>page_shift);i++, buf+=(1<<page_shift)) {

nandll_read_page(buf,i, large_block);

}

指定了拷贝的起始page是nand起始24K之后的第一个PAGE,偏移0x6000的位置,该地址上存储的是完整的UBOOT在RAM中执行的完整启动代码;

b.mmc启动

在/arch/arm/cpu/armv7/s5pc1xx/mmc_boot.c中,第49行:

#defineMOVI_BL2_POS ((eFUSE_SIZE / MOVI_BLKSIZE) +MOVI_BL1_BLKCNT + MOVI_ENV_BLKCNT)

经计算MOVI_BL2_POS位于第24.5K的位置,也即第49个block,偏移0x6200的位置,该地址上存储的同样是UBOOT在RAM中执行的完整启动代码;

注:针对第一点提出的将24K偏移改成16K,经过验证:改成16KB并不可行,其实这里不仅仅是BL1的容量的问题,UBOOT_SPL.BIN实际上只有4K不到,所以对于nand启动来说4KB就足够了,但是对于MMC启动来说却不行,因为SD卡的布局并不一样,它在BL1与BL2之间还插入了16KB的ENV区,所以只能是24K,而对NAND的ENV区在BL2之后了。

所以,无论是MMC启动还是NAND启动,将代码copy到DRAM中并跳转之后,执行的是DRAM中的_start入口函数,重新执行一遍UBOOT,但是一些宏定义已经发生变化,如CONFIG_SPL_BUILD被取消定义,相应的代码也不会执行。

4、因为第一编执行UBOOT的时候ARM的状态都已经初始化OK了,包括时钟,内存等,第二遍执行时只是跳转到内存中执行了,所以这里判断是否在DRAM中执行,如果在内存中执行,则可以直接跳到call_board_init_f去进行班级初始化。当然,源码并不是这样执行的,而是重新执行RESET、LOWLEVEL_INIT等函数,但我验证过,可以不用执行。有兴趣的同志也可以验证一下。

5 、进入board_init_f以后将:

a、对gd_t数据结构(include/asm/global_data.h中定义)进行初始化,并填入相关数据,如内存大小、UBOOT镜像长度等;

b、对打印CPU信息、UBOOT版本信息等,并对串口、console进一步初始化,输出nand信息,对内存大小进行计算,并打印出来。


c、为UBOOT的重定向设置物理地址,重定向后UBOOT可使用的end地址为0x3fff_0000,

UBOOT镜像起始地址为0x3ff8_5000。

打印调试信息:

TLBtable at: 3fff0000

Topof RAM usable for U-Boot at: 3fff0000

Reserving424k for U-Boot at: 3ff85000

Reserving928k for malloc() at: 3fe9d000

Reserving24 Bytes for Board Info at: 3fe9cfe8

Reserving120 Bytes for Global Data at: 3fe9cf70

NewStack Pointer is: 3fe9cf60

第一个疑问:

第201行:

/*Pointer is writable since we allocated a register for it */

gd= (gd_t *) ((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);

打印CONFIG_SYS_INIT_SP_ADDR的值为0x20ff_ff80,为啥gd_t数据结构会在这个位置,之后好像没有看到重定向gd数据结构的代码!

6、完成board_init_f中的处理后,转入start.S中的relocate_code函数进行代码搬运及重定向。搬运完成之后,清空BSS后转入board.c中的board_init_r函数执行。

第二个疑问:

这里重定向的意义是什么?以前S3C6410或S3C2410的UBOOT中对代码进行重定向是将代码从FLASH或nand或MMC中复制到内存中,但是这里之前的代码已经将UBOOT从nand或mmc复制到了DRAM中,而且目前也是运行在DRAM中。那么为什么在之前的代码中不直接将UBOOT复制到0x3ff8_5000,就可以省去relocate_code步骤?我尝试将CONFIG_SYS_TEXT_BASEdefine为0x3ff8_5000过之后,UBOOT可以启动,但所有的CMD都丢失了,比如:Unknowncommand 'printenv' - try 'help'?目前也没搞明白哪里出问题了!

7、在board_init_r中,会清空malloc()区的内存,对nand、MMC等进行初始化,执行env_relocate()对环境变量进行初始化(第6步中的问题不知道是不是由于这个函数没有处理好引起的,研究了半天也没发现问题),如果将环境变量保存在NAND中,则会将其读入到内存中来。如果出现什么问题的话,就使用默认的环境变量代替。此步还会对网络、中断等进行初始化。全部初始化完成之后则跳入/common/main.c中的main_loop()中执行,等待用户命令或自动加载内核。


三、总结

本文对S5PV210平台UBOOT的启动流程做了分析,并对一些有疑问的地方做了验证,比如哪一块代码会执行两遍,哪一块代码第二编制行的时候可以省去等。

验证的方法一般就是电灯或者判断代码执行的位置等。另外,调试过程需要多次的进行烧写,如果每次都敲命令进行烧写的华会很费时间的,所以最好是在/common/main.c中写一个自己的的菜单,并且将烧写任务设为一个命令就行了,这样会轻松一些。

本文到这里也只是初步了解了一下UBOOT的启动流程,很多具体的代码还有很多不明白的地方,比如nand、mmc、网卡的驱动啥的,慢慢在具体分析吧。还有,上面的两个问题,尤其是第二个问题,知道的同志吱一声,讨论讨论哈!
S5PV210 -- UBOOT启动过程解析(TINY210) //主题:S5PV210之UBOOT-2011.06启动过程解析   //作者:kevinjz2010@gmail.com   //平台:S5PV210 ARMV7 TINY210   //------------------------------------------------------------------------------------------------- 阅读详情

相关推荐

S5PV210_UM_REV1.1 文档

S5PV210_UM_REV1.1 文档

学习S5PV210——UM_REV1.1pdf笔记

system peripheral(系统外设)   · RTC   实时时钟   · PLL×4 锁向环(固定低频信号生成稳定输出的高频信号)    ·DMA 直接存储器访问(允许不同速度的硬件装置沟通,不需要依赖CPU大量中断)   · Keypad 按键    ·TS-ADC 数模转换connectivity(连通模块)    Audio IF 音频            ·IIS      ...

weixin_40405692的博客 663

S5PV210_UM_REV1.1.zip

S5PV210_UM_REV1.1 解压密码:1234567890

嵌入式启动之四:S5PV210 IROM & BL0启动

S5PV210属于这一类系统,外挂SDRAM内存和NAND、SD卡等外存设备,系统和应用代码等作为固件存放在外存设备中,并通过S5PV210内置的IROM启动并逐步引导到SDRAM中。本文详细描述S5PV210的IROM启动过程。

嵌入式企鹅圈 3719

S5PV210_UM_REV1.1.pdf

S5PV210_UM_REV1.1.pdf

S5PV210_UM_REV1.1

S5PV210 的datasheet,详细的引脚介绍和寄存器介绍。

(转)S5PV210之UBOOT-2011.06启动过程解析

//主题:S5PV210之UBOOT-2011.06启动过程解析 //作者:kevinjz2010@gmail.com //版权:kevinjz原创 //平台:S5PV210 ARMV7 TINY210 //发布日期:2012-05-24 //最后修改:2012-11-27 //注意事项:欢迎转载,但不得在转载的时候擅自修改、删除文章的任何部分 //------------...

dianchixian5277的博客 101

Uboot源码之ok210

Uboot源码之ok210,挺不错的资源哦!

S5PV210之UBOOT-2011.06启动过程解析-基于u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)

//主题:S5PV210之UBOOT-2011.06启动过程解析 //作者:kevinjz2010@gmail.com //版权:kevinjz原创 //平台:S5PV210 ARMV7 TINY210 //发布日期:2012-05-24 //最后修改:2012-11-27 //注意事项:欢迎转载,但不得在转载的时候擅自修改、删除文章的任何部分 //---

天使黑翼的世界 9149

spdk + fio测试nvme 设备的性能

fio的测试对象可以是块设备、文件等,在spdk的使用过程中会unbind默认的nvme driver,所以在系统中是看不到nvme块设备的,在spdk中可以通过fio_plugin的方式,将spdk的用户态driver部分的io功能打包成一个ioengine提供给fio使用,可以综合spdk的高性能和fio提供的复杂场景。更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加。这个jobfile是spdk中提供的例子。领取,关注我持续更新哦!2.7 jobfile的例子。

lingshengxiyou的博客 1089

摄像机实时接入分析平台视频分析网关AI智能分析智慧营业厅方案

通过智能化的改造,可以提高营业厅的运营效率,降低运营成本,同时提升客户体验和安全保障。

EasyDarwin开源社区技术博客 703

第0章-可以在smart210上应用的dnw for linux源码----这只是个开始

我的目标是用我手头上的这个uboot源代码,实现文件下载,并正确引导内核,然后争取基本替代superboot210.bin。说基本替代,是因为我只想用superboot210.bin帮我从SD卡启动,然后下载一个自己的uboot.bin到nand flash中,然后用自己的uboot向nand flash里下载内核和yaffs2格式的根文件系统。当然如果可能,我也盼望着能把自己的uboot.bin烧到SD卡里,能够从SD卡正常启动。那会就真正的抛开superboot210.bin,向着这个目标前进吧。

zbl_learn的博客 956

雷达信号处理——恒虚警检测(CFAR)

上图展示的是同时在距离维和多普勒维进行恒虚警检测的原理,如果只是在距离维或多普勒维做CFAR,检测单元的左右两侧均有设定好数量的保护单元和参考单元。不同的CFAR检测器适用于不同的场景,CA-CFAR算法适用于均匀环境中的单目标或彼此相距较远的多目标环境,在邻近多目标环境会发生目标的遮蔽效应,在杂波边缘会发生杂波边缘效应。从图中也可以看到,根据阈值的选择不同,有不同的检测器,其中CA-CFAR是取的参考单元的均值,SO-CFAR取的是参考单元的最小值,而GO-CFAR是取的参考单元的最大值。

诚朴勇毅 3万+

uboot-2011-06 之makefile分析(三)结合代码的编译

在虚拟机里装个一个ubuntu14.04 64位版本,开始结合代码分析和编译。 首先要设置编译器的类型,一般默认的是gcc ,而我们要用的是以arm-linux为版本的编译器。我使用的编译器的版本是arm-linux-gcc 4.3.2,网上有下载,或者换个其他的版本试试。 解压后放在/opt/目录下,然后回到自己的home目录,打开.profile,添加 if [ -d "/opt/a

感觉身体被掏空 505

告别手动画图!用SUMO的netedit快速搭建高速公路交织区路网(附完整XML文件)

本文详细介绍了如何使用SUMO的netedit工具高效构建高速公路交织区路网,避免手动绘图的低效与错误。通过实战案例和XML文件示例,帮助交通工程专业学生快速掌握复杂道路结构建模技巧,特别解析了spreadType参数设置和速度单位换算等关键操作。

weixin_29085865的博客 261

RK3588开发笔记-ES8311音频芯片调试记录

本篇博客主要记录如何在RK3588平台试ES8311音频芯片的过程。这包括硬件连接、内核配置、驱动程序调试和测试步骤。通过以上步骤,我们成功在RK3588平台上调试了ES8311音频芯片。这包括硬件连接、内核配置、设备树配置、驱动加载以及音频测试。希望这篇调试记录能为其他开发者提供一些帮助。如果你有任何问题或建议,欢迎留言讨上调论。

flypig has a dream! 3162

uboot 移植

在进行U-Boot移植之前,我们会用到一些有关S5PV210的知识,在这里简单的给大家介绍一下~ 硬件平台:OK210开发板 U-Boot:2011.06   ---------------------------------第一部分-----------------------------------   S5pv210是一个32位精简指令集、低功耗、高性能的cortex-a8处理器

u013358722的专栏 793

XXL-Job 分布式定时任务

XXL-JOB是一款轻量级分布式定时任务调度框架,采用调度中心与执行器分离架构,解决单机任务宕机、重复执行等问题。核心模块包括调度中心(管理任务配置、触发调度)和执行器(执行任务逻辑),支持集群部署保证高可用。框架提供丰富的任务触发规则、路由策略、阻塞策略及完善的运维能力,适用于多种业务场景如数据同步、定时推送等。安装时需准备MySQL数据库并初始化表结构,通过Docker部署调度中心服务。相比其他定时框架,XXL-JOB具有轻量化、可视化等优势,是中小企业的首选方案。

郭宝的博客 700

牛人博客

在这里记录一下常见的牛人博客: 1、ARM 裸机程序开发参考博客地址   http://blog.csdn.net/shengnan_wu/article/category/1267025 说明:结合汇编和c语言混编的方式,详细介绍2440芯片的体系结构,寄存器等 2、arm-linux博客 http://www.cnblogs.com/armlinux/archive/

huzx189的博客 168

【教程4>第10章>第13节】基于FPGA的图像双边滤波开发——单通道双边滤波Verilog实现

本文介绍了基于Vivado 2022.2的单通道高斯滤波FPGA实现方案。主要内容包括:1)采用3×3窗口像素提取、高斯权值计算、exp指数运算等模块构建双边滤波系统;2)详细分析了Verilog HDL实现的顶层设计文件,包含窗口数据生成、指数计算、混合权重、归一化处理等关键模块;3)展示了图像双边滤波器的RTL结构图。该设计为后续实现RGB三通道图像高斯滤波及MATLAB联合仿真奠定了基础。

FPGA/MATLAB学习教程/源码/项目合作开发 263

物联网竞赛单片机应用开发-项目汇总

物联网竞赛单片机应用开发-项目汇总

a6662580的博客 9003
上一篇: 关于一些机器 到客户手里一两个月就有出现分区损坏不能启动的问题探讨
下一篇: 电脑越用越慢怎么办?可以试试下面的方法
简单并快乐着
博客等级 码龄15年 473粉丝 96原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值