嵌入式系统设计实验三.docx
《嵌入式系统设计实验三.docx》由会员分享,可在线阅读,更多相关《嵌入式系统设计实验三.docx(48页珍藏版)》请在冰豆网上搜索。
嵌入式系统设计实验三
合肥学院
嵌入式系统设计实验报告
(2013-2014第2学期)
专业:
11级自动化卓越班
实验项目:
BootLoader移植实验
实验成员:
指导老师:
干开峰
实验时间:
2014年5月14日
电子信息与电气工程系
2014年4月制
实验三BootLoader移植实验
一、实验目的
1、熟悉Bootloader工作原理。
2、了解U-Boot的代码结构。
3、掌握U-Boot移植过程。
二、实验内容
本实验熟悉Bootloader工作原理,了解U-Boot源码结构,基于S3C2440处理器,完成U-Boot移植,并在目标开发板上测试通过。
三、实验步骤
3.1、u-boot简介
u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,u-boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌入式操作系统。
u-boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
u-boot源码目录如下表:
内容
board
和一些已有开发板有关的文件.每一个开发板都以一个子目录出现在当前目录中,比如说:
SMDK2410,子目录中存放与开发板相关的配置文件.
common
实现uboot命令行下支持的命令,每一条命令都对应一个文件。
例如go命令对应就是
cmd_boot.c
cpu
与特定CPU架构相关目录,每一款uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm920t等。
disk
对磁盘的支持
doc
文档目录。
uboot有非常完善的文档,推荐大家参考阅读。
drivers
uboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。
fs
支持的文件系统,uboot现在支持cramfs、fat、fdos、jffs2和registerfs。
include
uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。
该目录下configs目录有与开发板相关的配置头文件,如smdk2410.h。
该目录下的asm目录有与CPU体系结构相关的头文件,asm对应的是asmarm.
lib_xxxx
与体系结构相关的库文件。
如与ARM相关的库放在lib_arm中。
net
与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
tools
uboot的工具,如:
mkimage,crc等等。
3.2、移植环境
Linux平台:
ubuntu10.04
交叉编译工具:
arm-linux-gcc-4.3.3
arm开发板:
micro2440
CPU:
S3C2440
SDRAM:
64M
NorFlash:
2M
NandFlash:
256M
网卡:
DM9000EP
3.3、u-boot移植要点
(1)获取源码
(2)建立自己的硬件平台配置。
(3)实现bootloader的相关功能。
(4)编译调试和功能测试。
3.4、光盘自带源码移植
(1)拷贝源码,建立工作目录
这里使用的是u-boot-1.1.6.tar.bz2
(2)建立工作目录:
#mkdir/home/uboot
#cd/home/uboot
把下载的源码拷贝到该目录,解压;
#tarjxvfu-boot-1.1.6.tar.bz2
(3)配置和编译U-Boot
本实验用的U-Boot已配置好,具有以下功能特性:
Ø同时支持S3C2410和S3C2440
Ø支持串口xmodem协议
Ø支持USB下载,可以在PC上使用dnw传数据
Ø支持网卡芯片CS8900
Ø支持NANDFlash读写
Ø支持从Nor/NandFlash启动
Ø支持烧写yaffs文件系统映象
Ø可以直接下载到内存运行
编译:
#makeopen24x0_config;配置U-Boot
#make
就可以开始编译了,编译完毕,如图所示生成u-boot.bin。
uboot.bin下载成功后的界面,把开发板启动模式改为NandFlash启动,重新复位或者重启开机电源开关,在SuperVivi-USB-Transfer-Tool上可以看到如图信息。
使用u-boot常用命令
(1)打印环境变量
(2)设置环境变量
(3)保存设定的环境变量
(4)擦除nandflash中数据块
(5)把RAM中的数据写到NandFlash中
(6)从nandflash中读取数据到RAM
(7)直接跳转到可执行文件的入口地址,执行可执行文件
5、官网下载u-boot移植实现
(1)下载源码,建立工作目录
uboot的源码可以从官网下载,这里下载的是u-boot-2011.03.tar.bz2
(2)建立工作目录:
#mkdir/home/uboot
#cd/home/uboot
把下载的源码拷贝到该目录,解压;
#tarjxvfu-boot-2011.03.tar.bz2
解压完成后想要进入目录但是有问题,在查阅相关资料后成功进入相应的目录
(3)建立自己平台Micro2440配置
1)[u-boot-2011.03]$vimboards.cfg
在执行本条指令时显示相应的安装包没有安装,联网后再次执行就下载相应的安装包同时执行相应指令
添加一行micro2440armarm920t-samsungs3c24x0
先点击ESC退出编辑格式到命令格式再点击两次Z即可保存并退出vim。
2)创建板级支持文件
[u-boot-2011.03]$cp-rboard/samsung/smdk2410board/samsung/micro2440
[u-boot-2011.03]$cdboard/samsung/micro2440/
[micro2440]$mvsmdk2410.cmicro2440.c
[micro2440]$vimMakefile
COBJS:
=smdk2410.oflash.o改为COBJS:
=micro2440.oflash.o
先点击ESC退出编辑格式到命令格式再点击两次Z即可保存并退出vim。
[u-boot-2011.03]$cd../../..
[u-boot-2011.03]$cpinclude/configs/smdk2410.hinclude/configs/micro2440.h
[u-boot-2011.03]$viminclude/configs/micro2440.h
修改一:
#defineCONFIG_SYS_PROMPT"[Micro2440]#"/*MonitorCommandPrompt*/
修改二:
#defineCONFIG_SYS_SDRAM_BASEPHYS_SDRAM_1
#defineCONFIG_SYS_INIT_SP_ADDR(CONFIG_SYS_SDRAM_BASE+0x1000-GENERATED_GBL_DATA_SIZE)
(4)测试编译[u-boot-2011.03]$makemicro2440_config
[u-boot-2011.03]$make
执行后出现如下错误,从中可知,在micro2440.h中的130行多了“[”
再次执行vimmicro2440.h删除多余的“[”,再次执行makemicro2440_config和make
开始编译了,编译完毕,生成u-boot.bin。
(5)按照移植目标逐个移植编译调试并测试功能。
移植目标
Ø支持Nand启动
Ø支持Nand读写
Ø支持yaffs写入
Ø支持tftp下载
6、烧写U-Boot到开发板
要烧写U-Boot,需要把开发板拨动开关S2设置为NorFlash启动,连接好串口和USB线,打开超级终端,打开电源,串口显示如图:
选择功能号“d”,打开DNW(修改下载地址为:
33f80000),确认USB连接正常OK,点UsbPortÆTransmit/Restore,选择刚才所编译的u-boot.bin,下载和烧写很快就会结束。
把开发板启动模式改为NandFlash启动,重新复位或者重启开机电源开关,在串口终端可以看到如图信息,如果开发板中已经安装了linux系统,U-Boot将会自动启动它,否则会进入U-Boot的功能菜单(也可以根据提示,在开机后3秒中内按任意键进入):
7、在RAM中运行
(1)include/configs/micro2440.h
删除
#defineCONFIG_S3C24101/*specificallyaSAMSUNGS3C2410SoC*/
#defineCONFIG_SMDK24101/*onaSAMSUNGSMDK2410Board*/
未删除前的界面
将相应的两条指令删除。
删除后的界面
添加#defineCONFIG_S3C24401/*specificallyaSAMSUNGS3C2440SoC*/
#defineCONFIG_MICRO2440
#defineCONFIG_SKIP_LOWLEVEL_INIT
添加后的界面
保存后退出。
(2)arch/arm/cpu/arm920t/start.S
更改前
更改后(部分截图)
(3)board/samsung/micro2440/micro2440.c
#defineFCLK_SPEED2
#ifFCLK_SPEED==0/*Fout=203MHz,Fin=12MHzforAudio*/
#defineM_MDIV0xC3#defineM_PDIV0x4
#defineM_SDIV0x1#elifFCLK_SPEED==1/*Fout=202.8MHz*/
#defineM_MDIV0xA1
#defineM_PDIV0x3
#defineM_SDIV0x1
#elifFCLK_SPEED==2/*Fout=405MHz*/
#defineM_MDIV0x7F#defineM_PDIV0x2#defineM_SDIV0x1
#endif
#defineUSB_CLOCK2
#ifUSB_CLOCK==0#defineU_M_MDIV0xA1#defineU_M_PDIV0x3#defineU_M_SDIV0x1
#elifUSB_CLOCK==1#defineU_M_MDIV0x48#defineU_M_PDIV0x3
#defineU_M_SDIV0x2
#elifUSB_CLOCK==2/*Fout=48MHz*/
#defineU_M_MDIV0x38#defineU_M_PDIV0x2
#defineU_M_SDIV0x2#endif
intboard_init(void)
{
......
gd->bd->bi_arch_number=MACH_TYPE_MINI2440;
......
}
intdram_init(void)
{
......
gd->ram_size=PHYS_SDRAM_1_SIZE;
return0;
}
更改前
更改后
(4)测试编译环境[@linuxidcu-boot-2011.03]$makemicro2440_config
从图中可以看出在编译环境存在两个错误,根据相关提示找到相应的错误发现在start.S文件中存在两个#endif,注释一个后重新编译即可成功
输入make指令后发现micro2440.c文件中依然存在两个错误
更改指令到相应目录中去
查阅micro2440.c中的相应指令可以看出自己修改过程中有部分错误,重新修改后保存再次执行make
即生成相应的uboot.bin文件
8、支持DM9000
(1)include/configs/micro2440.h
执行相关指令进入到文件中
删除
#defineCONFIG_CS8900/*wehaveaCS8900on-board*/
#defineCONFIG_NETMASK255.255.255.0
#defineCONFIG_IPADDR10.0.0.110
#defineCONFIG_SERVERIP10.0.0.1
添加
#defineCONFIG_CMD_NET
#defineCONFIG_DRIVER_DM90001
#defineCONFIG_DM9000_NO_SROM1
#defineCONFIG_DM9000_BASE0x20000300
#defineDM9000_IOCONFIG_DM9000_BASE
#defineDM9000_DATA(CONFIG_DM9000_BASE+4)
#defineCONFIG_CMD_PING
#defineCONFIG_ETHADDR08:
00:
3e:
26:
0a:
5b//开发板MAC地址
#defineCONFIG_NETMASK255.255.255.0
#defineCONFIG_IPADDR192.168.10.126//开发板IP地址
#defineCONFIG_SERVERIP192.168.10.124//主机IP地址
(2)board/samsung/micro2440/micro2440.c
intboard_eth_init(bd_t*bis)
{
intrc=0;
#ifdefCONFIG_CS8900
rc=cs8900_initialize(0,CONFIG_CS8900_BASE);
#endif
//newforDM9000
#ifdefCONFIG_DRIVER_DM9000
rc=dm9000_initialize(bis);
#endif
returnrc;
}
#endif
(3)arch/arm/lib/eabi_compat.c
intraise(intsignum)
{
//newforDM9000
#ifndefCONFIG_MICRO2440
printf("raise:
Signal#%dcaught\n",signum);
//newforDM9000
#endif
return0;
}
(4)drivers/net/dm9000x.c
执行root@ubuntu:
/home/uboot/u-boot-2011.03#makemicro2440_config
再执行root@ubuntu:
/home/uboot/u-boot-2011.03#make
即可生成相应uboot.bin文件
9、支持内核启动
(1)include/conskfigs/micro2440.h
添加
#defineCONFIG_SETUP_MEMORY_TAGS1//如果没有定义这个参数,则uboot参数必须加入men=内存大小
#defineCONFIG_INITRD_TAG1
#defineCONFIG_CMDLINE_TAG1//设置bootargs出入内核必须
#defineCONFIG_BOOTARGS"noinitrdroot=/dev/mtdblock3init=/linuxrcconsole=ttySAC0"
(2)arch/arm/lib/bootm.c
(3)自动启动内核(此步未做)
如果要自动启动内核,需要在include/conskfigs/micro2440.h定义CONFIG_BOOTCOMMAND,类似如下内容:
#defineCONFIG_BOOTCOMMAND"nandread0x300080000x600000x300000;bootm0x30008000"
执行root@ubuntu:
/home/uboot/u-boot-2011.03#makemicro2440_config
再执行make
即可生成相应的uboot.bin文件
10、支持NandFlash
(1)添加s3c2440_nand.c(部分截图)
(2)drivers/mtd/nand/Makefile
添加
#defineCONFIG_MTD_DEVICE
#defineCONFIG_NAND_S3C2440
#defineCONFIG_CMD_NAND#ifdefined(CONFIG_CMD_NAND)
#defineCONFIG_SYS_NAND_BASE0x4E000000//Nand配置寄存器基地址
#defineCONFIG_SYS_MAX_NAND_DEVICE1
#defineCONFIG_MTD_NAND_VERIFY_WRITE1
#endif
#defineCONFIG_ENV_IS_IN_NAND1
#defineCONFIG_ENV_OFFSET0x40000//将环境变量保存到nand中的0x40000位置
#defineCONFIG_ENV_SIZE0x10000/*TotalSizeofEnvironmentSector*/
执行makemicro2440_config
再执行make
出现以下问题
按照相关说明去重后,又出现了新的问题
在老师的指导和同学的帮助下更改后即成功编译了并生成了相应的bin文件
11、支持yaffs下载
(1)在include/conskfigs/micro2440.h中添加相应宏定义
添加后的图形如下所示
(2)在drivers/mtd/nand/nand_util.c做相应的更改(部分截图)
(3)按照相应参考做更改后即执行make指令
在drivers/mtd/nand/nand_util.c中添加关于withoob之后再进行编译即可生成相应的bin文件
12、支持NandFlash启动
(1)创建nand_read.c
(2)更改board/samsung/micro2440/Makefile
(3)更改arch/arm/cpu/arm920t/u-boot.lds
(4)更改arch/arm/cpu/arm920t/start.S(部分截图)
(5)更改include/configs/micro2440.h
(6)更改arch/arm/lib/board.c
全部更改后执行make
出现相应的错误,再查阅资料和老师的指导下成功编译
13、测试阶段
首先选择v下载编译成功的u-boot.bin文件
然后按b启动内核
将开发板从Nor打到NandFlash,关闭电源后重启
说明已经可以支持NandFlash启动了。
四、思考题
4.1、Bootloader的结构分两部分,简述各部分的功能。
分为stage1和stage2两个阶段。
stage1完成的工作:
硬件设备初始化。
为加载Bootloader的stage2准备RAM空间。
拷贝Bootloader的stage2到RAM空间中。
设置堆栈。
跳转到stage2的C入口点。
stage2完成的工作:
初始化本阶段要使用到的硬件设备。
监测系统内存映射。
将内核映像和根文件系统映像从Flash设备上复制到RAM空间中。
设置内核启动参数。
调用启动内核。
4.2、ARM常用的Bootloader程序有哪些?
简要说明。
1.U-BOOT介绍
uboot是一个庞大的公开源码的软件。
他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。
其代码可以从
U-BOOT是由PPCBOOT发展起来的,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案,从官方版本0.3.2开始全面支持SC系列单板机。
u-boot是一个opensource的bootloader,目前版本是0.4.0。
u-boot是在ppcboot以及armboot的基础上发展而来,虽然宣称是0.4.0版本,却相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。
由于其开发源代码,其支持的开发板众多。
唯一遗憾的是并不支持我们现在学习所用samsung44B0X的开发板。
为什么我们需要u-boot?
显然可以将ucLinux直接烧入flash,从而不需要额外的引导装载程序(bootloader)。
但是从软件升级的角度以及程序修补的来说,软件的自动更新非常重要。
事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的自动更新的需要就说明我们的开发是必要的。
同时,u-boot移植的过程也是一个对嵌入式系统包括软硬件以及操作系统加深理解的一个过程。
2.vivi介绍(下载地址
vivi是韩国mizi公司开发的bootloader,适用于ARM9处理器。
Vivi有两种工作模式:
启动加载模式和下载模式。
启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。
在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,如下:
命令
功能
Load
把二进制文件载入Flash或RAM
Part
操作MTD分区信息。
显示、增加、删除、复位、保存MTD分区
Param
设置参数
Boot
启动系统
Flash
管理Flash,如删除Flash的数据
vivi代码分析
vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多条文件。
Vivi主要包括下面几个目录:
arch:
此目录包括了所有vivi支持