TINY210 UBOOT(一)启动过程

       一直想写TINY210V2开发板的开发资料,一方面是能力不足怕写出来的会有问题,一方面人也很懒。瞧这位大神写的真不错。我也就不客气转了过来,给自己BLOG加点人气。哈

Tiny210 U-BOOT(一)--启动过程

讲解启动过程,首先的源头就是打开电源,这个相信没人人不知道 。CPU上电后,此时SP指针指向0x0000_0000,从这个地址取第一条指令。但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低(S5PV210中晶振在CPU旁边,两颗24MHz,一颗27MHz);CPU的工作模式、中断设置等不确定;存储空间的各个BANK(包括内存)都没有驱动,内存(tiny210用的DDR2)不能使用。在这种情况下必须在第一条指令处做一些初始化工作,这段初始化程序与操作系统独立分开,称之为Bootloader。下面以S5PV210用的U-BOOT为例:

友善之臂Tiny210 SDK2用的是三星公司的S5PV210,在开始U-BOOT的移植之前,有必要弄清楚S5PV210的启动过程:


由图上所知,由OM(Operating Mode)pin导入到iROM中,OM是什么?打开Tiny210的原理图,搜索OM


查找到一个表格,有上表可知,OM1/OM2/OM3决定的是从SD卡启动还是从Nand Flash启动。


继续往下看,由上图可知,OM1/OM2/OM3分别接在XOM1/XOM2/XOM3上面。


再来看旁边XOM的一个信号反相器74LVC1G04的图,


你怎么知道74LVC1G04是信号反相器呢?我也不知道,我打开了74LVC1G04的芯片手册看了才知道




由图可知,这是一个反相器,2中输入高电平,则4中输出低电平;2中输入低电平,则4中输出高电平,OK。
当XOM拨到1时,XOM1为NC状态,XOM1 = 0,pin4的输出为1,XOM2=XOM3=1,则为0-1-1,为SDBOOT;
当XOM拨到2时,XOM1为输入状态,XOM1 = 1,pin4的输出为0,XOM2 = XOM3 = 0,为1-0-0,Nand启动模式,至此,OM的输入判断分析结束。

继续看芯片手册,手册上关于iROM/iRAM及Bootloader描述如下:

  • The iROM code is placed in internal 64KB ROM. It initializes basic system functions such as clock, stack, and heap.
  • The iROM loads the first boot loader image from a specific booting device to internal 96KB SRAM. The booting device is selected by Operating Mode (OM) pins. According to the secure boot key values, the iROM code may do an integrity check on the first boot loader image.
  • The first boot loader loads the second boot loader then may check the integrity of the second boot loader according the secure boot key values.
  • The second boot loader initializes system clock, UART, and DRAM controller. After initializing DRAM controller, it loads OS image from the booting device to DRAM. According to the secure boot key values, the second boot loader can do an integrity check on the OS image.
  • After the booting completes, the second boot loader jumps to the operating system.


按照芯片手册上的启动分析图及上面的描述,总结启动流程为:
S5PV210上电将iROM(interal ROM)处执行固化的启动代码,它对系统时钟进行初始化,对启动设备进行判断,并从启动设备中复制BL1(最大16KB)到iRAM(0xd002_0000处,其中0xd002_0010之前的16个字节存储的的有BL1的校验信息和BL1尺寸)中,并对BL1进行校验,检验OK转入BL1进行执行;BL1执行完成后,开始执行BL2,BL2加载内核,把OS在SDRAM中运行起来。
BL0,BL1,BL2:
(1)BL0:是指S5PV210的iROM中固化的启动代码
作用:初始化系统时钟,设置看门狗,初始化堆和栈,加载BL1
(2)BL1:是批在iRAM自动从外扩存储器(nand/sd/usb)中拷贝的uboot.bin二进制文件的头最大16K代码
作用:初始化RAM,关闭Cache,设置栈,加载BL2
(3)BL2:是指在代码重定向后在内存中执行的uboot的完整代码
作用:初始化其它外设,加载OS内核
(4)三者之间的关系:(Interal ROM固化代码)BL0将BL1(bootloader的前16KB--BL1)加载到iRAM;BL1然后在iRAM中运行将BL2(剩下的bootloader)加载到SDRAM;BL2加载内核,把OS在SDRAM中运行起来,最终OS是运行在SDRAM(内存)中的。

注释:这里会有加密启动的方引导。有兴趣可以查看相关资料。

         在这个过程中,u-boot其实严格来说有三段,因为第一段是在iROM中,由三星公司给我们写好了,所以,通常,将片内的bootloader称为BL0,而片外Bootloader,也就是在NAND FLASH中的bootloader,我们称为BL1,BL2。我们片外的u-boot是被分为了两个阶段:

1.第一阶段代码
arch/arm/cpu/armv7/start.S
1).设置异常向量地址
2).设置SVC32模式(ARM七种工作模式)
3).cpu_init_crit
清TLB(页面缓存)、关MMU及Cache等
4).转入低级初始化lowlevel_init
主要是对时钟、片外内存(DDR2)、串口、nand(这里初始化nand主要是为第二阶段搬内核到内存而准备的)等进行初始化
5).判断启动开关进行自搬移
6).跳转到C入口board_init_f( ) 


2.第二阶段代码
1).board_init_f( )
A.gd_t数据结构空间分配
B.回调一组初始化函数
C.对gd_t数据结构进行初始化
D.relocate_code(U-boot重定义代码,即自搬移)
2).board_init_r( )
A.使能Cache
B.板子初始化
C.串口初始化
D.外存初始化
E.环境变量初始化
F.控制台初始化
G.中断使能
H.以太网初始化
I. 进入main_loop(),等待命令或自动加载内核


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值