Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1289132
  • 博文数量: 632
  • 博客积分: 2778
  • 博客等级: 大尉
  • 技术积分: 3387
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 09:09
个人简介

123

文章分类

全部博文(632)

文章存档

2014年(36)

2013年(33)

2012年(563)

分类:

2012-06-14 17:59:08

嵌入式系统移植三部曲
 
一、           BootLoader的移植

二、           Linux内核的移植

三、           根文件系统的移植
准备工作:安装SkyEye

SkyEye可以仿真出多种嵌入式开发板和外设,在安装SkyEye的过程中,就等于是在模拟出一个开发板。

SkyEye的安装过程:

1、下载skyeye-1.2.6_rc1,对其进行解压;

[root@localhost Desktop]# tar -xjvf skyeye-1.2.6_rc1.tar.bz2 -C ./

2、编译安装skyeye-1.2.6;

[root@localhost Desktop]# cd skyeye-1.2.6_rc1

[root@localhost skyeye-1.2.6_rc1]# gedit INSTALL       //编译安装信息

[root@localhost skyeye-1.2.6_rc1]# ./configure               //配置

[root@localhost skyeye-1.2.6_rc1]# make                            //编译

                                                                      [root@localhost skyeye-1.2.6_rc1]# make install      //安装

[root@localhost skyeye-1.2.6_rc1]# ll /usr/local/bin/skyeye

出现 -rwxr-xr-x 1 root root 2544308 05-17 17:59 /usr/local/bin/skyeye

则安装成功。

   

一、BootLoader的移植

BootLoader是加电后的第一个运行程序,它可以初始化开发板的硬件设备,将内核映像从硬盘上读到RAM中,从而跳转到linux的内核入口去执行程序,这样就可以启动操作系统了。由于BootLoader是第一个执行的程序,所以它和开发板的体系结构有很大的关系。

 

BootLoader的移植过程:

所需文件:交叉编译器:arm-linux-gcc2.95.3.tar.bz2,

Bootloader:u-boot-1.1.4.tar.bz2

1.解压u-boot-1.1.4.tar.bz2 和gcc2.95.3编译器

[root@localhost Desktop]# tar -xjvf u-boot-1.1.4.tar.bz2  -C ./

[root@localhost Desktop]# tar -xjvf arm-linux-gcc-2.95.3.tar.bz2 -C /usr/local/arm

 

2.编辑u-boot根目录中的Makefile文件

   [root@localhost u-boot-1.1.4]# gedit Makefile

   将

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-linux-

endif

改为

ifeq ($(ARCH),arm)

CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-

endif

 



smdk2410_config       :       unconfig

              @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

后面添加

ok2410_config       :       unconfig

              @./mkconfig $(@:_config=) arm arm920t ok2410 NULL s3c24x0

3.复制必要的文件,编辑ok2410.h头文件

[root@localhost u-boot-1.1.4]# mkdir board/ok2410

[root@localhost u-boot-1.1.4]# cp board/smdk2410/* board/ok2410/

[root@localhost u-boot-1.1.4]# mv board/ok2410/smdk2410.c board/ok2410/ok2410.c

[root@localhost u-boot-1.1.4]# cp include/configs/smdk2410.h include/configs/ok2410.h

[root@localhost u-boot-1.1.4]# gedit include/configs/ok2410.h

   将

#define       CFG_PROMPT              "SMDK2410 # "       /* Monitor Command Prompt       */

改为

#define       CFG_PROMPT              "OK2410 # "       /* Monitor Command Prompt       */

4.编辑board/ok2410/Makefile文件

[root@localhost u-boot-1.1.4]# gedit board/ok2410/Makefile



OBJS       := smdk2410.o flash.o

改为

OBJS       := ok2410.o flash.o

5.配置、编译u-boot

   [root@localhost u-boot-1.1.4]# make ok2410_config

   [root@localhost u-boot-1.1.4]# make

6.编辑skyeye.conf文件

  [root@localhost u-boot-1.1.4]# gedit skyeye.conf

# skyeye config file for S3C2410X

cpu: arm920t

mach: s3c2410x

# physical memory

mem_bank: map=M, type=RW, addr=0x00000000, size=0x00800000, file=./u-boot.bin ,boot=yes

mem_bank: map=M, type=RW, addr=0x30000000, size=0x00800000

mem_bank: map=M, type=RW, addr=0x30800000, size=0x00800000

mem_bank: map=M, type=RW, addr=0x31000000, size=0x03000000

# all peripherals I/O mapping area

mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000

mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020

 

net: type=cs8900a, base=0x19000300, size=0x20,int=9, mac=08:00:3E:26:0A:5B, ethmod=tuntap, hostip=10.0.0.1

nandflash: type=s3c2410x,name=K9F1208U0B,dump=./nand.dump

#lcd:type=s3c2410x, mod=gtk

dbct:state=on
7.执行skyeye1.2.6

[root@localhost u-boot-1.1.4]# skyeye1.2.6

出现结果:

************************ WARNING ****************************

If you want to run ELF image, you should use -e option to indicate

your elf-format image filename. Or you only want to run binary image,

you need to set the filename of the image and its entry in skyeye.conf.

*************************************************************

Your elf file is little endian.  //省略部分信息

In:    serial

Out:   serial

Err:   serial

OK2410 #

8.移植nand

[root@localhost u-boot-1.1.4]# gedit cpu/arm920t/start.S

9.修改board/ok2410/Makefile

[root@localhost u-boot-1.1.4]# gedit board/ok2410/Makefile



OBJS       := ok2410.o flash.o

改为

OBJS       := ok2410.o flash.o nand_read.o

10.创建board/ok2410/nand_read.c文件

[root@localhost u-boot-1.1.4]# gedit board/ok2410/nand_read.c

11.编辑include/configs/ok2410.h文件

[root@localhost u-boot-1.1.4]# gedit include/configs/ok2410.h

12.编译u-boot,测试u-boot是否可以从nand启动

 [root@localhost u-boot-1.1.4]# make

[root@localhost u-boot-1.1.4]# skyeye1.2.6 //再次执行skyeye1.2.6

13.对u-boot添加nand指令的支持

[root@localhost u-boot-1.1.4]# gedit include/configs/ok2410.h

[root@localhost u-boot-1.1.4]# gedit board/ok2410/ok2410.c

[root@localhost u-boot-1.1.4]# gedit common/cmd_nand.c
14.编译、测试

[root@localhost u-boot-1.1.4]# make

[root@localhost u-boot-1.1.4]# ./mknandflashdump u-boot.bin nand.dump 0

[root@localhost u-boot-1.1.4]# skyeye1.2.6

  出现如第7步结果;

到目前为止,BootLoader的移植完毕;

二、Linux内核的移植

   内核作为操作系统的核心,管理系统的进程、存储设备、文件系统等。内核移植是至关重要的一部分;

linux内核移植的过程:

需要文件:linux-2.6.14.7.tar.bz2  cs8900.c和cs8900.h

        arm-linux-gcc3.4.1.tar.bz2

在移植之前要搭建tftp服务器:

查看tftp的配置文件:

[root@localhost Desktop]# gedit /etc/xinetd.d/tftp

[root@localhost Desktop]#chmod -R 755 /tftpboot

[root@localhost Desktop]#service xinetd restart

1.解压linux-2.6.14.7.tar.bz2

[root@localhost Desktop]# tar -xjvf linux-2.6.14.7.tar.bz2 -C ./

[root@localhost Desktop]#tar -xjvf arm-linux-gcc3.4.1.tar.bz2 -C ./

2.编辑Makefile文件

[root@localhost Desktop]# cd linux-2.6.14.7

[root@localhost linux-2.6.14.7]# gedit Makefile



ARCH              ?= $(SUBARCH)

CROSS_COMPILE       ?=

改为

ARCH              ?= arm

CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux-

3、对cs8900网卡的移植

[root@localhost linux-2.6.14.7]# cp ../cs8900/cs8900.c drivers/net/arm/

[root@localhost linux-2.6.14.7]# cp ../cs8900/cs8900.h drivers/net/arm/

[root@localhost linux-2.6.14.7]# gedit drivers/net/arm/Kconfig

[root@localhost linux-2.6.14.7]# gedit drivers/net/arm/Makefile

4.编辑arch/arm/mach-s3c2410/mach-smdk2410.c文件

[root@localhost linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/mach-smdk2410.c

5.在include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件

[root@localhost linux-2.6.14.7]# gedit include/asm-arm/arch-s3c2410/smdk2410.h

6.设置Flash分区

要编辑3个文件:devs.c、mach-smdk2410.c、s3c2410.c。

[root@localhost linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/devs.c

[root@localhost linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/mach-smdk2410.c

[root@localhost linux-2.6.14.7]# gedit drivers/mtd/nand/s3c2410.c



              chip->eccmode           = NAND_ECC_SOFT;

改为

              chip->eccmode           = NAND_ECC_NONE;

7.配置内核

[root@localhost linux-2.6.14.7]# gedit fs/Kconfig

[root@localhost linux-2.6.14.7]# cp arch/arm/configs/smdk2410_defconfig .config

[root@localhost linux-2.6.14.7]# make smdk2410_defconfig

[root@localhost linux-2.6.14.7]# make menuconfig

8.编译内核,创建uImage,将uImage复制到tftp服务器的根目录(/tftpboot/)

[root@localhost linux-2.6.14.7]# make

[root@localhost linux-2.6.14.7]# cp arch/arm/boot/compressed/vmlinux ../u-boot-1.1.4/tools/

[root@localhost linux-2.6.14.7]# cd ../u-boot-1.1.4/tools/

[root@localhost tools]# ./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008000 -n linux-2.6.14.7 -d vmlinux uImage

[root@localhost tools]# cp uImage  ../

[root@localhost tools]# cp initrd.img  ../

[root@localhost tools]# cp uImage /tftpboot/

[root@localhost tools]# cp initrd.img /tftpboot/

[root@localhost tools]# cp ../u-boot.bin /tftpboot/

[root@localhost tools]# cp initrd.img /tmp/nfs/

[root@localhost tools]# iptables -F

[root@localhost tools]# cd ..
9.执行skyeye1.2.6,通过u-boot-1.1.4引导linux-2.6.14.7

[root@localhost u-boot-1.1.4]# skyeye1.2.6

**************************** WARNING ***************************

If you want to run ELF image, you should use -e option to indicate

your elf-format image filename. Or you only want to run binary image,

you need to set the filename of the image and its entry in skyeye.conf.

*****************************************************************

Your elf file is little endian.

arch: arm       //省略部分信息;

*** Warning - bad CRC, using default environment

In:    serial

Out:   serial

Err:   serial

Hit any key to stop autoboot:  0

OK2410 #setenv bootargs noinitrd mem=64M root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200

OK2410 # tftp 0x31000000 uImage

OK2410 # bootm 31000000

## Booting image at 31000000 ...

//此时应该进行第三步,根文件系统的移植;

 

三、根文件系统的移植

  linux启动后第一个必须挂载的是根文件系统,若不能挂载根文件系统,则系统会出错自动退出;

  根文件系统移植的过程:
移植根文件系统所需文件:busybox-1.13.4.tar.bz2

1.解压busybox-1.13.4.tar.bz2

[root@localhost Desktop]# tar -xjvf busybox-1.13.4.tar.bz2 -C ./
2.编辑Makefile文件

[root@localhost busybox-1.13.4]# gedit Makefile



CROSS_COMPILE ?=

改为

CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-



ARCH ?= $(SUBARCH)

改为

ARCH ?= arm

3.进行默认配置

[root@localhost busybox-1.13.4]# make defconfig       //恢复默认配置

4.对配置信息进行修改

[root@localhost busybox-1.13.4]# make menuconfig
5.编译

[root@localhost busybox-1.13.4]# make
6.对配置信息进行修改

1)在/tmp/nfs中创建所需的目录

[root@localhost nfs]# mkdir -p bin sbin lib/modules etc/init.d dev usr/bin usr/sbin usr/lib proc sys  home root boot mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp var/lib var/lock var/log var/run var/tmp tmp

注意:其中bin、dev、etc、lib、proc、sbin、sys、usr是必备的8个目录。

[root@localhost nfs]# chmod 1777 tmp

[root@localhost nfs]# chmod 1777 var/tmp

[root@localhost dev]# mknod -m 600 console c 5 1

[root@localhost dev]# mknod -m 666 null c 1 3

(2)复制文件到/tmp/nfs中

[root@localhost _install]# cp -a bin /tmp/nfs/

[root@localhost _install]# cp -a sbin /tmp/nfs/

[root@localhost _install]# cp -a linuxrc /tmp/nfs/

[root@localhost _install]# cd ..

[root@localhost busybox-1.13.4]# cp -a examples/bootfloppy/etc/* /tmp/nfs/etc/

7.创建配置文件

(1)编写etc/inittab文件、修改其权限

[root@localhost nfs]# gedit etc/inittab

[root@localhost nfs]# chmod 755 etc/inittab

(2)编写etc/init.d/rcS文件、修改其权限

[root@localhost nfs]# gedit etc/init.d/rcS

[root@localhost nfs]# chmod 755 etc/init.d/rcS

(3)编写etc/fstab文件、修改其权限

[root@localhost nfs]# gedit etc/fstab

[root@localhost nfs]# chmod 755 etc/fstab

(4)编写etc/proflie文件、修改其权限

[root@localhost nfs]# gedit etc/proflie

(5)创建密码文件、修改其权限

[root@localhost nfs]# cp /etc/passwd etc/ ;cp /etc/shadow etc/ ;cp /etc/group etc/

[root@localhost nfs]# chmod 600 etc/shadow

[root@localhost nfs]# gedit etc/passwd

[root@localhost nfs]# gedit etc/shadow

(6)为mdev创建配置文件

[root@localhost nfs]# gedit etc/mdev.conf

(7)删除备份文件

[root@localhost nfs]# rm etc/*~ etc/init.d/*~
8.复制常用的库文件

编写脚本文件copy_lib.sh。

[root@localhost nfs]# gedit copy_lib.sh

[root@localhost nfs]# chmod a+x copy_lib.sh

[root@localhost nfs]# cp copy_lib.sh /usr/local/arm/3.4.1/arm-linux/lib/

[root@localhost nfs]# cd /usr/local/arm/3.4.1/arm-linux/lib/

[root@localhost lib]# ./copy_lib.sh

[root@localhost lib]# cd -

 

完整的启动过程:

通过tftp将操作系统内核下载到开发板,内核引导时通过NFS挂载根文件系统。

(1)重启tftp服务器

[root@localhost Desktop]# service xinetd restart

(2)编辑/etc/exports文件

[root@localhost Desktop]# gedit /etc/exports

/tmp/nfs *(rw,sync,no_root_squash)

(3)重启NFS服务器

[root@localhost u-boot-1.1.4]# service nfs restart

[root@localhost u-boot-1.1.4]# exportfs

[root@localhost u-boot-1.1.4]# exportfs -ra       //重新扫描配置文件

(4)完整的启动过程(u-boot、内核、文件系统、用户程序),使用NFS文件系统

[root@localhost u-boot-1.1.4]# skyeye1.2.6

************************** WARNING ***************************

If you want to run ELF image, you should use -e option to indicate

your elf-format image filename. Or you only want to run binary image,

you need to set the filename of the image and its entry in skyeye.conf.

*****************************************************************

……                     //省略部分信息;

Hit any key to stop autoboot:  0

OK2410 # run bootcmd

TFTP from server 10.0.0.1; our IP address is 10.0.0.110

   //省略部分信息;

Freeing init memory: 92K

#mount all.......

******************************************************************

                   OK 2410 Rootfs made by yql, 2011,06

******************************************************************

10.0.0.110 login: root

login[25]: root login on 'console'

 Processing /etc/profile... Set search library path in /etc/profile

Set user path in /etc/profile

Configure net done

All Done

[root@10 root]#

以上所述是通过tftp将操作系统内核下载到开发板,内核引导时通过NFS挂载根文件系统      ;另一种启动方式即将uImage烧写到nand flash上,烧写过程如下面所述的两种启动方式的第二种。

四、错误分析

BootLoader移植过程中:

1、在第2步中:

    ①将

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-linux-

Endif

改为

ifeq ($(ARCH),arm)

CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-

Endif

   因为这里交叉编译器指定为

CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux- ,所以要安装arm-linux-gcc-2.95.3;

因为没有事先安装,所以在配置、编译u-boot时出错;

linux内核的移植:

1、在第3步中:编辑Makefile文件

[root@localhost linux-2.6.14.7]# gedit Makefile



ARCH              ?= $(SUBARCH)

CROSS_COMPILE       ?=

改为

ARCH              ?= arm

CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux-       //linux2.6.14的交叉编译器为gcc-3.4.1

在改写过程中CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux-

注意交叉编译环境改写;

2、第10步中:配置内核

   需要安装yaffs文件系统;

3、tftp服务器搭建的过程中:

  [root@localhost Desktop]#chmod -R 755 /tftpbooot

4、启动时注意防火墙的设置;

 

 五、启动的两种方式:

1、通过nfs

   内核文件在宿主机上,开发板(skyeye)启动时,通过tftp将操作系统内核下载到开发板,内核引导时通过NFS挂载根文件系统      ,这种方法需要tftp和nfs服务器的支持,在开发的过程中这种方法是经常使用的。

    上面所述的过程即是通过这种方式启动的;

2、通过nand flash,开发板自行启动

这种方法需要将内核文件烧写到开发板上,当然这需要在开发板上建立文件系统,建立文件系统的过程如298页创建的Cramfs文件系统。(其他的文件系统也可)

建立文件系统后,开始内核烧写:

OK2410 # tftp 0x31000000 uImage

OK2410 # nand erase 0x00100000 0x00300000

OK2410 # nand write 0x31000000 0x00100000 0x00300000

OK2410 # setenv bootcmd‘nand read 0x31000000 0x00100000 0x00300000;bootm 0x31000000’

OK2410 # saveenv

烧写到nand flash上后,再次启动skyeye时就会自行显示是在nand flash上启动,而不需要在从宿主机传送;
阅读(283) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~