下载linux-2.6.14.1.tar.bz2
tar -zxvf linux-2.6.14.1.tar.bz2
下载arm-linux-3.4.1.tar.jz
tar -jxvf arm-linux-3.4.1.tar.jz
修改内核目录树根下的的 Makefile,指明交叉编译器
[arm@localhost linux-2.6.14]# vi Makefile
找到 ARCH 和 CROSS_COMPILE,修改(大约在183行)
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
修改环境变量 将交叉编译工具路径和内核路径加入环境变量
[arm@localhost linux-2.6.14]# vi /etc/profile
在最后添加 export PATH=/usr/local/arm/3.4.1/bin:$PATH
export KERNEL=/home/admin/linux-2.6.14.1
#make menuconfig
system type:-> arm system type:->samsung s3c2410
make zImage 报错
drivers/video/console/vgacon.c:290: error:'PCIMEM_BASE'undeclared(first use in this function)
解决办法
make menuconfig
device drivers->
Graphics support->
Console display driver support->
[ ]VGA text console (去掉即可)
再次编译 又报错
LD .tmp_vmlinux1
arm-linux-ld:arch/arm/kernel/vmlinux.lds:1439: parse error
make: *** [.tmp_vmlinux1] Error 1
解决办法
[root@localhost linux-2.6.14]$ vi arch/arm/kernel/vmlinux.lds
将文件尾2条的ASSERT注释掉
/* ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") */
/* ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") */
终于编译过去了
************************************************************************************************************
交叉编译内核
************************************************************************************************************
一、设置flash分区
指明分区信息
在arch/arm/machs3c2410/devs.c文件中添加如下内容:
#include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h>
#include <asm/arch/nand.h>
/* NAND Controller */
1.、建立Nand Flash分区表
static struct mtd_partition partition_info[] ={
{
name: "vivi",
offset: 0,
size: 0x00020000,
}, {
name: "param",
offset: 0x00020000,
size: 0x00010000,
}, {
name: "kernel",
offset: 0x00030000,
size: 0x001d0000,
}, {
name: "root",
offset: 0x00200000,
size: 0x00a00000,
}, {
name: "jffs2",
offset: 0x00c00000,
size: 0x01400000,
}
};
name: 代表分区名字
size: 代表flash分区大小(单位:字节)
offset: 代表flash分区的起始地址(相对于0x0的偏移)
目标板计划分5个区,分别存放vivi,param, kernel, root以及以便以后扩展使用的用户文件系统空间。
2、加入Nand Flash分区
struct s3c2410_nand_set nandset ={
nr_partitions: 5, /* the number of partitions */
partitions: partition_info, /* partition table */
};
nr_partitions: 指明partition_info中定义的分区数目
partitions: 分区信息表
3、 建立Nand Flash芯片支持
struct s3c2410_platform_superlpplatform_nand={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
tacls, twrph0, twrph1的意思见S3C2410手册的63,
这3个值最后会被设置到NFCONF中,见S3C2410手册66.
sets: 支持的分区集
nr_set:分区集的个数
4.、加入Nand Flash芯片支持到Nand Flash驱动
struct platform_device s3c_device_nand = {
.name = "s3c2410nand", /* Device name */
. id = -1, /* Device ID */
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource, /* Nand Flash Controller Registers */
/*添加以下内容用来支持NAND Flash芯片*/
.dev = {
.platform_data = &superlpplatform_nand
}
name: 设备名称
id: 有效设备编号,如果只有唯一的一个设备为-1,有多个设备从0开始计数.
num_resource: 有几个寄存器区
resource: 寄存器区数组首地址
dev: 支持的Nand Flash设备
二、指定启动时初始化
kernel启动时依据我们对分区的设置进行初始配置
修改arch/arm/machs3c2410/machsmdk2410.c文件smdk2410_devices[],指明初始化时包括我们在前面所设置的flash分区信息
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
/* 添加如下语句即可 */
&s3c_device_nand,
};
三、 禁止Flash ECC校验
修改drivers/mtd/nand/s3c2410.c 文件s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:
chip->eccmode = NAND_ECC_NONE;
edit /include/linux/mtd/partitions.h
partitions.h文件的最前面加上#include <linux/list.h>
四、配置内核
1、支持启动时挂载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为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
2、配置内核产生.config文件
将arch/arm/configs/smdk2410_defconfig .config拷到内核目录树根下
make menuconfig 将smdk2410_defconfig 导入,在smdk2410_defconfig基础上,配置内核
Loadable module support >
[*] Enable loadable module support
[*] Automatic kernel module loading
System Type >
[*] S3C2410 DMA support
Boot options >
Default kernel command string:
noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200
说明:mtdblock3代表我的第4个flash分区,它是我的rootfs
console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上.
Floating point emulation >
[*] NWFPE math emulation
接下来要做的是对内核MTD子系统的设置
Device Drivers >
Memory Technology Devices (MTD) >
[*] MTD partitioning support /*支持MTD分区,这样我们在前面设置的分区才有意义*/
[*] Command line partition table parsing /*支持从命令行设置flash分区信息,灵活*/
RAM/ROM/Flash chip drivers >
<*> Detect flash chips by Common Flash Interface (CFI) probe
<*> Detect nonCFI AMD/JEDECcompatible flash chips
<*> Support for Intel/Sharp flash chips
<*> Support for AMD/Fujitsu flash chips
<*> Support for ROM chips in bus mapping
NAND Flash Device Drivers >
<*> NAND Device Support
<*> NAND Flash support for S3C2410/S3C2440 SoC
Character devices >
[*] Nonstandard serial port support
[*] S3C2410 RTC Driver
接下来做的是针对文件系统的设置
File systems >
<> Second extended fs support #去除对ext2的支持
Pseudo filesystems >
[*] /proc file system support
[*] Virtual memory file system support (former shm fs)
[*] /dev file system support (OBSOLETE)
[*] Automatically mount at boot (NEW)
这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了
Miscellaneous filesystems >
<*> Compressed ROM file system support (cramfs) /*支持cramfs*/
Network File Systems >
<*> NFS file system support
到这里就可以保存退出,make zImage了。
以上是作者移植2.6.14内核参照的过程,移植成功。中间出现问题:因配置错误导致编译不能正常通过。后重新配置后,正常,而且可以正确挂载文件系统。
转自:http://blog.csdn.net/yel617/article/details/4349973