分类: Delphi
2012-02-14 15:54:29
FL2440开发板内核移植笔记
参考:
宿主机:Redhat Linux AS4
目标机:s3c2440
交叉编译器:arm-linux-gcc-3.4.1
交叉编译器路径:/usr/local/arm/3.4.1
要移植的内核版本:linux-2.6.33
文件系统类型: yaffs2 (目前使用光盘中linux-2.6.28的文件系统touch.yaffs)
笔记作者:japleak
1、 下载内核linux-2.6.33.tar.gz( 中可以找到),然后还需要下载yaffs2文件系统,目的是为了给内核打补丁。下载地址为: (此步骤很重要,如果yaffs2不正确,可能引起无法正常编译通过)。
2、 将下载的文件存放在/usr/src/中。
3、 分别解压缩:
[root@WEB188 src]# tar xzf linux-2.6.33.tar.gz
[root@WEB188 src]# tar xzf yaffs2.tar.gz
4、 为内核增加yaffs2补丁
[root@WEB188 src]# cd yaffs2
[root@WEB188 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@WEB188 yaffs2]# cd ../linux-2.6.33
[root@WEB188 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@WEB188 yaffs2]# vi Makefile
将两行:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为以下两行:
ARCH ?= arm
CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-
7、 增加devfs文件管理器的支持。
[root@WEB188 linux-2.6.33]# vi 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
[root@WEB188 linux-2.6.33]# vi 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。其他一些分区信息可以不要,如下:
[root@WEB188 linux-2.6.33]# vi arch/arm/plat-s3c24xx/common-smdk.c
(此部分的MTD分区要与uboot中的分区相同,否则移植后会出现
Kernel panic - not syncing :VFS: Unable to mount root fs on unknown-block...)
(本人的uboot是用开发板自带的bootloader,先将开发板自带的linux内核加载进去然后从开启内核的串口终端上查看uboot中分区情况例如
Creating 5 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00100000 : "Boot"
0x00140000-0x00640000 : "MyApp"
0x00500000-0x00d00000 : "Kernel"
0x00800000-0x04c00000 : "fs_yaffs"
0x04400000-0x0c400000 : "WINCE"
那么在编写自己MTD分区就根据这个来,分区的大小和起始地址不能错!!
不需要完全一致,但是需要相应分区的起始地址以及分区size一致!!!)
找到static struct mtd_partition smdk_default_nand_part[]的结构体,将内容修改为:
[0] = {
.name = "Boot",
.size = 0x00100000,
.offset = 0
},
[1] = {
.name = "MyApp",
.size = 0x00500000,
.offset = 0x00140000,
},
[2] = {
.name = "Kernel",
.size = 0x00800000,
.offset = 0x00500000,
},
[3] = {
.name = "fs_yaffs",
.size = 0x04400000,
.offset = 0x00800000,
},
[4] = {
.name = "WINCE",
.size = 0x08000000,
.offset = 0x04400000,
}
10、 关闭ECC校验。修改文件drivers/mtd/nand/s3c2410.c
[root@WEB188 linux-2.6.33]# vi 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
[root@WEB188 linux-2.6.33]# vi 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 = 2, //原始值为2,改成1
.pattern = scan_ff_pattern
};
12、 把s3c2410的默认配置写入config文件(有的yaffs2可能会出错)。
[root@WEB188 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
fs/yaffs2/Kconfig:179: unknown option "boot"
make[1]: *** [s3c2410_defconfig] 错误 1
make: *** [s3c2410_defconfig] 错误 2
13、 以上出现错误,主要是补丁造成,修改fs/yaffs2/Kconfig的179行,将boot改成bool,即改成如下:
bool "Disable yaffs2 block refreshing"
[root@WEB188 linux-2.6.33]# make s3c2410_defconfig
#
# configuration written to .config
#
14、 配置内核,注意System Type中,S3C2440中只选择以下内容即可。
[root@WEB188 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
15、 最后等着基本内核大功告成把。
[root@WEB188 linux-2.6.33]# make zImage
此时的内核是没有根文件系统的内核,后续要构建根文件系统!!!