宿主机:Redhat 9.0
目标机:s3c2440_fl2440
交叉编译器:arm-linux-gcc-3.4.1
交叉编译器路径:/home/thk8246/fl/file
要移植的内核版本:linux-2.6.33
文件系统类型: yaffs2 (目前使用光盘中linux-2.6.28的文件系统touch.yaffs)
个人体会:第一次移植linux内核没有加驱动,但是成功了,有点小高兴!虽然参考了飞凌的官方资料,里面有详细的步骤,但是某些方面还是不懂,比如nandflash驱动,原始值为2,为什么要改成1等等,但是我相信,久而久之,我就知其然,又知其所以然的。因为这linux学习不是一朝一夕之功呀!贵在坚持吗!
2、 将下载的文件存放在/home/thk8246/fl/source中。
3、 分别解压缩:
[root@localhost source]# tar xzf linux-2.6.33.tar.gz -C ../file
[root@localhost source]# tar xzf yaffs2.tar.gz -C ../fil
4、 为内核增加yaffs2补丁
[root@localhost source]# cd ../file
[root@localhost file]# cd yaffs2
[root@localhost 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的机器码一致(FL2440为193)
[root@localhost yaffs2]# cd ../linux-2.6.33
[root@localhost 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@localhost linux-2.6.33]# vi Makefile
将两行:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为以下两行:
ARCH ?= arm
CROSS_COMPILE ?=/home/thk8246/fl/file/3.4.1/bin/arm-linux-
7、 增加devfs文件管理器的支持。修改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
将如下行:
s3c24xx_init_clocks(16934400);
修改为:
s3c24xx_init_clocks(12000000);
9、 修改MTD分区。打开文件arch/arm/plat-s3c24xx/common-smdk.c,此处注意两个地方:一、必须跟bootloader分区一样,二、文件系统fs_yaffs必须在第4个分区,即索引号为3。其他一些分区信息可以不要,如下:找到static struct mtd_partition smdk_default_nand_part[]的结构体,将内容修改为:
1 static struct mtd_partition smdk_default_nand_part[] =
2 {
3 [0] = {
4 .name = "Boot",
5 .size = 0x00100000,
6 .offset = 0
7 },
8 [1] = {
9 .name = "MyApp",
10 .size = 0x003c0000,
11 .offset = 0x00140000,
12 },
13 [2] = {
14 .name = "Kernel",
15 .size = 0x00300000,
16 .offset = 0x00500000,
17 },
18 [3] = {
//与bootleader一致,否则挂载不上文件系统
19 .name = "fs_yaffs",
20 .size = 0x03c00000,
21 .offset = 0x00800000,
22 },
23 [4] = {
24 .name = "WINCE",
25 .size = 0x03c00000,
26 .offset = 0x04400000,
27 }
28 };
10、 关闭ECC校验。修改文件drivers/mtd/nand/s3c2410.c
将以下行:
chip->ecc.mode = NAND_ECC_SOFT;
修改为:
chip->ecc.mode = NAND_ECC_NONE;
11、 修改nandflash驱动,支持K9F1G08的nandflash。文件为: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 = 1, //原始值为2,改成1
.pattern = scan_ff_pattern
};
12、 把s3c2410的默认配置写入config文件。
[root@localhost 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
#
# configuration written to .config
#
下面,开始配置内核。
配置内核,注意System Type中,S3C2440中只选择以下内容即可。
[root@ localhost 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
13、 最后等着基本内核大功告成把。
[root@localhost linux-2.6.33]# make zImage