资源描述
. . . . 基于ARM9嵌入式Linux引导程序研究与移植嵌入式综合实验报告专 业: 电子信息工程 班 级: 电子071 姓 名: 武 超 学 号: 079064209 指导教师: 马小陆 2010年 7 月 4 日目 录1、实验意义22、综合实验报告容2 2.1交叉编译器的制作 22.2 vivi引导程序的移植53、总结221、实验意义此次嵌入式课程设计,使我熟悉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.bz2linux-2.4.21.tar.bz2 crosstool-0.43.tar.gz以上软件放在Linux的/mnt/hgfs/share中。仍以root身份登陆,在/下输入以下命令:mkdir downloadsmkdir crosstool将下载的软件复制到/download中。将crosstool-0.43.tar.gz复制到/crosstool中,解压缩tar zxvf crosstool-0.43.tar.gz从终端进入crosstool-0.431)demo-arm.sh:# vi demo-arm.sh:修改以下两个路径为TARBALLS_DIR=/download下载的软件包存放的地址RESULT_TOP=/crosstool 交叉编译环境安装在这里2)arm.dat:#vi arm.datTARGET=arm-linux #修改交叉编译软件的前缀3)gcc-4.1.0-glibc-2.3.6-tls.dat # vi gcc-3.4.5-glibc-2.3.6-tls.datBINUTILS_DIR= binutils-2.16.1GCC_DIR= gcc-3.3.6GLIBC_DIR= glibc-2.3.2LINUX_SANITIZED_HEADER_DIR= linux-libc-headers-2.6.12.0GLIBCTHREADS_FILENAME= glibc-linuxthreads-2.3.64)最后在用户模式下执行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/Makefile1) 修改交叉编译库和头文件路径(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.32) 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/include2修改vivi中与硬件相关的部分与具体运行在哪一个处理器平台上相关的文件都存放在vivi/arch/目录下,本系统使用S3C2410x处理器,对应的目录为s3c2410。其中head.s文件是vivi启动配置代码,加电复位运行的代码就是从这里开始的。由于该文件中对处理器的配置均通过调用外部定义常数或宏来实现,所以针对不同的平台,只要是S3C2410x处理器,几乎不用修改,只要修改外部定义的初始值即可。这部分初始值都在 vivi/include/platform/smdk2410.h文件中定义,包括处理器时钟、存储器初始化、通用I/O口初始化以与vivi初始配置等。3支持Nand Flash启动的修改(vivi/arch/s3c2410/smdk.c)1) 修改Nand Flash分区系统存储器使用 64 MB的 Nand Flash,因此vivi要从Nand Flash启动。Nand Flash只适合用来存放数据,不能够直接在其上执行程序指令。为了支持 Nand Flash的系统引导,S3C2410具备一个部 SRAM缓冲器,叫做 Steppingstone。当系统启动时,Nand Flash存储器的前面 4 KB将被自动载入到 Steppingstone中,然后系统自动执行这些载入的引导代码。Nand Flash的最开始部分是head. S,在 head.S的尾部 vivi将执行 copy_myself代码段将自身拷贝到RAM中,然后跳转到RAM中的 main()函数,开始运行。我们将系统的64M Nand Flash进行了重新分区,其具体分区如表7-2所示:表7-2 Nand Flash进行了重新分区表名称(name)起始地址(offset)大小(size)引导程序(vivi)0x000000000x00020000(128k)参数(param)0x000200000x00010000(64k)核(kernel)0x000300000x00200000(2M)根文件系统(root)0x002300000x00400000(4M)应用程序(jffs2)0x006300000x039d0000(57M+832k)因此,从Nand Flash中启动需要作修改:#ifdef CONFIG_S3C2410_NAND_BOOTmtd_partition_t default_mtd_partitions = name:vivi,offset:0,size:0x00020000,/128kflag:0 , name:param,offset:0x00030000,size:0x00010000, /64kflag:0 , name:kernel,offset:0x00030000,size:0x00200000, /2Mflag:0 , name:root,offset:0x00230000,size:0x00400000,/4Mflag:MF_BONFS , name:jffs2,offset:0x00630000,size:0x039D0000,flag:MF_JFFS2 ; #endif 2) 修改默认参数vivi_parameter_t default_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,不然你在使用下载时候很容易出现下载失败的信息,如:“Retry 0: NAK on sector”;boot_delayo 为下载模式(Down Loading)下时间延时,在这段时间里,如果开发人员不输入任何vivi中的命令,则vivi将自动引导核。本系统修改为:0x1000000。3) 修改启动命令在 int default_nb_params = ARRAY_SIZE(default_vivi_parameters);下添加: char linux_cmd = noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttyS0,115200 rootfstype=cramfs devfs=mount mem=64M;式中启动命令:noinitrd:不使用ramdisk;root:根文件系统所在的MTD(本系统为第四个分区);init:核运行入口命令文件;console:核信息输出控制台;ttySAC0:表示串口,115200表示波特率,这是2.6核的串口名,这是为了方便引导第八章制作的2.6核,如果是引导2.4核则用串口名称为:ttyS0。rootfstype:挂载的根文件系统类型,根据自己的根文件系统来修改,本教材制作的根文件系统是cramfs;devfs :2.6核采用核使用devfs (Device File System);mem :Flash存储器大小;4) 修改后编译通过的vivi smdk.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#ifdef CONFIG_S3C2410_NAND_BOOTmtd_partition_t default_mtd_partitions = name:vivi,offset:0,size:0x00020000,flag:0, name:param,offset:0x00020000,size:0x00010000,flag:0, name:kernel,offset:0x00030000,size:0x00200000, / 2M sector flag:0, name:root,offset:0x00230000, size:0x00400000, flag:MF_BONFS, name:jffs2,offset:0x00630000, size:0x039D0000, flag:MF_BONFS;#endif#ifdef CONFIG_S3C2410_AMD_BOOTmtd_partition_t default_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;#endifint default_nb_part = ARRAY_SIZE(default_mtd_partitions);#ifdef CONFIG_S3C2410_NAND_BOOT#define MT_S3C2410MT_SMC_S3C2410#endif#ifdef CONFIG_S3C2410_AMD_BOOT#define MT_S3C2410MT_NOR_FLASH#endifvivi_parameter_t default_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 ;int default_nb_params = ARRAY_SIZE(default_vivi_parameters);char linux_cmd = noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttyS0,115200 rootfstype=cramfs devfs=mount mem=64M;void set_vpp(struct map_info *map, int vpp)void set_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;int board_init(void)init_time();set_gpios();return 0;extern user_command_t cpu_cmd;int misc(void)add_command(&cpu_cmd);return 0;4、对vivi进行配置与编译进入 vivi目录执行 “make clean”,在编译之前将 vivi里所有的“ . o”和“ . o. flag”文件删除。输入“make menuconfig”进入配置界面,,如图7-10所示,进行对 vivi 裁剪。图7-10 vivi配置界面一些主要配置和说明如下:System Type(系统类型) -(S3C2410-based) ARM System type( ARM系统类型)( ) SA1100 based( ) PXA250/210 based( ) S3C2400 based(x) S3C2410 basedImplementations(启动位置) -(SMDK)Platform(x)SMDK( )MPORT3( )MPORT1*Support NAND Boot(支持NAND启动) Support AMD Boot(支持AMD启动)- Low Level Hardware Debugging(底层调试-硬件级) Enable simple memory test(简单的存储器测试)General Setup(通用设置) - Define TEXT Address(定义文本地址)(0) vivi base addressvivi(起始地址) support reset handler(支持复位处理程序)Serial Port(串口) -* Serial Port (UART) support(串口支持)* Support serial terminal(支持串口终端)( EXTENDED)User interface(用户界面)( )STANDARD(标准)( x)EXTENDED(扩展)- Ports(端口)* Support UART 0(支持UART0) Support UART 1(支持UART1) Support UART 2(支持UART2) Support UART 3(支持UART3)- Transfer Protocol传输协议* Support X Modem(支持 X Modem 传输) Support Y Modem(支持 Y Modem 传输) Support Z Modem(支持 Z Modem 传输)其它选项可采用默认配置。输入“make”对vivi进行编译,make没有错误,编译后在当前目录下会生成vivi的二进制代码文件vivi,如下图所示,这样就可将其烧写进开发板中,验证是否能将核引导起来。2.2.2、烧写vivi开发板上已经存在vivi,可以用串口烧写;1.串口下载vivi1)建立超级终端运行Windows2000系统下开始程序附件通讯超级终端(HyperTerminal),新建一个通信终端。如果要求输入区号、等信息请随意输入,出现如下2.2.21图所示对话框时,为所建超级终端取名为arm,可以为其选 一个图标。单击“确定”按钮。图2.2.21在接下来的对话框中选择ARM 开发平台实际连接的PC串口(如COM1),按确定后出现如下图2.2.22所示的属性对话框,设置通信的格式和协议。这里波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。按确定完成设置。图2.2.22完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。 用串口线将PC 机串口和平台UART0 正确连接后,就可以在超级终端上看到实验平台程序输出的信息。2) 格式化flash 打开超级终端,先按住PC机键盘的Back Space键,然后启动2410-S,进入vivi,按照以下命令格式化flash,重新分区,如下图2.2.23所示: vivibon part 0 128k 192k 2240k 6336k:m 65536k回车图2.2.23 格式化flash3) 烧写vivi 这时已格式化flash,运行的是SDRAM中的vivi。注意如果这时重启或断电会丢失所有数据,否则必须用Jtag重新烧写vivi。viviload flash vivi x 回车。点击超级终端任务栏上“传送”下拉菜单中的“发送文件”,选择协议为Xmodem,选择镜像文件vivi,点击“发送”,如图2.2.24,10秒左右vivi就烧写到flash里了。图2.2.44 串口烧写vivi4)烧写核映象zImage viviload flash kernel x 回车 出现提示:Ready for downloading using xmodem. Waiting.点击超级终端任务栏上“传送”下拉菜单中的“发送文件”,选择协议为Xmodem,选择镜像文件zImage (光盘/linux-V5.1/img中),点击“发送”,如图2.2.25,4分钟左 右zImage传输完毕,zImage 先传输到SDRAM中,再把数据从SDRAM 复制到flash 里,请等待这一过程结束到出现vivi,再烧写root,否则会导致烧写kernel 失败。 图 2.2.255)烧写根文件系统(root) viviload flash root x 回车 出现提示:Ready for downloading using xmodem. Waiting.点击超级终端任务栏上“传送”下拉菜单中的“发送文件”,选择镜像文件root.cramfs(光盘/linux-V5.1/img)中,协议为Xmodem,点击“发送”,如图2.2.26,8 分钟左右root.cramfs 烧写完毕;图2.2.26烧写完后,重启试验箱。6)网口下载烧写应用程序 用2410-S 实验箱配套网线连接好2410-S网口和PC机的网口,重启2410-S进入linux 操作系统的/mnt/yaffs下,注意配置IP在同一网段,执行以下指令: /mnt/yaffsifconfig 查看IP /mnt/yaffsifconfig eth0 192.168.0.111 配置eth0 IP /mnt/yaffsinetd 启动ftp(见图4.8)执行结果如图2.2.27 打开ftp 软件FlashFXP(在光盘中/img/flashvivi 目录中 提供),点击界面中上部黄色闪电符号,建立快速连接,输入地址192.168.0.111,用户名:root,密码:无。连接进入ftp服务(见图4.8),上传“yaffs.tar.bz2”光盘/linux-V5.1/img中到2410-S 的/var 文件夹下,3 分钟左右上传完毕。图2.2.27图2.2.28这时不能重启2410-S,否则上传过程白费。接下来在超级终端中输入:/mnt/yaffscd . 转换到/mnt 下/mntrm -rf /yaffs/* 删除/yaffs 下文件/mntcd /var 转到var 目录下/vartar xjvf yaffs.tar.bz2 C /mnt/yaffs 解压 yaffs.tar.bz2 到mnt/yaffs 目录下如图4.9 所示,注意大小写(C 为大写),需5 分钟左右解压缩结束,整个烧写实验就完成了。重启试验箱。/mnt/cd . /cd mplayer /mplayer mplayer test.avi 实验完成。3.总结 课程设计的过程中遇到一些问题,我在制作交叉编译器的过程中,对一些操作不是很理解,通过在网上查看资料,获益匪浅。制作完的编译器用在对vivi的移植中出现了错误,我用的编译工具是crosstool-0.43.出现的错误如下图所示我的交叉编译器的文件夹路径为 /cross,此文件夹是我自己在根目录下建立的。做的这个gcc 经过在终端输入 arm-linux-gccversion 验证是可以的。在vivi移植的过程中,我修改了vivi下的Makefile中的路径,也就是将编译器路径、编译器库文件路径和核包含文件路径修改为自己gcc所复合的路径。其它步骤与上面介绍一样,然后在vivi中make 出现上图所示错误。 实验带给了我们乐趣,学习本该如此,生活亦该如此。23 / 24
展开阅读全文