分类: 嵌入式
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(留下
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));