您的位置:首页 > 其它

Tiny210V2(S5PV210)的U-boot分析

2014-12-30 21:14 393 查看
注1】:参考的U-boot版本为CSDN liukun321的/article/1392098.html。它原本基于Alex Ling的linaro-2011.10
for mini210,对于这个原版的分析参考:http://wenku.baidu.com/view/649d0f49be1e650e52ea99ad.html或者http://blog.chinaunix.net/uid/25445243/abstract/1.html

1. U-boot源码目录结构

注2】:本部分参考u-boot_smdkv210:http://www.cnblogs.com/Efronc/archive/2012/02/28/2371059.html

1.board

本目录存放与已有开发板相关的文件。每种开发板有一个子目录,子目录仅存放与开发板相关的c文件和配置文件,不包含开发板CPU架构通用的实现文件。

每个目录下有如下文件(以samsung\smdkc110为例):

Makefile

config.mk

smdkc110.c 和板子相关的代码

flash.c Flash操作代码

u-boot.lds 全局链接文件

2.common

实现u-boot命令行下支持的命令,每一条命令对应一个文件。例如bootm命令对应的是cmd_bootm.c。

3.cpu

与CPU架构相关目录,每一款支持的CPU或架构均在一个子目录下。

每个目录下有如下文件(以s5pc11x为例):

Makefile

config.mk

cpu.c 和处理器相关的代码

interrupts.c 中断处理代码

serial.c 串口初始化代码

start.s 全局开始启动代码。

4.disk

对磁盘的支持。

5.doc

文档目录。

6.drivers

设备驱动程序目录。比如串口、USB、mmc等。

7.fs

支持的文件系统。u-boot支持cramfs、ext2、fat、fdos、jffs2、reiserfs、ubifs、yaffs2文件系统。

8.include

使用的头文件均在改目录下,还有对各种硬件平台支持的汇编文件、系统配置文件和文件系统支持的文件。

该目录下configs目录有与开发板相关的配置文件。例如smdkv210single.h。

该目录下asm目录有与cpu体系结构相关的头文件,例如asm-arm目录下有arch-s5pc11x目录。

9.lib_xxx

与体系结构相关的库文件。如ARM相关的库放在lib_arm目录下。例如u-boot启动后首先打印的版本信息version_string[]就在board.c中定义。

10.net

与网络协议栈相关的代码,bootp协议、tftp协议、rarp协议和nfs文件系统等实现。

11.tools

生成u-boot工具,例如mkimage。

12.其他

examples等。

sd_fusing:烧写到sd卡的源文件和脚本文件。

2. S5PV210的启动过程

S5PV210含有一个内64K的IROM和96K的IRAM,系统启动时主要依靠它们,IROM和IRAM所处的存储空间见下图:



系统刚启动时,会运行IROM中的固化代码,进行一些通用的初始化,具体步骤包括:

第一步 关闭看门狗;

第二步 初始化icache;

第三步 初始化堆栈;

第四步 设置时钟;

第五步 判断启动设备(nand/sd/onenand等),检查校验和,然后从启动设备中拷贝前16KB的代码到IRAM的0xD0020000处;

第六步 若是安全模式启动,则进行完整性检查;

第七步 跳转到IRAM的0xD0020010地址上继续运行(前16个字节为校验和);

3. 友善之壁TINY210V2板的裸机开发程序的加载过程分析一(代码小于16KB,不需要二次搬移代码至IRAM或者DRAM)

分析裸机程序第一个例子,即裸机LED点灯程序。先看Makefile内容:

===========================================================

led.bin: start.o

arm-linux-ld -Ttext 0x0 -o led.elf $^

arm-linux-objcopy -O binary led.elf led.bin

arm-linux-objdump -D led.elf > led_elf.dis

gcc mkv210_image.c -o mkmini210

./mkmini210 led.bin 210.bin

%.o : %.S

arm-linux-gcc -o $@ $< -c

%.o : %.c

arm-linux-gcc -o $@ $< -c

clean:

rm *.o *.elf *.bin *.dis mkmini210 -f

===========================================================

注1:其中mkv210_image.c是由arm9论坛上的网友提供,它的的作用就是用来给原始的bin文件添加头部,即16字节的校验和的。mkv210_image.c的核心工作如下:

第一步 分配16k的buffer;

第二步 将编译生成的led.bin读到buffer的第16byte开始的地方;

第三步 计算校验和,并将校验和保存在buffer第8~11byte中;

第四步 将16k的buffer拷贝到210.bin中

注2:执行./write2sd后,210.bin文件会被烧写到sd卡的扇区1中,sd卡的起始扇区为0,一个扇区的大小为512byte,sd启动时,IROM里的固化代码是从扇区1开始拷贝代码的。

注3:write2sd是一个脚本文件,内容如下:

#!/bin/sh sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1

dd是一个读写命令,if是输入,of是输出,seek表示从扇区1开始读写。sdb为本文档编写时sd卡的设备节点,请根据自己的实际情况进行修改,后面将不再提及该注意事项。

4. 友善之壁TINY210V2板的裸机开发程序的加载过程分析二(代码大于16KB,需要二次搬移代码至DRAM)

分析裸机程序第八章的例子,即裸机重定位代码至DRAM的程序。程序分两个文件夹,BL1和BL2。

注1:首先整个工程分为BL1和BL2两个目录,目录BL1下的代码会被编译链接成一个名为BL1.bin的文件,而目录BL2下的代码会被编译链接成一个名为BL2.bin的文件。其中,BL1.bin文件的链接地址是0(使用的是位置无关码,程序可以在任意可用的内存中运行),BL2.bin文件的链接地址是0x23E00000(使用的并不是位置无关码,所有程序必须位于该地址处才能正常运行。DRAM0对应的地址是0x20000000~0x3FFFFFF共512M,DRAM1对应的地址是0x4000_000~0x7FFF_FFFF共1G,所以我们这里用到的是DRAM0)。BL1.bin需被烧写到sd卡的扇区1,BL2.bin需被烧写到sd卡的扇区49处,为什么要这样烧写的原因将在后面的程序讲解中给出,完整的烧写过程可参考本章第四节的烧写步骤。整个程序的运行过程大致如下:系统上电后,首先将sd卡扇区1处的BL1.bin拷贝到IRAM的0xD0020000地址处(这部分工作由IROM中的固化代码完成,不用自己编程),然后运行该部分代码。该部分代码首先会初始化DRAM,然后把位于sd卡中扇区49处的BL2.bin拷贝到DRAM的0x23E00000地址处,最后跳转到该地址处继续运行(以上工作由BL1.bin完成)。

注2:BL1/start.S功能分析:

第一步 调用mem_init函数初始化内存,函数的实现位于memory.S,这个文件是从uboot中借鉴过来的;

第二步 调用copy_code_to_dram()将BL2.bin从SD卡拷贝到DRAM的0x23E00000处,copy_code_to_dram()的实现位于文件mmc_relocate.c;

注2:BL2/start.S功能分析:

BL1.bin跳转到0x23E00000后,实际上运行的就是BL2/start.S里的代码,因为BL2.bin的链接脚本sdram.lds里指定了代码段的最开始放的是start.o。在BL2/start.S中只做了一件事,就是使用一条位置相关的指令:ldr PC, =main来调用main函数,main函数的作用与上一章的代码一样化,都是LED闪烁。

5. 基于S5PV210的友善之壁TINY210V2板LINUX启动过程的自我总结(程序大于16KB)

a) 先由IROM判断从NAND/Nor FLASH/SD_MMC/UART_USB启动,然后从相应位置

复制16K含16字节校验和的第一段启动代码至IRAM的0xD0020000处

b) IROM的其他启动工作如开门狗设置、堆栈初始化全部完成后,执行第一段启动代码,

完成内存的初始化,第二段启动代码复制到内存等工作,然后调制第二段启动代码处。

c) 执行第二段启动代码。

6. 友善之臂Superboot加载裸机程序过程的自我猜测(直接下载到内存启动,LED例子)

完整代码见目录7.leds_MiniTools,这个程序的代码跟我们的第一个程序1.leds_s基本一样,唯一的差别在于Makefile中链接时指定的链接地址是0x20000000,因为MiniTools是将裸机程序下载到DRAM的0x20000000的。

a) 通过MiniTools先将led.bin下载到DRAM的指定地址(默认是0x20000000,可用为0x20000000~0x3F5FFFFF(共502MB))

b) 再将Superboot下载至0x3F600000~0x3FFFFFFF的10MB空间(?)

c) (如何开始运行?)

7. 友善之臂Superboot加载裸机程序过程的自我猜测(下载至NAND FLASH启动,LED例子

完整代码见目录7.leds_MiniTools,这个程序的代码跟我们的第一个程序1.leds_s基本一样,唯一的差别在于Makefile中链接时指定的链接地址是0x20000000,因为MiniTools是将裸机程序下载到DRAM的0x20000000的。

a) 设置好加载地址“RAM Address(Download/Loading)”,选择使用Superboot加载裸机程序,并选择要加载的裸机程序led.bin,点击“开始烧写”

b) MiniTools首先把Superboot和裸机程序都烧写到NAND Flash中,然后点击“快速启动”,这时NAND
Flash中的Superboot会把裸机程序拷贝到DRAM的0x20000000地址处,然后跳转到该地址上运行裸机程序(如何开始运行?)。另外,以后只要选择NAND启动时,NAND
Flash 中的Superboot都会将裸机程序加载到DRAM中运行了

8. 友善之臂SD卡中放置Superboot相关文件并烧写不同系统(Linux/Android/WINCE)的过程分析(以Android启动为例)

a) 使用自带的SD-Flasher.exe工具烧写Superboot(superboot-xxx.bin)到SD卡。SD-Flasher.exe会分割并预留130M空间用于烧写Superboot,当你的SD不再用于开发板时,你可能想恢复SD卡为原始状态,可参考上面章节的方法再次启动SD-Flasher.exe,通过界面上的“ReFormat!”功能恢复SD卡为原始状态。

b) 在后面的步骤使用Superboot安装或更新系统时,将会用到烧写配置文件“FriendlyARM.ini”,它的内容如下:

#This line cannot be removed. by FriendlyARM(www.arm9.net)

CheckOneButton=No

Action = Install

OS = Android

LCD-Mode = No

LCD-Type = S70

LowFormat = No

VerifyNandWrite = No

CheckCRC32=No

StatusType = Beeper | LED

################### Android 4.0.3 ####################

Android-BootLoader = Superboot210.bin

Android-Kernel = Android/zImage

Android-CommandLine = root=/dev/mtdblock4 rootfstype=yaffs2 console=ttySAC0,115200 init=/linuxrc androidboot.console=ttySAC0

Android-RootFs-InstallImage = Android/rootfs_android-mlc2.img

################### Android 2.3.1 ####################

#Android-BootLoader = Superboot210.bin

#Android-Kernel = Android2.3.1/zImage

#Android-CommandLine = root=/dev/mtdblock4 rootfstype=yaffs2 console=ttySAC0,115200 init=/linuxrc androidboot.console=s3c2410_serial0

#Android-RootFs-InstallImage = Android2.3.1/rootfs_android-mlc2.img

################### Linux ####################

Linux-BootLoader = Superboot210.bin

Linux-Kernel = Linux/zImage

Linux-CommandLine = root=/dev/mtdblock4 rootfstype=yaffs2 console=ttySAC0,115200 init=/linuxrc

Linux-RootFs-InstallImage = Linux/rootfs_qtopia_qt4-mlc2.img

################### Windows CE6.0 ####################

WindowsCE6-Bootloader = Superboot210.bin

WindowsCE6-BootLogo = WindowsCE6\bootlogo.bmp

WindowsCE6-InstallImage = WindowsCE6\NK.bin

WindowsCE6-RunImage = WindowsCE6\NK.bin

c) 将images目录拷贝到SD卡上。image目录结构为:

* Android2.3.1 - Android 2.3.1 烧写文件

* Android - Android 4.0.3 烧写文件

* Linux - Linux烧写文件

* WindowCE6 - WINCE烧写文件

* FriendlyARM.ini - TF/SD卡执行脱机烧写时的配置文件,可以手工根据需要修改,详细说明见用户手册。

* superboot-210-20110928.bin - 支持TF/SD/SDHC卡的超强Bootloader, 需要使用“光盘\tools\SD-Flasher.exe"工具把它烧写到TF/SD/SDHC卡中。Superboot后面的尾缀是以日期为标识的版本信息,请以最新日期版本为准。

d) 根据要烧写的系统适当修改烧写配置文件“FriendlyARM.ini”。例如要烧写Android 2.3系统,则FriendlyARM.ini的内容修改成如下内容(默认已经如此):

#This line cannot be removed. by FriendlyARM(www.arm9.net)

CheckOneButton=No

Action = Install

OS = Android

LCD-Mode = No

LCD-Type = S70



LowFormat = Yes

VerifyNandWrite = No

CheckCRC32=No

StatusType = Beeper | LED

################### Android 2.3.1 ####################

Android-BootLoader = Superboot210.bin

Android-Kernel = Android2.3.1/zImage

Android-CommandLine = root=/dev/mtdblock4 console=ttySAC0,115200 init=/linuxrc androidboot.console=s3c2410_serial0

Android-RootFs-InstallImage = Android2.3.1/rootfs_android.img

SD卡目录下Android 2.3相关的文件有:

images\Superboot210.bin —— Bootloader,除了支持启动Android,也支持启动其它所有系统,也可以烧写到SD卡上运行。

images\Android2.3.1\zImage —— Android内核(基于Linux的,为什么是zImage而不是uImage?难道友善之臂用的不是Uboot?答:zImage 和uImage 都是生成的可执行内核镜像文件,2者在u-boot中启动的方式分别是go addr与bootm addr来实现启动过程的,即对于zImage是通过go来进行引导,而uImage是通过bootm来进行引导的,zImage和uImage
2者的关系是uImage 是zImage通过mkimage (u-boot下面tools下的工具)来生成的,结果是后者比前者在头部多了64个byte,这多余的64个byte是用来通知给u-boot用的;将相关信息告知u-boot。
),会自动识别LCD类型

images\Android2.3.1\rootfs_android.img —— Android文件系统映象(什么格式的?Yaffs2?答:[b]Yaffs2。因为Tiny210用户手册第三章的3.6节说:执行以下命令可将Android文件系统创建成适用于MLC2 NAND Flash的yaffs2的映象文件,以便烧写到配备MLC NAND Flash的开发板中:#mkyaffs2image-mlc2
rootfs_dir rootfs_android-mlc2.img。yaffs2格式后缀为.img,ubifs格式是.ubi,ext3对应为.ext3)

[/b]images\FriendlyARM.ini —— 系统烧写配置文件

【注3】:一般市场上买到的SD卡为全盘FAT32格式,如果卡中存放了很多数据,强制烧写就有可能会不知不觉中破坏这些数据;基于此原因考虑,在Vista/Winows7中,先把SD卡自动分割为普通的FAT32格式区(自动命名卷标为“FriendlyARM)和无格式区(占130M,放置Superboot)两部分,烧写软件将会依据卷标名称作为标志,把bootloader烧写到无格式区,这样就不会破坏普通FAT32格式区中的数据了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: