第二章tiny4412u-boot移植二启动分析

请给我倒杯茶 请给我倒杯茶     2022-09-10     182

关键词:

本文转载自:http://blog.csdn.net/eshing/article/details/37521481

一、启动过程说明

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

友善之臂Tiny4412用的是三星公司的Exynos4412,在开始U-BOOT的移植之前,有必要弄清楚Exynos4412的启动过程,查看手册的第5章BootingSequence有详细的说明。

Exynos4412可以从四个地方开始启动:NAANDFlash,SD/MMC,eMMC,USB设备。

如下图2-1所示,一般的CPU的启动过过程如下:

先来说明图上几个名词:

1、iROM(BL0):是指Exynos4412的iROM中固化的启动代码,其作用是初始化系统时钟,设置看门狗,初始化堆和栈,加载8kb的bl1到Exynos4412的一个64kb大小内部sram(Internal SRAM)中运行,它在内部ROM上执行。

2、Firstboot loader(BL1):是批在iRAM自动从外扩存储器(nand/sd/usb)中拷贝的uboot.bin二进制文件的头最大16K代码,其作用:初始化RAM,关闭Cache,设置栈,加载BL2。这一段代码Samsung可能会给提供。

3、Secondboot loader(BL2):是指在代码重定向后在内存中执行的uboot的完整代码,作用:初始化其它外设,加载OS内核,所以这一段代码是和特定的平台相关联的,我们主要会修改的也是这段代码。

由图1-1可知,一上电就由OMPIN来决定了启动方式,然后(InteralROM固化代码)iROM进行执行,进行相关初始化工作后,将BL1(bootloader的前16KB--BL1)加载到iRAM中;BL1然后在iRAM中运行后,初始化工作完成再将BL2(剩下的bootloader)加载到SDRAM;BL2再加载内核OS,把OS在DRAM中运行起来,最终OS是运行在DRAM(内存)中的。

 

技术分享

图2-1、启动顺序图

以下来详细说明,看英文介绍:

? 1、iROM is placed in internal 64 KB ROM. Itinitializes basic system functions such as clock and stack.

? 2、iROM loads BL1 image from a specificbooting device to internal 256 KB SRAM. The booting device is

selected by Operating Mode (OM) pins.According to the secure boot key values, iROM may do an integrity

check on BL1 image.

? 3、BL1 initializes system clock, and DRAMcontroller. After initializing DRAM controller, it loads OS image from

the booting device to DRAM. According tothe secure boot key values, BL1 can do an integrity check on the

OS image.

?4、Afterthe booting completes, BL1 jumps to the operating system.

iROM reads the OM pins to find thebooting device. The OM register provides the OM pin and other informationrequired for booting. Refer to Section 4, "Chip ID" for moreinformation on OM register. The OM pin decides the booting devices such asNAND, MoviNAND, and iNAND. USB booting is provided for system debugging andflash reprogramming, not for normal booting.

好,来给大家在说一次:

1、    iROM是存储在内部的64KROM中的,他主要进行CPU的时钟,堆栈等基本初始化工作。

2、    iROM从启动外设加载BL1到内部256KB的SRAM中,启动外设是由OM来决定的,根据安全启动设置值,iROM可能会较验BL1镜像文件。

3、    BL1初始化内部系统时钟和DRAM控制器,在初始化完成DRAM控制器,开始加载OS镜像文件,根据安全启动设置值,BL1可能会较验OS镜像文件。

4、    等待启动完成后,BL1就跳转到操作系统进行执行。

大家可能觉得会奇怪不是由BL2来加载OS的嘛,这个我也不是很明白,我也是刚学习,边学边写,为的是自己能记住,我觉得原因可能是现在芯片内部的SRAM空间越来载大了,Exynos4412内部有256K的空间,有足够空间让一次性完成所有的初始化和加载OS的工作,且大家都知道BL1和BL2都是用来初始化的,所以没有必要分两次加载镜像文件了吧。这样也省去复制两次代码的工作吧,其实,手册第5章一开始也提到了BL2程序,从一开始我们还可以认为是BL1也是由三星提供的,而BL2是用户自己写的,但这里又没有提到,有可能手册写作上也有一定的疏忽吧,总之手册里的内容也可能会存在一些微小的错误吧,也不能尽信。

上面说到OM决定着启动方式,那OM是什么?接着看手册上,可以看到,下面说明OMpin不同设置可以启动模式,从不同的外设加载程序,如SD卡,NANDFlash等,查看Tiny4412的电路图如下图2-2所示:

技术分享

技术分享

 

图2-2、OM电路启动外设设置图

由上可知XOM0,XOM1,XOM4,XOM5都设置成0,那么主要看XOM2和XOM3了,这两个脚分别接在74LVC1G04输入和输出上,查看74LVC1G04芯片手册可知其是一个反向器,XOM2接1时,XOM3为0,XOM2接0时,XOM3为1,查看下面的表可其电路板设计了两种启动方式,一种是SD卡、另一种是INADD。这个启动方式主要由电路板上开关决定。

说了这么多了,再好好的来总结一下启动初始化过程,下面的初始化过程是一个通用的说法,这里虽不是针对Tiny4412启动代码分析出来的,但总体过程大家都差不多,可供参考嘛,接着说,在这个过程中,U-Boot其实严格来说有三段,因为第一段是在iROM中,由三星公司给我们写好了,所以,通常,将片内的bootloader称为BL0,而片外Bootloader,也就是在NANDFLASH(或SD卡)的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

主要是对时钟、片外内存(DDR3)、串口、nand(这里初始化nand主要是为第二阶段搬内核到内存而准备的)等进行初始化

5).判断启动开关进行自搬移,注意这里就和OM设置有关系了。

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(),等待命令或自动加载内核

 

先看硬件,CPU时钟、NANDFLASH、DDR、串口、网卡,至少这些硬件,是我们需要在U-Boot的启动过程中完成初始化的,其余的细节问题,看我能力,至少,前面的这些硬件,是U-Boot在启动过程,做自搬移,及最终引导内核前必须要用到的,OK,为了理解U-Boot源码中那些硬件操作汇编代码,我们先看看这些硬件的工作原理是如何的。然后就好分析代码了。

       网上一位大牛的博客:http://blog.csdn.net/zsy2020314/article/details/9824035

其基于tiny210也进行分析了启动过程,大家可以再去看看,下面一些内容和图来自于此。

虽然我是要去分析Exynos4412的启动过程,但在s5pv210_irom_application手册中,对启动过程几个阶段的流程有详细描述,见下图2-3所示,而我又找不到Exynos4412的类似说明文档,大家还是凑合着看看吧。

 

技术分享

图2-3、S5PV210启动顺序图

启动过程原理

必须要明白的一点是,当代码从存储介质(nand flash,SD,norflash,onenand等)中搬运到了DRAM中后随即会跳转到内存中运行U-Boot,接着会有一个重定位(relocate_code)的过程,relocate_code子函数在start.S中,而给relocate_code子函数传参数的是crt0.S中的main子函数。当判断到当前U-Boot在内存的低地址处,那么relocate_code就会工作,把U-Boot代码从低地址处再搬运到内存地址的顶端,然后跳转到新的位置去继续运行U-Boot。而搬运的目标地址是在board_init_f()函数(此函数在/arch/arm/lib/board.c中)中计算出来的,见图2-4。

 

技术分享

图2-4、U-BOOT重定位示意图

下面,以start.S为主线,画出了其程序流程图,如图1-5所示、图中同样也表现出启动的整个流程和启动代码文件间的组织关系。大家可以先看看,然后以tiny210的代码来参考,一行一行的分析,相信花点时间,大家应是可以看明白这个流程的。

 

技术分享

图2-5、start.s启动流程图

 
1

tiny4412-1312__uboot移植(代码片段)

...inaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi要移植的u-boot版本:u-boot-2016-11Tiny4412开发板硬件版本为:  底板:  Tiny4412SDK1312B  核心板:Tiny4412-1306 1.获取U-BOOT源码从FTP站点下载: ftp://ftp.denx.de/pub/... 查看详情

tiny4412u-boot分析u-boot引导内核流程

在u-boot中,通过bootm命令启动内核。bootm命令的作用是将内核加载到指定的内存地址,然后通过R0、R1、R2寄存器传递启动参数之后启动内核。在启动内核之前需要对环境做一些初始化工作,主要有如下几个方面:(1)、cpu寄存器设... 查看详情

tiny4412u-boot分析u-boot配置流程分析

...可以了解到它的作用#Scripttocreateheaderfilesandlinkstoconfigure#U-Bootforaspecificboard.##Para 查看详情

uboot移植前奏

  Tiny4412开发板硬件版本为:     底板: Tiny4412/Super4412SDK1506      核心板:Tiny4412-1412 1、下载u-boot源代码,建立u-boot代码仓库   参考:h 查看详情

tiny4412--uboot移植串口(代码片段)

...inaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi要移植的u-boot版本:u-boot-2016-11Tiny4412开发板硬件版本为:  底板:  Tiny4412SDK1312B  核心板:Tiny4412-1306 1,原理图查看tiny4412SDK-1312B-Schematic.pdf   ... 查看详情

tiny4412--uboot移植时钟(代码片段)

...inaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi要移植的u-boot版本:u-boot-2016-11Tiny4412开发板硬件版本为:  底板:  Tiny4412SDK1312B  核心板:Tiny4412-1306 1、时钟体系exynos4412芯片时钟体系的介绍在《Exynos4412... 查看详情

x-001friendlyarmtiny4412uboot移植前奏

...inaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi要移植的u-boot版本:u-boot-2016-09参考u-boot版本:友善之臂提供的u-boot-2010-12Tiny4412开发板硬件版本 查看详情

tiny4412u-boot烧写及根文件系统制作(不进入终端问题)

http://m.blog.csdn.net/article/details?id=51400196(转) VMware12环境:ubuntu12.4开发板:tiny4412首先烧写bootloader,我用一个8G的内存卡,现在不说sd卡的制作过程了,网上可以参考。现在就把我给arm的emmc烧写过程开始说。用sd卡启动,开发... 查看详情

linux内核lcd驱动分析与换屏方法(tiny4412)

​Linux内核中换屏技术​21.5.1u-boot中的参数bootargs实现换屏​在uboot中有一个bootargs环境变量,这个参数就是传递数据给内核的。​对tiny4412提供的内核,可以通过修改bootargs实现驱动不同的LCD屏。​21.5.2分析bootargs中的lcd参数再启... 查看详情

linux学习:uboot移植

U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: 1)第一阶段的功能硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置好栈跳转到第二阶段代码入口 2)第二阶段的功能初始化本阶段使用的硬件设备检测... 查看详情

tiny4412标准版,编译u-boot并烧录到sd卡,从sd卡启动后只打印‘ok’两个字符

本人开发板是tiny4412(1G+4G)的标准版,由于开发板自带的光盘资料无法读取,所以就从友善官网下载到最新的资料;然而在做uboot烧录实验的时候,发现烧录完成从SD卡启动后只打印“OK”两个字符,无法正常... 查看详情

tiny4412裸机程序说明

...动,只能尽可能找来各种相关资料进行参考分析。我想在U-Boot程序中加入LCD显示功能,但始终都没有正常点亮LCD,放弃的心都有了,后 查看详情

x-002exyson4412芯片启动过程分析

 移植u-boot到FriendlyARMTiny4412开发板上,首先我们需要对SamsungExyson4412芯片的启动方式、系统时钟初始化、串口初始化、内存初始化以及开发板的内存地址空间分配有一个清楚的认识。下面是一些参考资料:1>、技术部落(这... 查看详情

tiny4412移植opencv2.4.7手记

在买了新的4412板子后。打算趁着刚成功在6410上移植过的经验,速度解决下。不想出现了各种问题。小结下:1、关于opencv的移植:tiny4412的linux3.5上,须要把opencv的lib内so尽数复制到板子根文件夹lib下。并依照pc的arm-opencv路径。复... 查看详情

tiny4412学习杂记

1.Android挂载NFS使用busyboxmount来替代mount命令2.修改Uboot中fastboot最大buff 使用U-boot烧写Android5.0的时候出现remote:datatoolarge将 include/configs/tiny4412.h 改大一点3.tiny4412内核中trustzone配置开关tiny4412 trust 查看详情

tiny4412标准版,编译u-boot并烧录到sd卡,从sd卡启动后只打印‘ok’两个字符

本人开发板是tiny4412(1G+4G)的标准版,由于开发板自带的光盘资料无法读取,所以就从友善官网下载到最新的资料;然而在做uboot烧录实验的时候,发现烧录完成从SD卡启动后只打印“OK”两个字符,无法正常... 查看详情

linux系统移植博文导航

...个一个交流的机会,也感谢大家的支持。Linux相关的网站U-BootLinux内核busyboxLinux系统移植Linux系统移植-前言第1章环境搭建(Exynos4412+U-boot2013.1)第1章环境搭建(imx283)第2章u-boot烧写与使用(Exynos4412+U-boot2013.1)第3章U-boot移植A(Ex... 查看详情

tiny210(s5pv210)移植u-boot(基于2014.4版本号)——移植u-boot.bin(打印串口控制台)

...信息打印。在上节。我们看到调用relocate_code重定位。在u-boot的帮助文档doc/README.arm-relocation中对重定位有说明。u-boot为了生成位置无关码,在链接时指定了-pie选项,这个选项在u-boot-2014.04/arch/arm/config.mk中指定: 查看详情