
安装好交叉编译工具链后再进行下面操作。
1¡¢ 解压linux- 2.6.32.8内核源码包(tar xjvf linux-2.6.32.8.tar.bz2),然后进入解压后的目录(cd linux-2.6.32.8),修改Makefile文件,使之编译成ARM平台:
将
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为:
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH := arm
CROSS_COMPILE := arm-linux-
2¡¢ 修改机器码,在u-boot-2009.11里第5步里设置了MACH_TYPE为MACH_TYPE_SMDK2440,查看u-boot里的include/asm-arm/mach-types.h文件,有下面定义:
#define MACH_TYPE_SMDK2440 1008 //针对2440的MACH_TYPE码的值定义为1008
而linux内核源码的arch/arm/tools/mach-types文件有如下定义:
smdk2440 MACH_SMDK2440 SMDK2440 1008
即u-boot和linux内核的同样类型的机器码都为1008。
那么我们就修改kernel的MACH_TYPE代码引用部分,确定kernel的MACH_TYPE。如下:
修改arch/arm/mach-s3c2440/mach-smdk2440.c : //修改文件最后面
将MACHINE_START(S3C2440, "SMDK2440")修改为:MACHINE_START(SMDK2440, "SMDK2440")
修改arch/arm/kernel/head.S //在ENTRY(stext)下添加如下代码(红色部分)
ENTRY(stext)
mov r0, #0
mov r1, #0x3f0 // MACH_TYPE_SMDK2440值1008换成十六进制就是0x3f0
ldr r2, =0x30000100 //Linux kernel parameter
3¡¢ 修改系统平台时钟为12MHz(即:12000000)
修改arch/arm/mach-s3c2440/mach-smdk2440.c文件:
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000); //(16934400);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
4¡¢ 修改Nand Flash分区。这里只创建三个分区,其他多余的分区屏蔽掉
修改arch/arm/plat-s3c24xx/common-smdk.c文件:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "GCX_GEC2440 boot", //"Boot Agent
.size = 0x00030000, //SZ_16K,
.offset = 0,
},
[1] = {
.name = "GCX_GEC2440 kernel", //"S3C2410 flash partition 1
.offset = 0x00050000, //0,
.size = 0x00200000, //SZ_2M,
},
[2] = {
.name = "GCX_GEC2440 filesystem", //"S3C2410 flash partition 2
.offset = 0x00250000, //SZ_4M,
.size = 0x03dac000, //SZ_4M,
},
//[3]至[7]的内容都注释掉
};
这样个性后所形成的分区分布情况如下:
起始地址 结束地址
uboot : 0x00000000 0x00030000
param : 0x00030000 0x00040000 //注意这个环境变量的地址范围要与uboot第9节的补充内容中配置的CONFIG_ENV_OFFSET一致,相应定义是:#define CONFIG_ENV_OFFSET 0x30000 //将环境变量保存到nand中的0x30000位置,#define CONFIG_ENV_SIZE 0x10000
kernel: 0x00050000 0x00200000
root : 0x00250000 0x03dac000
5¡¢ 配置内核选项
make menuconfig
加载s3c24xx系列的通用配置,然后在此基础上修改:
各选项如下。这里只列出了要修改的项,其他的默认。
配置完后将配置文件保存为.config,这样方便下次make menuconfig时默认加载上次配置过的文件。
6、 交叉编译内核
make zImage
如无出错,会在arch/arm/boot/目录下生成zImage文件。
7、 下载运行zImage
使用uboot通过tftp下载zImage到30008000,并运行,结果如下:
MB Nand Flash分区情况:
8、 烧写zImage
启动开发板上的uboot,并通过交叉网线与电脑相连,通过下面命令就可以把zImage烧到nand flash中:
tftp 30008000 zImage //下载内核镜像
nand erase 0x50000 0x200000 //擦除nand的0x50000-0x200000的内容
nand write 0x30008000 0x50000 0x200000 //将内存0x30008000处的内容写入到nand的0x50000处
setenv bootcmd nand read 0x30008000 0x50000 0x200000 \\;go 0x30008000
saveenv
重启后就可以引导运行内核了,但会出现如下一行提示:
图中最后一行提示是还没有根文件系统的原因,因为我们还没有将文件系统写到相应位置上。将在后面给出制作的过程步骤。
