第二章编译移植内核
在以上章节介绍了
2.4
内核的编译过程,因为三星公司的
smdk2410
开发板使用的是
2.4.18
的内核,所以目前国内有相当多的客户都很熟悉
2.4
的使用和配置,我们不再对这个内核作介绍了。我们在这一章中将主要讲述最新的
linux2.6.14
内核的移植过程。由于
2410
已经成为
linux2.6
的标准支持平台,所以移植起来相对并不是很复杂。
第一节在
hfrk2410
开发板上运行
linux2.6
内
核
一.
准备必要的文件
我们首先去官方网站下载最新的
llinux
内核
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2
因为
linux2.6.14
内核需要更新版本的编译器,所以我们需要下载交叉编译器
ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
注:这个编译器已经包含在光盘的
\DISK4\linux
相关
\linuxtool
目录下面。
二.
安装文件
我们把
gcc
安装在
/usr/local/arm/3.4.1
目录下,安装方法和安装
gcc2.95.3
和
gcc3.3.2
是相同的,在此我们不再描述了
接下来需要解压
linux
内核,输入命令:
[root
·
localhost hfrk]# tar jxvf linux-2.6.14.tar.bz2
内核被解压到
linux-2.6.14
目录下。
三.
修改
makefile
文件
内核的编译是根据
makefile
文件的指示进行的,
Makefile
文件来组织内核的各模块之间的关系,记录了各个模块之间的相互联系和依赖关系。
我们首先修改
linux-2.6.14
的根目录下的
makfile
文件,我们须改的主要内容是目标代码的类型和为编译内核指定一个编译器。
我们注释掉以下内容:
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
增加如下内容:
ARCH : = arm
CROSS_COMPILE =/usr/local/arm/3.4.1/bin/arm-linux-
四.
修改相关的文件。
1.
修改
arch\arm\mach-s3c2410\devs.c
文件
增加头文件定义
/***********add here***********/
#include <linux/mtd/partitions.h>
#include <asm/arch/nand.h>
#include <linux/mtd/nand.h>
/**************end add********/
增加
nand flash
分区信息
/***********add here***********/
static struct mtd_partition partition_info[] ={
{
name: "loader",
size: 0x00020000,
offset: 0,
}, {
name: "param",
size: 0x00010000,
offset: 0x00020000,
}, {
name: "kernel",
size: 0x001c0000,
offset: 0x00030000,
}, {
name: "root",
size: 0x00200000,
offset: 0x00200000,
mask_flags: MTD_WRITEABLE,
}, {
name: "user",
size: 0x03af8000,
offset: 0x00400000,
}
};
struct s3c2410_nand_set nandset ={
nr_partitions: 5 ,
partitions: partition_info ,
};
struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
/**************end add********/
struct platform_device s3c_device_nand = {
.name = "s3c2410-nand",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource,
/***********add here****************/
.dev = {
.platform_data = &superlpplatform
}
/**************end here************/
};
2.
修改
arch\arm\mach-s3c2410\mach-smdk2410.c
文件
Startic struct platform_device *smdk2410_devices[] __initdata={
&s3c_device_usb,
&s3c_device_lcd;
&s3c_device_wdt,
&s3c_device_i2c;
&s3c_device_iis,
&s3c_device_nand, /*add here*/
};
五.
我们做完以上修改以后,内核编译以后就可以在
hfrk2410
开发板上运行了。
打开终端窗口,切换到
linux-2.6.14
目录下,输入命令:
[root
·
localhost linux-2.6.14]# mak smdk2410_defconfig
[root
·
localhost linux-2.6.14]# mak
等编译完成以后,会生成镜像文件
arch/arm/boot/zImage
,把这个文件下载到开发板上,就会看到
linux2.6
的内核启动信息,我们迈出了
linux2.6
内核移植的第一步!
第二节移植
LCD
驱动程序
我们通过上面的工作,在串口中已经看到了
linux2.6.14
的启动信息,但是在
LCD
上没有任何显示,这是因为我们还没有对
LCD
进行初始化,
linux2.6.14
已经包含了
lcd
的驱动程序,驱动程序位于
/linux-2.6.14/drivers/video/
目录下,文件名是
s3c2410fb.c,
头文件是
s3c2410fb.h.
。我们在这里可以不研究这个文件。只要我们对
lcd
进行以下初始化就可以了。
我们打开
/linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c,
在这个文件里增加包含文件:
#include
#include
然后增加
LCD
初始化的代码,
static struct s3c2410fb_mach_info hfrk_lcdcfg __initdata = {
.fixed_syncs= 0,
.regs={
.lcdcon1= S3C2410_LCDCON1_TFT16BPP | \
S3C2410_LCDCON1_TFT | \
S3C2410_LCDCON1_CLKVAL(6),
.lcdcon2= S3C2410_LCDCON2_VBPD(2) | \
S3C2410_LCDCON2_LINEVAL(319) | \
S3C2410_LCDCON2_VFPD(0) | \
S3C2410_LCDCON2_VSPW(4),
.lcdcon3= S3C2410_LCDCON3_HBPD(47) | \
S3C2410_LCDCON3_HOZVAL(239) | \
S3C2410_LCDCON3_HFPD(15),
.lcdcon4= S3C2410_LCDCON4_MVAL(1) | \
S3C2410_LCDCON4_HSPW(31),
.lcdcon5= S3C2410_LCDCON5_FRM565 | \
S3C2410_LCDCON5_INVVLINE | \
S3C2410_LCDCON5_HWSWP,
},
.lpcsel= 0x0,
.gpccon= 0xaaaaaaaa,
.gpccon_mask= 0xffffffff,
.gpcup= 0xffffffff,
.gpcup_mask= 0xffffffff,
.gpdcon= 0xaaaaaaaa,
.gpdcon_mask= 0x0,
.gpdup= 0xffffffff,
.gpdup_mask= 0xffffffff,
.width= 240,
.height= 320,
.xres= {240,240,240},
.yres= {320,320,320},
.bpp= {16,16,16},
};
static void __init sdmk2410_init(void)
{
set_s3c2410fb_info(&hfrk_lcdcfg);
}
在系统初始化中增加对
lcd
的初始化。
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
* to SMDK2410 */
/* Maintainer: Jonas Dietsche */
……
.map_io = smdk2410_map_io,
.init_irq = smdk2410_init_irq,
.init_machine = sdmk2410_init, /*
这一句是新增加的*/
.timer = &s3c24xx_timer,
MACHINE_END
现在我们重新保存这个文件,现在需要重新进入配置菜单,检查一下
LCD
的相关选项是否选上,
[Device Drivers->Graphics support->]
这个配置菜单下面是相关
LCD
的配置。回到根目录下,输入
make
编译内核,重现烧写内核到开发板,再次启动
linxu2.6.14
以后就可以在
lcd
上看到一个小的企鹅。我们的
lcd
驱动已经移植完成了。