编译该版本内核使用的编译器版本:arm-linux-gcc 3.4.1
1.获取linux-2.6.32.2
2.解压内核
3.切换到刚解压的内核目录下:
cd linux-2.6.32.2
4.修改Makefile
将以下内容修改:
修改前:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=修改后:ARCH ?= arm
CROSS_COMPILE ?= arm-linux-5.使用以下命令生成.config
make s3c2410_defconfig
6.修改平台输入时钟,由于qq2440的输入时钟为12MHz的无源晶振,故修改arch/arm/mach-s3c2440/mach-smdk2440.c文件的以下内容:
修改前:
static void __init smdk2440_map_io(void)
{ s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); s3c24xx_init_clocks(16934400); s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));}修改后:static void __init smdk2440_map_io(void)
{ s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); s3c24xx_init_clocks(12000000);//修改了原来的数据为12000000 s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));}7.修改mtd分区信息,修改arch/arm/plat-s3c24xx/common-smdk.c文件的以下内容:修改前:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = { .name = "Boot Agent", .size = SZ_16K, .offset = 0, }, [1] = { .name = "S3C2410 flash partition 1", .offset = 0, .size = SZ_2M, }, [2] = { .name = "S3C2410 flash partition 2", .offset = SZ_4M, .size = SZ_4M, }, [3] = { .name = "S3C2410 flash partition 3", .offset = SZ_8M, .size = SZ_2M, }, [4] = { .name = "S3C2410 flash partition 4", .offset = SZ_1M * 10, .size = SZ_4M, }, [5] = { .name = "S3C2410 flash partition 5", .offset = SZ_1M * 14, .size = SZ_1M * 10, }, [6] = { .name = "S3C2410 flash partition 6", .offset = SZ_1M * 24, .size = SZ_1M * 24, }, [7] = { .name = "S3C2410 flash partition 7", .offset = SZ_1M * 48, .size = SZ_16M, }};修改后:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = { .name = "Bootloader", .size = 0x00000000, .offset = 0x00030000, }, [1] = { .name = "Kernel", .offset = 0x00050000, .size = 0x00200000, }, [2] = { .name = "Root", .offset = 0x00250000, .size = 0x03dac000, }};
8.修改s3c2440的机器码,修改arch/arm/tools/mach-types文件的内容如下:
修改前:
s3c2440 ARCH_S3C2440 S3C2440 362
修改后:
s3c2440 ARCH_S3C2440 S3C2440 782
9.给内核打yaffs2文件系统的补丁,这样就可以让内核支持yaffs2文件系统
9.1从git仓库获取yaffs2源码,获取源码的命令如下:
git clone git://www.aleph1.co.uk/yaffs2
9.2将内核补丁插入内核,使用如下方法:
a.先进入yaffs2目录下:
cd yaffs2
b.yaffs2目录下有一个脚本patch-ker.sh,那么执行该脚本即可:
./patch-ker.sh ./patch-ker.sh c m ../linux-2.6.32.2
10.内核配置:
使用以下命令进行配置操作:
make menuconfig
需要修改的配置项如下:
10.1[*] Enable loadable module support --->
[*] Forced module loading [*] Module unloading
10.2System Type --->
S3C2410 Machines --->
[*] SMDK2410/A9M2410 ,该条目下的其他都不选
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module,该条目下的其他都不选
其余Machines选项下的条目均不选(不选的有s3c2400,s3c2412,s3c2442,s3c2443)
10.3Boot options --->
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
10.4Userspace binary formats --->
[*] Kernel support for ELF binaries,其余选项均不选
10.5File systems --->
[*] Miscellaneous filesystems --->
<*> yaffs2 file system support
[*] Lets yaffs do its own ECC
10.6-*- Native language support --->
<*> Codepage 437 (United States, Canada)
<*> Simplified Chinese charset (CP936, GB2312)
<*> Traditional Chinese charset (Big5)
<*> NLS ISO 8859-1 (Latin 1; Western European Languages)
<*> NLS UTF-8
11.开始编译内核:
make zImage -j5
11.1出错如下:
In file included from fs/yaffs2/yaffs_guts.c:18:
fs/yaffs2/yaffs_endian.h:32: error: parse error before "swap_loff_t"fs/yaffs2/yaffs_endian.h:32: error: parse error before "lval"fs/yaffs2/yaffs_endian.h:33: warning: return type defaults to `int'fs/yaffs2/yaffs_endian.h:33: warning: function declaration isn't a prototypefs/yaffs2/yaffs_endian.h: In function `swap_loff_t':fs/yaffs2/yaffs_endian.h:34: error: `lval' undeclared (first use in this function)fs/yaffs2/yaffs_endian.h:34: error: (Each undeclared identifier is reported only oncefs/yaffs2/yaffs_endian.h:34: error: for each function it appears in.)fs/yaffs2/yaffs_endian.h:37: error: `Y_LOFF_T' undeclared (first use in this function)fs/yaffs2/yaffs_endian.h:38: error: parse error before "vall"fs/yaffs2/yaffs_endian.h:38: warning: statement with no effect CC fs/proc/uptime.omake[2]: *** [fs/yaffs2/yaffs_guts.o] 错误 1make[2]: *** 正在等待未完成的任务.... CC fs/proc/version.oIn file included from fs/yaffs2/yaffs_checkptrw.c:16:fs/yaffs2/yaffs_endian.h:32: error: parse error before "swap_loff_t"fs/yaffs2/yaffs_endian.h:32: error: parse error before "lval"fs/yaffs2/yaffs_endian.h:33: warning: return type defaults to `int'fs/yaffs2/yaffs_endian.h:33: warning: function declaration isn't a prototypefs/yaffs2/yaffs_endian.h: In function `swap_loff_t':fs/yaffs2/yaffs_endian.h:34: error: `lval' undeclared (first use in this function)fs/yaffs2/yaffs_endian.h:34: error: (Each undeclared identifier is reported only oncefs/yaffs2/yaffs_endian.h:34: error: for each function it appears in.)fs/yaffs2/yaffs_endian.h:37: error: `Y_LOFF_T' undeclared (first use in this function)fs/yaffs2/yaffs_endian.h:38: error: parse error before "vall"fs/yaffs2/yaffs_endian.h:38: warning: statement with no effectmake[2]: *** [fs/yaffs2/yaffs_checkptrw.o] 错误 1make[1]: *** [fs/yaffs2] 错误 2make[1]: *** 正在等待未完成的任务....对策:看来不能使用最新的yaffs2,因此从另一个内核linux-2.35.7将fs/yaffs2文件夹的内容都复制到linux-2.6.32.2/fs/中