在mini2440开发板中编译linux-2.6.37.2内核

内核版本:linux-2.6.37.2 软件平台:ubuntu 10.10 硬件平台:mini2440 一,建立交叉编译环境 简单来说,就是安装上arm-linux-等编译工具,对于交叉编译器,我选择了arm920t-eabi.tgz,版本号是4.1.2,对于新版的内核,busybox和Qt都支持。把交叉编译器解压到某路径,如/opt/toolchains/arm920t-eabi,然后在命令行窗口输入

gedit ~/.bashrc //在最后一行添加
export PATH=$PATH:/opt/toolchains/arm920t-eabi/bin

然后logout,再输入arm-linux-gcc -v ,就可以查看arm-linux的版本信息,建立完成。 二,开始编译内核 在官网那里下载了一个最新稳定版内核linux-2.6.37.2,解压到某路径,如/work,进入内核文件夹, 1.修改makefile文件,指向交叉编译器,修改如下:

ARCH ?= arm
CROSS_COMPILE ?= arm-linux-

2.读取配置文件:

make s3c2410_defconfig

3.波特率修改 修改arch/arm/mach-s3c2440/mach-smdk2440.c文件 把s3c24xx_init_clocks(16934400)里面的16934400改成12000000; 4.MTD修改 修改arch/arm/plat-s3c24xx/common-smdk.c文件 改成如下,我的mini2440开发板是64M的nand flash。所以大小最大值为0x04000000,而且要与mini板上的part show显示的大小一致,对应改就行了。

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = “vivi”,
.offset = 0,
.size = 0x00040000,
},
[1] = {
.name = “mRtos”,
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name = “kernel”,
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = “roofs”,
.offset = 0x00560000,
.size = 0x03a9c000,
}
};

5.yaffs补丁 网上下载的yaffs2常见版本, 点击网址下载http://www.mak-blog.com/download/cvs-root.tar.gz,一般不支持2.6.36/37, 支持2.6.36/37的yaffs补丁,2011年4月的版本, 下载地址http://www.mak-blog.com/download/yaffs2.tar.gz, 下载最新版本请到yaffs.net。 解压后进入yaffs源码目录,打补丁的命令:

新版:#./patch-kernel.sh c m /work/linux-2.6.37
旧版:#./patch-ker.sh c /work/linux-2.6.37

其实新版就是多了一个参数。 6.机器码修改 修改arch/arm/tools/mach-types,mini2440版上的机器码是1999,要与板相对应。

s3c2440 ARCH_S3C2440 S3C2440 1999

7.配置内核

General setup —>
[] Configure standard kernel features (for small systems) —>
Kernel Features —>
[
] Use the ARM EABI to compile the kernel
System Type —>
[] S3C2440 and S3C2442 Machines —> //切记:只选这个,不要选其他S3C,里面的也只选2个
[
] SMDK2440
[] SMDK2440 with S3C2440 CPU module
File systems —>
Miscellaneous filesystems —>
<
> YAFFS2 file system support

======================================================= 编译过程中出现的错误 错误1: Unable to find the ncurses libraries or the required header files. ‘make menuconfig’ requires the ncurses libraries. Install ncurses (ncurses-devel) and try again. make[1]: [scripts/kconfig/dochecklxdialog] Error 1 make: [menuconfig] Error 2 解决方法:

apt-get install libncurses*

错误2: /bin/sh: arm-linux-nm: not found No valid symbol. make: *** [.tmp_kallsyms1.S] Error 1 解决方法 :进入交叉编译器的目录,建立快捷方式到arm-linux-nm

ln -s arm-angstrom-linux-gnueabi-nm arm-linux-nm

错误3: fs/yaffs2/yaffs_fs.c:310: warning: initialization from incompatible pointer type fs/yaffs2/yaffs_fs.c:380: warning: initialization from incompatible pointer type fs/yaffs2/yaffs_fs.c:393: error: unknown field ‘delete_inode’ specified in initializer fs/yaffs2/yaffs_fs.c:393: warning: initialization from incompatible pointer type fs/yaffs2/yaffs_fs.c:394: error: unknown field ‘clear_inode’ specified in initializer fs/yaffs2/yaffs_fs.c:394: warning: initialization from incompatible pointer type fs/yaffs2/yaffs_fs.c: In function ‘yaffs_delete_inode’: fs/yaffs2/yaffs_fs.c:725: error: implicit declaration of function ‘clear_inode’ fs/yaffs2/yaffs_fs.c: In function ‘yaffs_setattr’: fs/yaffs2/yaffs_fs.c:1703: error: implicit declaration of function ‘inode_setattr’ fs/yaffs2/yaffs_fs.c: In function ‘yaffs_internal_read_super’: fs/yaffs2/yaffs_fs.c:2498: error: implicit declaration of function ‘init_MUTEX’ make[2]: [fs/yaffs2/yaffs_fs.o] Error 1 make[1]: [fs/yaffs2] Error 2 make: *** [fs] Error 2 解决方法 :安装新版yaffs补丁