-----------------------------------------------------------------------------------
Linux2.6.14移植
-----------------------------------------------------------------------------------
4. Linux2.6.14内核编译、移植
一、准备必要的文件
我们首先去官方网站下载最新的llinux内核
http://www./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. l.tar.bz2
注:这个编译器已经包含在光盘的\DISK4\linux才I I关\linuxtool目录下.
二、安装文件
(1)安装交叉编译器
(a)在/usr/local/目录下建立文件夹arm
(b)将arm-linux-gcc-3.4. l.tar.bz2拷贝到arm文件夹下
(c)# tar jxvf arm-linux-gcc-3.4. l.tar.bz2
//解压缩编译器,其中:jxvf中的j表示用bzip2来压缩/解压缩文件
(d)vi ~/.bash_profile //设置系统环境变量
//把arm-linux-gcc的路径/usr/local/arm/3.4.1/bin添加到PATH中:
【原来】 :PATH=$PATH:$HOME/bin
【修改为】:PATH=$PATH:/usr/local/arm/3.4.1/bin
(2)解压缩内核代码并配置内核
(a)# tar jxvf linux2.6.14.tar.gz //解压缩内核,其中:zxvf中的z表示用gzip来压缩/解压缩文件
(b)# ls
(c)# cd linux2.6.14
三、修改makefile文件
内核的编译是根据makefile文件的指T进行的,Makefile文件来组织内核的各模块之间的
关系,记录了各个模块之间的相互联系和依赖关系。
我们首先修改linux-2.6.14的根目录下的makfile文件,我们须改的卞要内容是目标代码的
类型和为编译内核指定一个编译器。
我们注释掉以下内容:
#ARCH?=$(SUBARCH)
#CROSS COMPILE?=
增加如下内容:
ARCH:= arm
CROSS COMPILE =/usr/local/arm/3.4.1/bin/arm-linux-
四、修改相关的文件。
4.1 设置flash分区
4.1.1 指明分区信息
在arch/arm/mach-s3c2410/devs.c文件中:
[arm@localhost linux-2.6.14]$ vi arch/arm/mach-s3c2410/devs.c
(1)增加头文件定义:
/***********add here***********/
#include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h>
#include <asm/arch/nand.h>
/**************end add********/
(2)增加nand flash分区信息定义(分区信息和bootloader一致就可以)
/***********add here***********/
static struct mtd_partition partition_ info[]={
[0]={ //128K
name: "boot", //name:代表分区名字
size: 0x20000, //size:代表flash分区大小(单位:字节)
offset: 0, //offset:代表flash分区的起始地址(相对干0x0的偏移)
},
[1]={ //3M
name: "kernel",
size: 0x300000,
offset: 0x20000,
},
[2]={ //5M
name: "rootfs",
size: 0x500000,
offset: 0x320000,
},
[3]={ //1M
name: "etc",
size: Ox 100000,
offset: 0x820000.
},
[4]= //11M
name: user
size: Oxb00000,
offset: Ox920000,
}
[5]={
name: "qt",
size: Ox2b00000,
offset: Ox 1420000,
}
};
/**************end add********/
(3)加入Nand Flash分区
/***********add here***********/
struct s3c2410_ nand_ set nandset={
nr_partitions: 6,/*the number of partitions*/
partitions: partition_ info,/*partition table*/
};
/**************end add********/
nr_partitions:指明partition_ info中定义的分区数目
partitions:分区信息表
(4).建立Nand Flash芯片支持
/***********add here***********/
struct s3c2410_platform_nand superlpplatform={
tacls:0, //tads, twrph0, twrphl的意思见S3C2410手册的6-3
twrph0:30,
twrph 1:0,
sets: &nandset, //支持的分区信息集
nr_sets: 1, //分区集的个数
};
/**************end add********/
(5).加入Nand Flash芯片支持至Nand Flash驱动
另外,还要修改此文件中的s3c_device_nand结构体变量,添加对dev成员的赋值
struct platform_device s3c_device_nand={
.name="s3c2410-nand", /*Device name*/
.id=-1, /*Device ID*/
.num resources=ARRAY_ SIZE(s3c_nand_resource), //有几个寄存器区
.resource=s3c_nand_resource, /*Nand Flash Controller Registers*/寄存器区首地址
/***********add here***********//*Add the Nand Flash device*/
.dev={
.platform_data=&superlpplatform
}
/**************end add********/
};
4.1.2 指定启动时初始化
kernel启动时依据我们对分区的设置进行初始配置
修改arch/arm/mach-s3c2410/mach-smdk2410.c文件
[arm@localhost linux-2.6.14]$ vi arch/arm/mach-s3c2410/mach-smd1Q410.c
修改smdk2410_devices[].指明初始化时包括我们在前面所设置的flash分区信息
static struct platform- device *smd1Q410_ devices[]_ initdata={
&s3c_ device_ usb,
&s3c_ device_ lcd,
&s3c_ device_ wdt,
&s3c_ device_ i2c,
&s3c_ device_ iis,
/*添加如下语句即可*/
&s3c_ device_ nand,
};
保存,退出。
4.2 添加LCD驱动程序,对LCD进行初始化
linux2.6.14已经包含了lcd的驱动程序,驱动程序位于/linux-2.6.14/drivers/video/目录下,文件名 是s3c24101b.c,头文件是s3c24101b.h. 我们在这里可以不研究这个文件。只要我们对lcd进行以下初 始化就可以了。
打开linux-2.6.14/arch/arm/mach-s3c2410/mach-smdk2410.c,在这个文件里增加包含文
件:
然后增加LCD初始化的代码,
#include <devs.h>修改为#include "devs.h"
#include <cpu.h>修改为#include "cpu.h"
/*********** wpb add start ********/
/* LCD Initialize */
#include <asm/arch/regs-lcd.h>
#include <asm/arch-s3c2410/fb.h>
/* LCD Initial code */
/*
发生图象偏移时,可通过对前肩后肩增减来调节
.lcdcon1
CLK_TFT: VCLK=HCLK/[(CLKVAL+1)/2]
FCLK=180MHz, HCLK=90MHz, VCLK=7.5MHz
.lcdcon2
Vertical sync Back Porch
LINEVAL=(Vertical display size)-1=240-1=239
Vertical sync Front Porch
Vertical sync Pulse Width
.lcdcon3
Horizontal sync Back Porch
HOZVAL=(Horizontal display size)-1=320-1=319
Horizontal sync Front Porch
.lcdcon4
STN used
Horizontal sysnc Pulse Width
.*/
static struct s3c2410fb_mach_info wpb_lcdcfg __initdata={
.fixed_syncs=0,
.regs={
.lcdcon1=S3C2410_LCDCON1_TFT16BPP | S3C2410_LCDCON1_TFT | S3C2410_LCDCON1_CLKVAL(5),
.lcdcon2=S3C2410_LCDCON2_VBPD(18) | S3C2410_LCDCON2_LINEVAL(239) | S3C2410_LCDCON2_VFPD(11) |
S3C2410_LCDCON2_VSPW(4),
.lcdcon3=S3C2410_LCDCON3_HBPD(38) | S3C2410_LCDCON3_HOZVAL(319) | S3C2410_LCDCON3_HFPD(15),
.lcdcon4=S3C2410_LCDCON4_MVAL(0) | 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=0x0,
.gpdup=0xffffffff,
.gpdup_mask=0xffffffff,
.width=320, /* TFT Screen Size: 320X240 */
.height=240,
.xres={320,320,320}, /* X direction: 320 */
.yres={240,240,240}, /* Y direction: 240 */
.bpp={16,16,16}, /* 16 bit color */
};
static void __init smdk2410_init(void)
{
set_s3c2410fb_info(&wpb_lcdcfg);
}
//在系统中增加对LCD的初始化
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
* to SMDK2410 */
/* Maintainer: Jonas Dietsche */
.phys_ram = S3C2410_SDRAM_PA,
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.map_io = smdk2410_map_io,
.init_irq = smdk2410_init_irq,
/********** wpb add start *************/
.init_machine=smdk2410_init,
/********** wpb add end *************/
.timer = &s3c24xx_timer,
MACHINE_END
/*********** wpb add end *******/
(3) 注释掉drivers\char\vt.c的blank_screen_t(unsigned long dummy)的函数内容,否则,lcd会在10分钟左右关掉显示.
在编译内核的时候选择224 color,在graphics support中我把所有的选项都选了,除了vga console,选了以后老编译不过去也不
知道有什么用。然后从新启动系统就可以看到企鹅tux了。
4.3 配置内核
4.3.1支持启动时加载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修 改fs/Kconfig文件
[arm@localhost linux-2.6.14]$ vi 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
4.3.2 配置内核产生.config文件
[arm@localhost linux-2.6.14]$ cp arch/arm/configs/smdk2410_defconfig .config
[arm@localhost linux-2.6.14]$ make menuconfig //即可进入内核配置环境,进行内核的裁减
在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/mtdblock2 init=/linuxrc console=ttySAC0,115200 mem=32M
#说明:mtdblock2代表第3个flash分区,用来作根文件系统rootfs;
# console=tty0,ttySAC0,115200使kernel启动期间的信息刚开始输出到串口0上,波特率为 115200;
# 后面的信息输出到LCD屏上。
/* 2410-s中串口设备是在tts目录下(USB转串口的是ttySCA)的,按0、1来选择串口UART0和UART1
ttyS0是早期内核中使用的串口设备名。/dev/tty下的设备的作用是将结果显示在开发板的屏幕上
用一个例子简单介绍一下:echo asdfjaklsfnalsdfsaf >tty0
运行上面的命令会在屏幕上看到上面的字符串。*/
# 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
# 用户空间的串口编程针对的仍是/dev/ttyS0等
# mem=32M表示内存是32M,如果是64则设为64MFloating point emulation -->
[*] NWFPE math emulation
#This is necessary to run most binaries!!!
#接下来要做的是对内核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
USB Support -->
<*> Support for Host-side USB
MMC/SD Card Support -->
<*> MMC Support
<*> MMC block device driver
#接下来做的是针对文件系统的设置,本人实验时目标板上要上的文件系统是cramfs,故做如下配置
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
#配置LCD相关的信息
Device Drivers--->Graphics support
选中: support for frame buffer devices
S3C2410 LCD framebuffer support
logo Config--> Standard 224_color
Bootup logo
保存退出,产生.config文件。
4.4 编译内核,下载到板子上
#make zImage
生成zImage在arch/arm/boot/目录下
要烧写的文件就是该文件:zImage