2.6.14 内核移植说明文档

一、编译内核

1. make distclean 或者 make mrproper

如果你是新下载的内核,那这一步就不用了。但如果你用的是别人移植好的内核,那最好在编译内核之前先清除一下中间文件,因为你们用来编译内核的交叉编译工具可能不同。

2.修改 Makefile

主要是以下两项:

1 ) ARCH = arm

2) CROSS_COMPILE = /usr/local/arm/3.4.1/bin/arm-linux-

:在我的宿主机上有不少的交叉编译工具,而我又不习惯每次都传递参数,所以我选择写进 Makefile ,如果你的交叉编译工具存放在不同的目录或者使用不同的交叉编译工具,那你改变一下 CROSS_COMPILE 的值就行了。

3.配置内核( Make menuconfig )

我一般会选择 load 一个配置文件然后在它的基础上修改。方法:选中 load an Alternate Configuration File ,然后键入配置文件的路径。

在我刚编译内核的时候选择的是 linux-2.6.14/arch/arm/configs/smdk2410_defconfig 这个配置文件。

4. make

然后一切 OK , 2.6 内核的编译就是这么简单。你可以在 linux-2.6.14/arch/arm/boot/ 目录下看到我们需要的 zImage 文件。这就是经过压缩的内核镜像文件,把它下载到目标板上的 flash 中即可运行。由于 2410 已经作为 2.6 内核的标准板来支持,所以上面编译的这个内核不用什么修改即可运行,在串口可以看到内核的启动信息。主要是启动参数的问题:在 2.6 内核中, 2410 的串口由原来的 ttyS0 变为 ttySAC0 (听说其它的板还是保持不变,具体没有研究)。有关内核启动参数的设置以后会逐步提到。

二、让内核支持 yaffs 文件系统

1. MTD 分区的支持

前面介绍了如何编译一个内核,现在要介绍的是如何让内核支持 yaffs 文件系统。在介绍添加文件系统的支持之前,首先了解一下有关 mtd 分区的概念:

MTD(memory technology device 内存技术设备 ) 是用于访问 memory 设备( ROM 、 flash )的 Linux 的子系统。 MTD 的主要目的是为了使新的 memory 设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。

好了,其它的就不说了,有兴趣可以上网查一下相关的资料,下面说明让内核支持 mtd 分区的配置选项:

进入Device Drivers->Memory Technology Devices(MTD)目录,配置界面如下:
Memory Technology Device (MTD) support
[ ]   Debugging                                                          │ │
[ ]   MTD concatenating support                                          │ │
[*]   MTD partitioning support                                           │ │
[ ]     RedBoot partition table parsing                                  │ │
[ ]     Command line partition table parsing                             │ │
[ ]     ARM Firmware Suite partition parsing                             │ │
---   User Modules And Translation Layers                                │ │
[*]   Direct char device access to MTD devices                           │ │
[*]   Caching block device access to MTD devices                         │ │
[ ]   FTL (Flash Translation Layer) support                              │ │
[ ]   NFTL (NAND Flash Translation Layer) support                        │ │
[ ]   INFTL (Inverse NAND Flash Translation Layer) support               │ │
RAM/ROM/Flash chip drivers  --->                                   │ │
Mapping drivers for chip access  --->                              │ │
Self-contained MTD device drivers  --->                            │ │
NAND Flash Device Drivers  --->                                    │ │

进入NAND Flash Device Drivers目录,配置界面如下:
[*] NAND Device Support                                              │ │
[ ]   Verify NAND page writes                                        │ │
[*] NAND Flash support for S3C2410/S3C2440 SoC                       │ │
[*]   S3C2410 NAND driver debug                                      │ │
[ ]   S3C2410 NAND Hardware ECC                                      │ │
[ ] DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplement│ │
[ ] Support for NAND Flash Simulator                                 │ │

其它不用多设,甚至 Direct char device access to MTD devices 选项和Mapping drivers for chip access  ---> 目录下的所有选项都可以去掉(经已试验过) 。因为那些是为 nor flash 服务的,一般文件系统都会放在 nand flash 上吧,不过也不排除例外。那你就干脆让它们留着好了,因为编译出来后实在多不了多少,我把它们去掉的原因只是为了试验 ^_^

2.文件系统的支持

Yaffs 文件系统是专业针对 nand flash 的文件系统,比 jffs2 文件系统拥有更高的处理速度,更节省内存,支持的 mtd 分区更大等众多优点,所以在此选用 yaffs 文件系统。

Yaffs 文件系统内核没有集成,可以对其主页下载:

http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2.tar.gz?view=tar

建议下载 yaffs2 源码包,里面就支持了 yaffs 和 yaffs2 两种文件系统,把它添加进内核也很方便,有专门的脚本来处理。以下是我在文坛上发过的贴,里面介绍了把 yaffs 文件系统支持添加进内核的全过程:

一、首先下载内核2.6.14和交叉编译工具3.4.1,详细参考这个文档:
http://www.hfrk.net/S3C2410/kaifa/05122311085973789_56.htm

可以看到其实要修改部分不多,主要是加上nandflash的支持和mtd分区表的填写,如下:
1.修改arch\arm\mach-s3c2410\devs.c文件
增加头文件定义
/***********add here***********/
#include   <linux/mtd/partitions.h>
#include   <asm/arch/nand.h>
#include   <linux/mtd/nand.h>
/**************end add********/

增加nand flash分区信息
/***********add here***********/
static struct mtd_partition partition_info[] ={
{
name: "loader",
size: 0x00020000,
offset: 0,
}, {
name: "param",
size: 0x00010000,
offset: 0x00020000,
}, {
name: "kernel",
size: 0x001c0000,
offset: 0x00030000,
}, {
name: "root",
size: 0x00200000,
offset: 0x00200000,
mask_flags: MTD_WRITEABLE,
}, {
name: "user",
size: 0x03af8000,
offset: 0x00400000,
}
};

struct s3c2410_nand_set nandset ={
nr_partitions: 5 ,
partitions: partition_info ,
};

struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
/**************end add********/

struct platform_device s3c_device_nand = {
.name  = "s3c2410-nand",
.id  = -1,
.num_resources  = ARRAY_SIZE(s3c_nand_resource),
.resource  = s3c_nand_resource,

/***********add here****************/
.dev = {
.platform_data = &superlpplatform
}
/**************end here************/
};
2. 修改arch\arm\mach-s3c2410\mach-smdk2410.c文件
Startic struct platform_device *smdk2410_devices[] __initdata={
&s3c_device_usb,
&s3c_device_lcd;
&s3c_device_wdt,
&s3c_device_i2c;
&s3c_device_iis,
&s3c_device_nand, /*add here*/
};

注:分区表信息要参考你自己的内核和文件系统的大小,排布来设置,vivi中的分区信息要和mtd分区信息一致,分多少个区由你自己决定,我的就只分了4个区^_^。

二、为了支持yaffs2文件系统,需要帮内核加上对yaffs2文件系统的支持,详细请看这个贴:
http://www.hfrk.net/S3C2410/kaifa/061400335345164_30.htm

主要是把yaffs2文件系统的文件拷贝到fs目录,并修改Makefile 和 Kconfig文件。

在配置方面有些地方要注意一下,以下是我的配置信息:

注:mtd分区配置的信息前面已经有了,可以回头参考前面的配置。

File systems->Miscellaneous filesystems 目录,配置信息如下:
[*] YAFFS2 file system support                                               │ │
---   512 byte / page devices                                                │ │
[]     Lets Yaffs do its own ECC                                            │ │
[]       Use the same ecc byte order as Steven Hill's nand_ecc.c            │ │
---   2048 byte (or larger) / page devices                                   │ │
[]     Autoselect yaffs2 format                                             │ │
[]     Disable lazy loading                                                 │ │
[]   Turn off wide tnodes                                                   │ │
[]   Turn off debug chunk erase check                                       │ │
[]   Cache short names in RAM

在这里要说明一下以上的配置,在论坛发贴的时候我因为对它不怎么了解,几乎是全部选上的。后来经过自己的理解和摸索,发现:

1、 ---   2048 byte (or larger) / page devices   目录以下全部不用选,因为这是 yaffs2 文件系统的,如果你是用 yaffs 文件系统的话就不必选择这个了 ( 我到现在还没去研究 yaffs2 比 yaffs 文件系统优越多少,反正 yaffs 文件系统用得好好的 )  

2、 Lets Yaffs do its own ECC 这一项,网上很多人说 yaffs 文件系统和 mtd 驱程的更新速度问题,导致加上 ecc 检测后,会挂不了 yaffs 文件系统,所以要把 mtd 驱程的 ecc 检测去掉,让 yaffs 自己做 ecc 检测(就是要选上这一项)。不过去掉 mtd 驱程 ecc 检测的后果就是换来烦人的 Reading data from NAND FLASH without ECC is not recommended 的提示,后来发现原来把 mtd 驱程的 ecc 检测加回去,也可以很好的支持 yaffs 文件系统,所以就把这一项去掉了,终于可以不用再看那烦人的提示了 ^_^

三、现在轮到郁闷我了很久的devfs的问题,因为2.6.12内核以后取消了devfs的配置选项,具体为了什么我不清楚,不过缺少了它内核问题抱怨找不到mtdblock设备。据我所知网上每天都有不少的新手在为此事而困扰^_^

以下给出解决方法:

从2.6.12的fs/Kconfig中拷贝下面几项到2.6.14的fs/Kconfig中去:

config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
depends on EXPERIMENTAL
help
…………………………………………………

config DEVFS_MOUNT
bool "Automatically mount at boot"
depends on DEVFS_FS
help
………………………………………………….

config DEVFS_DEBUG
bool "Debug devfs"
depends on DEVFS_FS
help
…………………………………………………..

help 的部分就省了,反正你在 2.6.12 内核的配置文件会看得到,或者自己写上去也行。

重新make menuconfig 在File systems->Pseudo filesystems目录里面可以后到devfs的配置选项如下:
[*] /proc file system support                                          │ │
[*] /dev file system support (OBSOLETE)                                │ │
[*]   Automatically mount at boot                                      │ │
[*]   Debug devfs                                                      │ │
[*] Virtual memory file system support (former shm fs)                 │ │
[ ] Relayfs file system support

顺便说一下,在内核配置的时候经常会看到 debug 选项吧?这是为了调度内核用的,你不需要的话可以去掉。有时还会让你选择 quiet 和 nosy ,选择 nosy 的话输出的调试信息当然会比 quiet 要多了。

三、内核的下载和使用(关于文件系统的制作和下载请看相应的贴)

下载内核相当简单,我是直接在 vivi 下使用 load flash kernel u 来下载的内核(其实在下载内核和文件系统之前要涉及到 vivi 中 mtd 分区的设置问题,不过还是在文件系统的制作和使用部分再说好了)。

文件系统和内核的关系不是很大,所以你可以用你新做好的 2.6 内核看看能否挂载板上自带的 yaffs 文件系统,我还没做自己的文件系统之前就是这样做的。如果成功的话,恭喜你迈出了第一步。

顺便介绍一下内核启动参数的设置:

Flash 启动: param set linux_cmd_line “noinitrd root=/dev/mtdblock/3 (init=/linuxrc) console=ttySAC0”

Nfs 启动: param set linux_cmd_line “console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.115:/friendly-arm/root ip=192.168.1.128:192.168.1.1:192.168.1.1:255.255.255.0:luofuchong:eth0:off”

四、总结:

幸好以前有发贴的习惯,内容保存得很好。写这份文档主要是根据我以后配置内核的经验对以前的配置作一点修改和提一下要点。如果不明的话恐怕你要自己多配置多查资料了,毕竟内核配置是以后经常要用到的,对内核配置选项的熟悉其重要性就不用多说了。好了,总结如此,希望对你有帮助。

posted @ 2011-06-09 12:00  hnrainll  阅读(1954)  评论(3编辑  收藏  举报