基于ARM9嵌入式Linux引导程序111.docx
《基于ARM9嵌入式Linux引导程序111.docx》由会员分享,可在线阅读,更多相关《基于ARM9嵌入式Linux引导程序111.docx(24页珍藏版)》请在冰点文库上搜索。
基于ARM9嵌入式Linux引导程序111
《基于ARM9嵌入式Linux引导程序
研究与移植》
嵌入式综合实验报告
专业:
电子信息工程
班级:
电子071
姓名:
武超
学号:
079064209
指导教师:
马小陆
2010年7月4日
目录
1、实验意义……………………………………………………2
2、综合实验报告内容…………………………………………2
2.1交叉编译器的制作……………………………………2
2.2vivi引导程序的移植…………………………………5
3、总结…………………………………………………………22
1、实验意义
此次嵌入式课程设计,使我熟悉Linux的一些基本命令和开发环境;同时也理解了交叉编译器制作的三种方法和vivi引导程序的移植过程,学会怎样给Flash分区并学会通过串口烧写vivi、内核、根文件系统和应用程序,课程设计的过程很快乐,实验的过程也很磨炼人的耐性,同样也增加了我对Linux的兴趣!
2、综合实验报告内容
2.1、交叉编译器的制作。
交叉开发工具链的配置大体有三种方法,第一种是下载别人已做好的工具链,当然这是最省事的方法,第二种是到网上下载crosstool,第三种是最有趣的,也是最能体现自己能力的方式,自己一步一步制作交叉开发工具链交,这个过程富有挑战性。
我采用的是第二种方法。
编译过程必须在普通用户模式下运行,用root用户不行。
编译前需要下载一些软件,当然不下载也行,crosstool会自动帮你下载,但crosstool用wget下载,速度会很慢,有一些Linux还没有该下载命令,所以最好在windows环境下通过专门的下载软件下载所需要的软件,然后通过share件传到linux系统中。
根据后面脚本中说指定的的版本,下载软件及版本如下:
binutils-2.16.1.tar.bz2
glibc-linuxthreads-2.3.6.tar.bz2
glibc-2.3.2.tar.gz
gcc-3.3.6.tar.bz2
linux-libc-headers-2.6.12.0.tar.bz2
linux-2.4.21.tar.bz2
crosstool-0.43.tar.gz
以上软件放在Linux的/mnt/hgfs/share中。
仍以root身份登陆,在/下输入以下命令:
mkdirdownloads
mkdircrosstool
将下载的软件复制到/download中。
将crosstool-0.43.tar.gz复制到/crosstool中,
解压缩
tarzxvfcrosstool-0.43.tar.gz
从终端进入crosstool-0.43
1)demo-arm.sh:
#videmo-arm.sh:
修改以下两个路径为
TARBALLS_DIR=/download下载的软件包存放的地址
RESULT_TOP=/crosstool交叉编译环境安装在这里
2)arm.dat:
#viarm.dat
TARGET=arm-linux#修改交叉编译软件的前缀
3)gcc-4.1.0-glibc-2.3.6-tls.dat
#vigcc-3.4.5-glibc-2.3.6-tls.dat
BINUTILS_DIR=binutils-2.16.1
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
4)最后在用户模式下执行demo-arm.sh就可以了./demo-arm.sh数小时后出现如下图所示:
:
修改环境
2.2、vivi引导程序的移植。
博创2410板子上本身有vivi引导程序和2.4内核,将针对博创2410板子重新制作vivi引导程序,重新引导原有2.4内核。
vivi的移植方法步骤:
(1)对vivi进行移植修改;
(2)对vivi进行配置、编译;
(3)烧写vivi;
(4)测试vivi;
本文选择vivi-20030929版本。
它不仅提供对ARM-920T内核的支持,而且直接提供了对于S3C2410x的板级支持,这使移植工作量相对减少。
2.2.1对vivi进行移植修改
1.修改vivi/Makefile
1)修改交叉编译库和头文件路径
(1)修改编译器路径。
将:
CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
修改为:
CROSS_COMPILE=符合本机的路径
本机CROSS_COMPILE的路径为:
CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
(2)修改编译器库文件路径。
将:
ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
修改为:
ARM_GCC_LIBS=符合本机的路径
本机ARM_GCC_LIBS的路径为:
ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
2)Linux内核包含文件路径
将:
LINUX_INCLUDE_DIR=/usr/local/arm/2.95.3/include
修改Linux头文件所在路径:
LINUX_INCLUDE_DIR=符合本机的
本机LINUX_INCLUDE_DIR的路径为:
LINUX_INCLUDE_DIR=/usr/local/arm/2.95.3/include
2.修改vivi中与硬件相关的部分
与具体运行在哪一个处理器平台上相关的文件都存放在vivi/arch/目录下,本系统使用S3C2410x处理器,对应的目录为s3c2410。
其中head.s文件是vivi启动配置代码,加电复位运行的代码就是从这里开始的。
由于该文件中对处理器的配置均通过调用外部定义常数或宏来实现,所以针对不同的平台,只要是S3C2410x处理器,几乎不用修改,只要修改外部定义的初始值即可。
这部分初始值都在vivi/include/platform/smdk2410.h文件中定义,包括处理器时钟、存储器初始化、通用I/O口初始化以及vivi初始配置等。
3.支持NandFlash启动的修改(vivi/arch/s3c2410/smdk.c)
1)修改NandFlash分区
系统存储器使用64MB的NandFlash,因此vivi要从NandFlash启动。
NandFlash只适合用来存放数据,不能够直接在其上执行程序指令。
为了支持NandFlash的系统引导,S3C2410具备一个内部SRAM缓冲器,叫做Steppingstone。
当系统启动时,NandFlash存储器的前面4KB将被自动载入到Steppingstone中,然后系统自动执行这些载入的引导代码。
NandFlash的最开始部分是head.S,在head.S的尾部vivi将执行copy_myself代码段将自身拷贝到RAM中,然后跳转到RAM中的main()函数,开始运行。
我们将系统的64MNandFlash进行了重新分区,其具体分区如表7-2所示:
表7-2NandFlash进行了重新分区表
名称(name)
起始地址(offset)
大小(size)
引导程序(vivi)
0x00000000
0x00020000(128k)
参数(param)
0x00020000
0x00010000(64k)
内核(kernel)
0x00030000
0x00200000(2M)
根文件系统(root)
0x00230000
0x00400000(4M)
应用程序(jffs2)
0x00630000
0x039d0000(57M+832k)
因此,从NandFlash中启动需要作修改:
#ifdefCONFIG_S3C2410_NAND_BOOT
mtd_partition_tdefault_mtd_partitions[]={
{
name:
"vivi",
offset:
0,
size:
0x00020000,//128k
flag:
0
},{
name:
"param",
offset:
0x00030000,
size:
0x00010000,//64k
flag:
0
},{
name:
"kernel",
offset:
0x00030000,
size:
0x00200000,//2M
flag:
0
},{
name:
"root",
offset:
0x00230000,
size:
0x00400000,//4M
flag:
MF_BONFS
},{
name:
"jffs2",
offset:
0x00630000,
size:
0x039D0000,
flag:
MF_JFFS2
}
};
#endif
2)修改默认参数
vivi_parameter_tdefault_vivi_parameters[]={
{"mach_type", MACH_TYPE, NULL},
{"media_type", MT_S3C2410, NULL},
{"boot_mem_base", 0x30000000, NULL},
{"baudrate", UART_BAUD_RATE, NULL},
{"xmodem_one_nak", 0, NULL},
{"xmodem_initial_timeout", 300000, NULL},
{"xmodem_timeout", 30000000, NULL},
{"ymodem_initial_timeout", 1500000, NULL},
{"boot_delay", 0x1000, NULL}
};
xmodem_timeout需要调整到30000000,不然你在使用下载时候很容易出现下载失败的信息,如:
“Retry0:
NAKonsector”;
"boot_delay"o为下载模式(DownLoading)下时间延时,在这段时间里,如果开发人员不输入任何vivi中的命令,则vivi将自动引导内核。
本系统修改为:
0x1000000。
3)修改启动命令
在intdefault_nb_params=ARRAY_SIZE(default_vivi_parameters);下添加:
charlinux_cmd[]="noinitrdroot=/dev/mtdblock3init=/linuxrcconsole=ttyS0,115200rootfstype=cramfsdevfs=mountmem=64M";
式中启动命令:
noinitrd:
不使用ramdisk;
root:
根文件系统所在的MTD(本系统为第四个分区);
init:
内核运行入口命令文件;
console:
内核信息输出控制台;
ttySAC0:
表示串口,115200表示波特率,这是2.6内核的串口名,这是为了方便引导第八章制作的2.6内核,如果是引导2.4内核则用串口名称为:
ttyS0。
rootfstype:
挂载的根文件系统类型,根据自己的根文件系统来修改,本教材制作的根文件系统是cramfs;
devfs:
2.6内核采用内核使用devfs(DeviceFileSystem);
mem:
Flash存储器大小;
4)修改后编译通过的vivismdk.c源代码:
#include"config.h"
#include"machine.h"
#include"vivi.h"
#include"priv_data.h"
#include"mtd/map.h"
#include"boot_kernel.h"
#include"command.h"
#include"time.h"
#ifdefCONFIG_S3C2410_NAND_BOOT
mtd_partition_tdefault_mtd_partitions[]={
{
name:
"vivi",
offset:
0,
size:
0x00020000,
flag:
0
},{
name:
"param",
offset:
0x00020000,
size:
0x00010000,
flag:
0
},{
name:
"kernel",
offset:
0x00030000,
size:
0x00200000,//2Msector
flag:
0
},{
name:
"root",
offset:
0x00230000,
size:
0x00400000,
flag:
MF_BONFS
},{
name:
"jffs2",
offset:
0x00630000,
size:
0x039D0000,
flag:
MF_BONFS
}
};
#endif
#ifdefCONFIG_S3C2410_AMD_BOOT
mtd_partition_tdefault_mtd_partitions[]={
{
name:
"vivi",
offset:
0,
size:
0x00020000,
flag:
0
},{
name:
"param",
offset:
0x00020000,
size:
0x00010000,
flag:
0
},{
name:
"kernel",
offset:
0x00030000,
size:
0x000C0000,
flag:
0
},{
name:
"root",
offset:
0x00100000,
size:
0x00140000,
flag:
MF_BONFS
}
};
#endif
intdefault_nb_part=ARRAY_SIZE(default_mtd_partitions);
#ifdefCONFIG_S3C2410_NAND_BOOT
#defineMT_S3C2410MT_SMC_S3C2410
#endif
#ifdefCONFIG_S3C2410_AMD_BOOT
#defineMT_S3C2410MT_NOR_FLASH
#endif
vivi_parameter_tdefault_vivi_parameters[]={
{"mach_type",MACH_TYPE,NULL},
{"media_type",MT_S3C2410,NULL},
{"boot_mem_base",0x30000000,NULL},
{"baudrate",UART_BAUD_RATE,NULL},
{"xmodem_one_nak",0,NULL},
{"xmodem_initial_timeout",300000,NULL},
{"xmodem_timeout",30000000,NULL},
{"ymodem_initial_timeout",1500000,NULL},
{"boot_delay",0x1000000,NULL}
};
intdefault_nb_params=ARRAY_SIZE(default_vivi_parameters);
charlinux_cmd[]="noinitrdroot=/dev/mtdblock3init=/linuxrcconsole=ttyS0,
115200rootfstype=cramfsdevfs=mountmem=64M";
voidset_vpp(structmap_info*map,intvpp)
{
}
voidset_gpios(void)
{
GPACON=vGPACON;
GPBCON=vGPBCON;
GPBUP=vGPBUP;
GPCCON=vGPCCON;
GPCUP=vGPCUP;
GPDCON=vGPDCON;
GPDUP=vGPDUP;
GPECON=vGPECON;
GPEUP=vGPEUP;
GPFCON=vGPFCON;
GPFUP=vGPFUP;
GPGCON=vGPGCON;
GPGUP=vGPGUP;
GPHCON=vGPHCON;
GPHUP=vGPHUP;
EXTINT0=vEXTINT0;
EXTINT1=vEXTINT1;
EXTINT2=vEXTINT2;
}
intboard_init(void)
{
init_time();
set_gpios();
return0;
}
externuser_command_tcpu_cmd;
intmisc(void)
{
add_command(&cpu_cmd);
return0;
}
4、对vivi进行配置与编译
进入vivi目录执行“makeclean”,在编译之前将vivi里所有的“.o”和“.o.flag”文件删除。
输入“makemenuconfig”进入配置界面,,如图7-10所示,进行对vivi裁剪。
图7-10vivi配置界面
一些主要配置和说明如下:
SystemType(系统类型)--->
(S3C2410-based)ARMSystemtype(ARM系统类型)
()SA1100–based
()PXA250/210–based
()S3C2400–based
(x)S3C2410–based
Implementations(启动位置)--->
(SMDK)Platform
(x)SMDK
()MPORT3
()MPORT1
[*]SupportNANDBoot(支持NAND启动)
[]SupportAMDBoot(支持AMD启动)
---LowLevelHardwareDebugging(底层调试-硬件级)
[]Enablesimplememorytest(简单的存储器测试)
GeneralSetup(通用设置)--->
[]DefineTEXTAddress(定义文本地址)
(0)vivibaseaddressvivi(起始地址)
[]supportresethandler(支持复位处理程序)
SerialPort(串口)--->
[*]SerialPort(UART)support(串口支持)
[*]Supportserialterminal(支持串口终端)
(EXTENDED)Userinterface(用户界面)
()STANDARD(标准)
(x)EXTENDED(扩展)
---Ports(端口)
[*]SupportUART0(支持UART0)
[]SupportUART1(支持UART1)
[]SupportUART2(支持UART2)
[]SupportUART3(支持UART3)
---TransferProtocol传输协议
[*]SupportX–Modem(支持XModem传输)
[]SupportY–Modem(支持YModem传输)
[]SupportZ–Modem(支持ZModem传输)
其它选项可采用默认配置。
输入“make”对vivi进行编译,make没有错误,编译后在当前目录下会生成vivi的二进制代码文件vivi,如下图所示,这样就可将其烧写进开发板中,验证是否能将内核引导起来。
2.2.2、烧写vivi
开发板上已经存在vivi,可以用串口烧写;
1.串口下载vivi
1)建立超级终端
运行Windows2000系统下开始→程序→附件→通讯→超级终端(HyperTerminal),新建一个通信终端。
如果要求输入区号、电话号码等信息请随意输入,出现如下2.2.2—1图所示对话框时,为所建超级终端取名为arm,可以为其选一个图标。
单击“确定”按钮。
图2.2.2—1
在接下来的对话框中选择ARM开发平台实际连接的PC串口(如COM1),按确定后出现如下图2.2.2—2所示的属性对话框,设置通信的格式和协议。
这里波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。
按确定完成设置。
图2.2.2—2
完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。
用串口线将PC机串口和平台UART0正确连接后,就可以在超级终端上看到实验平台程序输出的信息。
2)格式化flash
打开超级终端,先按住PC机键盘的BackSpace键,然后启动2410-S,进入vivi,按照以下命令格式化flash,重新分区,如下图2.2.2—3所示:
vivi>bonpart0128k192k2240k6336k:
m65536k回车
图2.2.2—3格式化flash
3)烧写vivi
这时已格式化flash,运行的是SDRAM中的vivi。
注意如果这时重启或断电会丢失所有数据,否则必须用Jtag重新烧写vivi。
vivi>loadflashvivix回车。
点击超级终端任务栏上“传送”下拉菜单中的“发送文件”,选择协议为Xmodem,选择镜像文件vivi,点击“发送”,如图2.2.2—4,10秒左右vivi就烧写到