Tiny210V2(S5PV210)的U-boot分析

注1】:参考的U-boot版本为CSDN liukun321的http://blog.csdn.net/liukun321/article/details/8558425。它原本基于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含有一个内64KIROM96KIRAM,系统启动时主要依靠它们,IROMIRAM所处的存储空间见下图:

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

第一步 关闭看门狗;

第二步 初始化icache

第三步 初始化堆栈;

第四步 设置时钟;

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

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

第七步 跳转到IRAM0xD0020010地址上继续运行(前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.carm9论坛上的网友提供,它的的作用就是用来给原始的bin文件添加头部,即16字节的校验和的。mkv210_image.c的核心工作如下:

第一步 分配16kbuffer

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

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

第四步 将16kbuffer拷贝到210.bin

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

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

#!/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的程序。程序分两个文件夹,BL1BL2

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

2BL1/start.S功能分析:

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

第二步 调用copy_code_to_dram()BL2.binSD卡拷贝到DRAM0x23E00000处,copy_code_to_dram()的实现位于文件mmc_relocate.c

2BL2/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的友善之壁TINY210V2LINUX启动过程的自我总结(程序大于16KB

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

复制16K16字节校验和的第一段启动代码至IRAM0xD0020000处

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~0x3FFFFFFF10MB空间(?)

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会把裸机程序拷贝到DRAM0x20000000地址处,然后跳转到该地址上运行裸机程序(如何开始运行?)。另外,以后只要选择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?答: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)
images\FriendlyARM.ini  —— 系统烧写配置文件

【注3】:一般市场上买到的SD卡为全盘FAT32格式,如果卡中存放了很多数据,强制烧写就有可能会不知不觉中破坏这些数据;基于此原因考虑,在Vista/Winows7中,先把SD卡自动分割为普通的FAT32格式区(自动命名卷标为“FriendlyARM)和无格式区(占130M,放置Superboot)两部分,烧写软件将会依据卷标名称作为标志,把bootloader烧写到无格式区,这样就不会破坏普通FAT32格式区中的数据了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值