0%

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

  • 内核版本:linux-2.6.37.2
  • 软件平台:ubuntu 10.10
  • 硬件平台:mini2440

建立交叉编译环境

简单来说,就是安装上arm-linux-等编译工具,对于交叉编译器,我选择了arm920t-eabi.tgz,版本号是4.1.2,对于新版的内核,busyboxQt都支持。把交叉编译器解压到某路径,如/opt/toolchains/arm920t-eabi,然后在命令行窗口输入

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

然后logout,再输入arm-linux-gcc -v,就可以查看arm-linux的版本信息,建立完成。

开始编译内核

在官网那里下载了一个最新稳定版内核linux-2.6.37.2,解压到某路径,如/work,进入内核文件夹。

修改makefile文件

指向交叉编译器,修改如下:
1
2
ARCH		?= arm
CROSS_COMPILE ?= arm-linux-

读取配置文件

`make s3c2410_defconfig`

波特率修改

修改`arch/arm/mach-s3c2440/mach-smdk2440.c`文件
把`s3c24xx_init_clocks(16934400)`里面的`16934400`改成`12000000`。

MTD修改

修改`arch/arm/plat-s3c24xx/common-smdk.c`文件
改成如下,我的mini2440开发板是64M的`nand flash`。所以大小最大值为0x04000000,而且要与mini板上的part show显示的大小一致,对应改就行了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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,
}
};

yaffs补丁

网上下载的yaffs2常见版本, 点击网址下载`https://www.mak-blog.com/download/cvs-root.tar.gz`,一般不支持2.6.36/37, 支持2.6.36/37的yaffs补丁,2011年4月的版本, 下载地址`https://www.mak-blog.com/download/yaffs2.tar.gz`, 下载最新版本请到yaffs.net。 解压后进入yaffs源码目录,打补丁的命令:
1
2
新版:#./patch-kernel.sh c m /work/linux-2.6.37
旧版:#./patch-ker.sh c /work/linux-2.6.37
其实新版就是多了一个参数。

机器码修改

修改arch/arm/tools/mach-types,mini2440版上的机器码是1999,要与板相对应。

1
s3c2440        ARCH_S3C2440		S3C2440        1999

配置内核

1
2
3
4
5
6
7
8
9
10
11
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.

1
2
3
4
5
6
*** 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.

1
2
3
/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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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补丁