分类: 嵌入式
2014-07-07 16:42:59
Linux内核移植
1:获得内核源代码
1-1建立mini2440文件夹
wxudong@wlinux:~$ makdir mini2440
1-2解压文件夹内的内核源码
wxudong@wlinux:~/mini2440$ tar zxvf linux-2.6.32.2.tar.gz
2:指定交叉编译变量
2-1修改顶层makefile
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
其中,ARCH 是指定目标平台为 arm,CROSS_COMPILE 是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。
2-2测试能否编译通过
#make s3c2410_defconfig,
使用缺省内核配置文件,生成.config配置文件,以后可以直接使用make menuconfig 修改配置。
#make ,编译时间较长
3:克隆自己的目标平台
3-1删除原文件
linux-2.6.32.2/arch/arm/mach-s3c2440 目录下有个mach-mini2440.c文件,它其实就是国外爱好者为 mini2440 移植添加的主要内容了,但我们不用它,把它直接删除。
3-2复制新文件
将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c复制一份。命名为mach-mini2440.c,找到MACHINE_START(S3C2440, "SMDK2440"),修改为
MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")。
3-3修改时钟频率
第 160 行static void __init smdk2440_map_io(void)函数中,把其中的16934400改为12000000,即12Mhz
3-4讲所有的smdk2440改为mini2440
在 vim 的命令模式下输入:%s/smdk2440/mini2440/g
3-5删除初始化函数
在mini2440_machine_init(void)函数中,把smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用smdk2440 原来的
3-6编译测试
#make mini2440_defconfig ;使用 Linux 官方自带的 mini2440 配置
#make zImage ;编译内核,时间较长,最后会生成 zImage(arch/arm/boot目录)
在vivi下选择k下载内核,选择b运行内核。
4:移植Nand驱动并更改分区信息
4-1在mach-mini2440.c中加入以下代码
static struct mtd_partition mini2440_default_nand_part[] = {
[0] = {
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "param",
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name= "Kernel",
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "root",
.offset = 0x00560000,
.size = 1024 * 1024 * 1024,
},
[4] = {
.name = "nand",
.offset = 0x00000000,
.size = 1024 * 1024 * 1024, //
}
};
static struct s3c2410_nand_set mini2440_nand_sets[] = {
[0] = {
.name = "NAND",
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
.partitions = mini2440_default_nand_part,
},
};
static struct s3c2410_platform_nand mini2440_nand_info = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
.sets = mini2440_nand_sets,
.ignore_unset_ecc = 1,
};
4-2把 nand flash 设备注册到系统中
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_nand,
};
4-3加入头文件
#include
#include
#include
#include
#include
4-4解决编译出错的改动
只需在mach-mini2440.c的初始化函数mini2440_machine_init(void)里加入
s3c_device_nand.dev.platform_data=&mini2440_nand_info;
4-5编译测试