开发板:FL2440
交叉编译工具:arm-linux-gcc-3.3.2
编译平台:rhel-server-6.0
Linux内核:linux-2.6.28.7
busybox-1.1.3
文件系统:Yaffs2
文件系统制作工具:http://arm9download.cncncn.com/linux/mkyaffs2image.tgz
内核制作
1.给内核打上补丁,使内核对yaffs2文件系统支持。
下载最新的驱动http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2.tar.gz?view=tar
解压yaffs2和linux-2.6.28.7放在同一根目录,执行:
tar zxvfyaffs2.tar.gz
cd yaffs2
./patch-ker.sh c ../linux-2.6.28.7
成功后打印信息:
Updating /file/fl/linux-2.6.28.7/fs/Kconfig
Updating /file/fl/linux-2.6.28.7/fs/Makefile
2.修改机器码。进入内核目录,修改机器码跟bootloader的机器码一致(FL2440为193)
[root@ localhost linux-2.6.28.7]#vi arch/arm/tools/mach-types
首先删除以下行:
s3c2410 ARCH_S3C2410 S3C2410 182
然后将以下行:
s3c2440 ARCH_S3C2440 S3C2440 362
修改为:
s3c2440 ARCH_S3C2440 S3C2440 193
3.指定目标板machine、编译器和编译器路径。修改Makefile文件,注意将CROSS_COMPILE对应到你系统中交叉编译器地址
[root@ localhost linux-2.6.28.7]# vi Makefile
将两行:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为以下两行:
ARCH ?= arm
CROSS_COMPILE ?=/usr/local/arm/3.3.2/bin/arm-linux-
4.增加devfs文件管理器的支持。
[root@ localhost linux-2.6.28.7]#vi fs/Kconfig
找到以下行:
menu "Pseudo filesystems"
在此行后面增加以下内容:
config DEVFS_FS
bool "/dev file system support(OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount atboot"
default y
depends on DEVFS_FS
5.修改晶振频率( 可解决打印信息乱码问题 )。修改文件arch/arm/mach-s3c2440/mach-smdk2440.c
[root@ localhost linux-2.6.28.7]#vi arch/arm/mach-s3c2440/mach-smdk2440.c
将如下行:
s3c24xx_init_clocks(16934400);
修改为:
s3c24xx_init_clocks(12000000);
6.修改MTD分区。打开文件arch/arm/plat-s3c24xx/common-smdk.c,此处注意两个地方:
一、必须跟bootloader分区一样。
二、文件系统fs_yaffs必须在第4个分区,即索引号为3。
其他一些分区信息可以不要,如下:
[root@ localhost linux-2.6.28.7]#vi arch/arm/plat-s3c24xx/common-smdk.c
找到static struct mtd_partitionsmdk_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
[root@ localhost linux-2.6.28.7]#vi drivers/mtd/nand/s3c2410.c
将以下行:
chip->ecc.mode = NAND_ECC_SOFT;
修改为:
chip->ecc.mode = NAND_ECC_NONE;
8.修改nandflash驱动,支持K9F1G08的nandflash。文件为:drivers/mtd/nand/nand_bbt.c
[root@ localhost linux-2.6.28.7]#vi drivers/mtd/nand/nand_bbt.c
将以下两个部分进行修改
static struct nand_bbt_descrlargepage_memorybased = {
.options = 0,
.offs = 0,
.len = 1, //原始值为2,改成1
.pattern = scan_ff_pattern
};
static struct nand_bbt_descrlargepage_flashbased = {
.options = NAND_BBT_SCAN2NDPAGE,
.offs = 0,
.len = 2, //原始值为2,改成1
.pattern = scan_ff_pattern
};
9.把s3c2410的默认配置写入config文件(有的yaffs2可能会出错)。
在/ linux-2.6.28.7/arch/arm/configs目录找到s3c2410_defconfig文件放在/linux-2.6.28.7根目录中,执行命令:make s3c2410_defconfig
[root@ localhost linux-2.6.28.7]#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: unknownoption "boot"
make[1]: *** [s3c2410_defconfig] 错误 1
make: *** [s3c2410_defconfig] 错误 2
以上出现错误,主要是补丁造成,修改fs/yaffs2/Kconfig的179行,将boot改成bool,即改成如下:
bool "Disable yaffs2 blockrefreshing"
[root@ localhost linux-2.6.28.7]#make s3c2410_defconfig
#
# configuration written to .config
#
10.配置内核,注意System Type中,S3C2440中只选择以下内容即可。
[root@ localhost linux-2.6.28.7]#make menuconfig
配置CPU选项(记得跟S3C2440 Machines平级的其它以及子项都不选)
System Type --->
S3C2440Machines --->
[*] 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
11.最后制作内核。
[root@WEB188 linux-2.6.33]#make zImage