Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208861
  • 博文数量: 56
  • 博客积分: 1085
  • 博客等级: 少尉
  • 技术积分: 652
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-29 13:50
文章分类
文章存档

2014年(4)

2012年(25)

2011年(27)

我的朋友

分类: Delphi

2012-02-14 15:54:29

FL2440开发板内核移植笔记

参考:

宿主机:Redhat Linux AS4

目标机:s3c2440

交叉编译器:arm-linux-gcc-3.4.1

交叉编译器路径:/usr/local/arm/3.4.1

要移植的内核版本:linux-2.6.33

文件系统类型: yaffs2 (目前使用光盘中linux-2.6.28的文件系统touch.yaffs

笔记作者:japleak

 

1、  下载内核linux-2.6.33.tar.gz(  中可以找到),然后还需要下载yaffs2文件系统,目的是为了给内核打补丁。下载地址为: (此步骤很重要,如果yaffs2不正确,可能引起无法正常编译通过)

2、  将下载的文件存放在/usr/src/中。

3、  分别解压缩:

[root@WEB188 src]# tar xzf linux-2.6.33.tar.gz

[root@WEB188 src]# tar xzf yaffs2.tar.gz

4、  为内核增加yaffs2补丁

[root@WEB188 src]# cd yaffs2

[root@WEB188 yaffs2]# ./patch-ker.sh c ../linux-2.6.33/

Updating ../linux-2.6.33//fs/Kconfig

Updating ../linux-2.6.33//fs/Makefile

5、  修改机器码。进入内核目录,修改机器码跟bootloader的机器码一致(FL2440193

[root@WEB188 yaffs2]# cd ../linux-2.6.33

[root@WEB188 linux-2.6.33]#vi arch/arm/tools/mach-types

首先删除以下行:

s3c2410                 ARCH_S3C2410            S3C2410                 182

然后将以下行:

s3c2440                 ARCH_S3C2440            S3C2440                 362

修改为:

s3c2440                 ARCH_S3C2440            S3C2440                 193

6、  指定目标板machine、编译器和编译器路径。修改Makefile文件,注意将CROSS_COMPILE对应到你系统中交叉编译器地址

[root@WEB188 yaffs2]# vi Makefile

将两行:

ARCH            ?= $(SUBARCH)

CROSS_COMPILE   ?=

修改为以下两行:

ARCH            ?= arm

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

7、  增加devfs文件管理器的支持。

[root@WEB188 linux-2.6.33]# vi fs/Kconfig

找到以下行:

menu "Pseudo filesystems"

在此行后面增加以下内容:

config DEVFS_FS

         bool "/dev file system support (OBSOLETE)"

         default y   

config DEVFS_MOUNT

bool "Automatically mount at boot"

default y

depends on DEVFS_FS

8、  修改晶振频率( 可解决打印信息乱码问题 )。修改文件arch/arm/mach-s3c2440/mach-smdk2440.c

[root@WEB188 linux-2.6.33]# vi arch/arm/mach-s3c2440/mach-smdk2440.c

将如下行:

s3c24xx_init_clocks(16934400);

修改为:

s3c24xx_init_clocks(12000000);

9、  修改MTD分区。打开文件arch/arm/plat-s3c24xx/common-smdk.c,此处注意两个地方:一、必须跟bootloader分区一样,二、文件系统fs_yaffs必须在第4个分区,即索引号为3。其他一些分区信息可以不要,如下:

[root@WEB188 linux-2.6.33]# vi arch/arm/plat-s3c24xx/common-smdk.c

(此部分的MTD分区要与uboot中的分区相同,否则移植后会出现

    Kernel panic - not  syncing :VFS: Unable to mount root fs on unknown-block...)

(本人的uboot是用开发板自带的bootloader,先将开发板自带的linux内核加载进去然后从开启内核的串口终端上查看uboot中分区情况例如

Creating 5 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00100000 : "Boot"
0x00140000-0x00640000 : "MyApp"
0x00500000-0x00d00000 : "Kernel"
0x00800000-0x04c00000 : "fs_yaffs"
0x04400000-0x0c400000 : "WINCE"

那么在编写自己MTD分区就根据这个来,分区的大小和起始地址不能错!!

不需要完全一致,但是需要相应分区的起始地址以及分区size一致!!!)

找到static struct mtd_partition smdk_default_nand_part[]的结构体,将内容修改为:

            [0] = {
                .name        = "Boot",
                .size        = 0x00100000,
                .offset = 0
        },
        [1] = {
                .name        = "MyApp",
                .size        = 0x00500000,
                .offset = 0x00140000,
        },
        [2] = {
                .name        = "Kernel",
                .size        = 0x00800000,
                .offset = 0x00500000,
        },
        [3] = {
                .name        = "fs_yaffs",
                .size        = 0x04400000,
                .offset = 0x00800000,
        },       
 [4] = {
                .name        = "WINCE",
                .size        = 0x08000000,
                .offset = 0x04400000,
        }

10、              关闭ECC校验。修改文件drivers/mtd/nand/s3c2410.c

[root@WEB188 linux-2.6.33]# vi drivers/mtd/nand/s3c2410.c

将以下行:

chip->ecc.mode      = NAND_ECC_SOFT;

修改为:

chip->ecc.mode      = NAND_ECC_NONE;

11、              修改nandflash驱动,支持K9F1G08nandflash。文件为:drivers/mtd/nand/nand_bbt.c

[root@WEB188 linux-2.6.33]# vi drivers/mtd/nand/nand_bbt.c

将以下两个部分进行修改

static struct nand_bbt_descr largepage_memorybased = {

        .options = 0,

        .offs = 0,

        .len = 1, //原始值为2,改成1

        .pattern = scan_ff_pattern

};

static struct nand_bbt_descr largepage_flashbased = {

        .options = NAND_BBT_SCAN2NDPAGE,

        .offs = 0,

        .len = 2, //原始值为2,改成1

        .pattern = scan_ff_pattern

};

12、              s3c2410的默认配置写入config文件(有的yaffs2可能会出错)。

[root@WEB188 linux-2.6.33]# make s3c2410_defconfig

  HOSTCC  scripts/basic/fixdep

  HOSTCC  scripts/basic/docproc

  HOSTCC  scripts/basic/hash

  HOSTCC  scripts/kconfig/conf.o

  HOSTCC  scripts/kconfig/kxgettext.o

  SHIPPED scripts/kconfig/zconf.tab.c

  SHIPPED scripts/kconfig/lex.zconf.c

  SHIPPED scripts/kconfig/zconf.hash.c

  HOSTCC  scripts/kconfig/zconf.tab.o

  HOSTLD  scripts/kconfig/conf

fs/yaffs2/Kconfig:179: unknown option "boot"

make[1]: *** [s3c2410_defconfig] 错误 1

make: *** [s3c2410_defconfig] 错误 2

13、              以上出现错误,主要是补丁造成,修改fs/yaffs2/Kconfig179行,将boot改成bool,即改成如下:

bool "Disable yaffs2 block refreshing"

[root@WEB188 linux-2.6.33]# make s3c2410_defconfig

#

# configuration written to .config

#

14、              配置内核,注意System Type中,S3C2440中只选择以下内容即可。

[root@WEB188 linux-2.6.33]# make menuconfig

配置CPU选项(记得跟S3C2440 Machines平级的其它以及子项都不选)

System Type  --->

    S3C2440 Machines  --->

        [*] SMDK2440

        [*] SMDK2440 with S3C2440 CPU module

配置yaffs2选项

File systems  --->

    [*] Miscellaneous filesystems  --->

        <*>   YAFFS2 file system support

            -*-     512 byte / page devices

            -*-     2048 byte (or larger) / page devices

                [*]       Autoselect yaffs2 format

                [*]     Cache short names in RAM

15、              最后等着基本内核大功告成把。

[root@WEB188 linux-2.6.33]# make zImage

此时的内核是没有根文件系统的内核,后续要构建根文件系统!!!

阅读(1712) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~