Chinaunix首页 | 论坛 | 博客
  • 博客访问: 236731
  • 博文数量: 60
  • 博客积分: 1509
  • 博客等级: 上尉
  • 技术积分: 882
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-15 10:30
文章分类

全部博文(60)

文章存档

2012年(2)

2011年(58)

分类: 嵌入式

2011-02-12 17:35:13

买了FL2440也有一段时间了,一直扔在抽屉里没有拿出来折腾。前一阵子突然想到他,花了几百块买了一块开发板就这样让他养老实在不划算。于是乎心血来潮想让他发挥余热,也希望自己能学到多一点的东西。好吧,FL2440之旅就此开始。

本次移植内核并不包括各种驱动,当然内核自带的除外,在接下来的时间内我会慢慢把驱动移植或编写完善,当然这些过程得感谢网络上很多强人的无私分享。本内核移植过程如下:

移植环境:

fedora 14 (2.6.33.7)

FL2440(nandflash:K9F1G08 128m)

arm-linux-gcc 4.3.2

1、为linux-2.6.33.7内核打上支持yaffs文件系统的补丁。

到这个网址可以下载linux内核,我下载的是。另外为了使linux内核支持yaffs2文件系统,还需要到下载一个补丁。这个步骤很重要,如果yaffs2不正确,可能引起无法正常编译通过)

#cd

#tar -xjvf linux-2.6.33.7.tar.bz2

#tar -xzvf yaffs2.tar.gz

#cd yaffs2

#./patch-ker.sh c ../linux-2.6.33.7/

 

Updating ../linux-2.6.33.7//fs/Kconfig

Updating ../linux-2.6.33.7//fs/Makefile


出现上述两行字样,则表示已经打好补丁。

 

2、修改顶层Makefile,使内核支持arm平台。

为了让内核编译成arm平台可用的内核,需在顶层的Makefile上做出相应的修改:

#vim Makefile

ARCH ?= $(SUBARCH) CROSS_COMPILE ?=

修改为:

ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/4.3.2/bin/arm-linux-


3、修改机器码,要和FL2440的机器码相同。

飞凌开发板的bootloader默认的机器码是193,所以我们在使用smdk2440机器的时候,需要修改机器码。修改arch/arm/tools/ mach-types。

#vim arch/arm/tools/ mach-types

将该行注释:

s3c2410                 ARCH_S3C2410            S3C2410                 182

然后将以下行:

s3c2440                 ARCH_S3C2440            S3C2440                 362

修改为:

s3c2440                 ARCH_S3C2440            S3C2440                 193


4、增加devfs设备文件系统的支持。

#vim 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


5、修改2440晶振的频率。

如果用默认的晶振频率,串口将会输出乱码,而无法看到启动信息。

#vim arch/arm/mach-s3c2440/mach-smdk2440.c

将如下行注释:

s3c24xx_init_clocks(16934400);

并在原位置增加一行为:

s3c24xx_init_clocks(12000000);


 

6、修改NandFlash的分区信息和硬件信息。

  一、内核中关于nandflash的分区必须跟bootloader分区一样;

二、文件系统fs_yaffs必须在第4个分区,即索引号为3。其他一些分区信息可以按需要选择,如下:

# vim arch/arm/plat-s3c24xx/common-smdk.c

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

        [0] = {

                .name        = "boot",

                .size       = 0x00020000,

                .offset = 0

        },

        [1] = {

                .name        = "bootParam",

                .size          = 0x00060000,

                .offset = 0x00020000,

        },

        [2] = {

                .name      = "Kernel",

                .size        = 0x00300000,

                .offset = 0x00500000,

        },

        [3] = {

                .name        = "fs_yaffs",

                .size        = 0x03c00000,

                .offset = 0x00800000,

        },       

        [4] = {

                .name        = "eboot",

                .size        = 0x00080000,

                .offset = 0x04400000,

        },

        [5] = {

                .name        = "WINCE",

                .size        = 0x03b80000,

                .offset = 0x04480000,

        }


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

# vim drivers/mtd/nand/s3c2410.c

将以下行:

chip->ecc.mode      = NAND_ECC_SOFT;

修改为:

chip->ecc.mode      = NAND_ECC_NONE;

 

8、修改nandflash驱动,适应FL2440开发板上的K9F1G08 128的flash芯片。

 

# vi drivers/mtd/nand/nand_bbt.c

将以下两个部分进行修改

static struct nand_bbt_descr largepage_memorybased = {

        .options = 0,

        .offs = 0,

        .len = 1, // 原数值为2,支持2K每页的flash修改为1。K9F1G08,K9F2G08是2k每页的flash

        .pattern = scan_ff_pattern

};

static struct nand_bbt_descr largepage_flashbased = {

        .options = NAND_BBT_SCAN2NDPAGE,

        .offs = 0,

        .len = 1, // 原数值为2,支持2K每页的flash修改为1。K9F1G08,K9F2G08是2k每页的flash

        .pattern = scan_ff_pattern

};

 

至此,已经为fl2440配置好一个简单的内核,此时将配置信息写入config文件:

#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

#

# configuration written to .config

#

 

12、配置内核。

 

# make menuconfig

配置CPU选项(记得跟S3C2440 Machines平级的其它以及子项都不选)去掉S3C2400 Machines、S3C2410 Machines(留下

S3C2410 Machines  --->  [*] SMDK2410/A9M2410    留下这项就够了,其他全部“N”掉)、S3C2412 Machines、S3C2442 Machines的所有选项,否则会报错。如果现在编译内核,下载到开发板中,内核就可以正常启动了。具体如下。
  1. General setup --->
  2.     [*] Configure standard kernel features (for small systems) --->
  3.     [*] Enable 16-bit UID system calls
  4.     [*] Sysctl syscall support
  5.     [*] Load all symbols for debugging/ksymoops
  6.         [ ] Include all symbols in kallsyms
  7.         [ ] Do an extra kallsyms pass
  8. System Type --->
  9.     S3C2400 Machines --->
  10.     S3C2410 Machines --->
  11.         [*] SMDK2410/A9M2410
  12.         [ ] IPAQ H1940
  13.         [ ] Acer N30 family
  14.             [ ] Simtec Electronics BAST (EB2410ITX)
  15.         [ ] NexVision OTOM Board
  16.         [ ] AML M5900 Series
  17.         [ ] TCT Hammer Board
  18.         [ ] Thorco
  19.     S3C2412 Machines --->
  20.         [ ] Logitech Jive
  21.         [ ] SMDK2413
  22.             [ ] SMDK2412
  23.             [ ] VMSTMS
  24.         S3C2440 Machines --->
  25.             [ ] Simtec Electronics ANUBIS
  26.         [ ] Simtec IM2440D20 (OSIRIS) module
  27.         [ ] HP iPAQ rx3715
  28.         [*] SMDK2440
  29.         [ ] NexVision NEXCODER 2440 Light Board
  30.             [*] SMDK2440 with S3C2440 CPU module
  31.         [ ] Avantech AT2440EVB development board
  32.             [ ] MINI2440 development board
  33.         S3C2442 Machines --->
  34.         [ ] SMDM2440 with S3C2442 CPU module
  35.         [ ] Openmoko GTA02 / Freerunner phone
  36.         S3C2443 Machines --->
  37.         [ ] SMDK2443
  38. Boot options --->
  39.     (0x0) Compressed ROM boot loader base address
  40.     (0x0) Compressed ROM boot loader BSS address
  41.     (noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 Default command string
  42.     [ ] Kernel Execute-In-Place from ROM
  43.     [ ] Kexec system call (EXPERIMENTAL)
  44. Device Drivers --->
  45.     <*> Memory Technology Device (MTD) support --->
  46.     <*> NAND Device Support --->
  47.     [ ] Verify NAND page writes
  48.     [ ] NAND ECC Smart Media byte order
  49.     [ ] Enable chip ids for obsolete ancient NAND devices
  50.     < > GPIO NAND Flash driver
  51.     <*> NAND Flash support for Samsung S3C SoCs
  52.     [ ] Samsung S3C NAND driver debug
  53.     [ ] Samsung S3C NAND Hardware ECC
  54.     [ ] Samsung S3C NAND IDLE clock stop
  55.     < > DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)
  56.     < > Support for NAND Flash Simulator
  57.     < > Support for generic platform NAND driver
  58.     < > MTD driver for Olympus MAUSB-10 and Fujifilm DPC-R1
  59. File systems --->
  60.     [*] Miscellaneous filesystems --->
  61.             <*> YAFFS2 file system support
  62.             -*- 512 byte / page devices
  63.                 -*- 2048 byte (or larger) / page devices
  64.                 [*] Autoselect yaffs2 format
  65.                 [*] Cache short names in RAM

13、移植成功。

配置完成后,执行以下命令即可编译生成zImage内核镜像。

#make

#make zImage

把内核zImage通过DNW烧写进FL2440(文件系统用开发板自带的linux-2.6.28下的touch.yaffs)并运行:

#uname -r

2.6.33.7

即宣告移植linux-2.6.33.7内核成功。当然这只是一个很初级的内核,这是看到的LCD显示异常,其他外围器件也不能正常工作。这就需要接下来继续驱动移植和编写工作。

注:

对文件系统进行一系列的操作之后,直接断电,然后重新启动后,挂载文件系统时可能会出现如下提示信息:

yaffs: dev is 32505863 name is "mtdblock7"

yaffs: passed flags ""

yaffs: Attempting MTD mount on 31.7, "mtdblock7"

Partially written block 13 detected

Partially written block 13 detected

Partially written block 13 detected

Partially written block 13 detected

yaffs_read_super: isCheckpointed 0

Please press Enter to activate this console. ls

[root@localhost /]#

这种提示信息是正常的,Partially written block 在正常使用时,文件系统的垃圾收集程序将会处理。

可以屏蔽这个信息,或者仅在YAFFS_TRACE_SCAN的时候显示这个信息,修改yaffs_guts.c文件的6668行,将

  T(YAFFS_TRACE_ALWAYS,

   (TSTR("Partially written block %d detected" TENDSTR),

   blk));

改为:

  T(YAFFS_TRACE_SCAN,

   (TSTR("Partially written block %d detected" TENDSTR),

   blk));

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