基于S3C2410平台移植Linux 2.6.14内核&驱动指南
扫描二维码
随时随地手机看文章
安装交叉编译工具
?下载交叉编译工具
(本文默认所有软件均下载在用户主目录下)
arm-linux-gcc-3.4.1 —— 交叉编译工具
URL:ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
?安装
//将压缩包移动至根目录下
#mv arm-linux-gcc-3.4.1.tar.bz2 /
//解压,默认路径为 /usr/local/arm /3.4.1
#tar jxvf arm-linux-gcc-3.4.1.tar.gz2
下载Linux内核
?下载Linux 2.6.14内核
URL:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2
?解压内核
#cd ~
#tar jxvf linux-2.6.14.tar.bz2
建立环境变量
?将交叉编译工具路径和内核路径加入环境变量
#vi ~/.bashrc
export KERNEL=~/linux-2.6.14
export PATH=/usr/local/arm/3.4.1/bin:$PATH
内核移植
?为Flash进行分区
启动开发板,进入vivi,对vivi进行分区操作
vivi>bon part 0 128k 192k 2240k 5312k:m 64704k
分区信息如下所示:
分区
起始地址
分区大小
分区作用
Part0
0x0
0x00020000 (128k)
bootloader
Part1
0x00020000
0x00010000 (64k)
bootloader params
Part2
0x00030000
0x00200000 (2m)
linux kernel
Part3
0x00230000
0x00300000 (3m)
root filesystem
Part4
0x00530000
0x03A00000 (58m)
yaffs filesystem
将vivi写进Flash
vivi>load flash vivi x
?修改Makefile
#vi $KERNEL/Makefile
找到ARCH与CROSS_COMPILE,修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
?将分区信息加入内核
#vi $KERNEL/arch/arm/mach-s3c2410/devs.c
添加头文件:
#include
#include
#include
添加分区结构:
static struct mtd_partition partition_info[]={
{
name: "loader", //分区名字,任意
size: 0x00020000, //分区大小
offset: 0x0, //分区的起始地址,相对于0x0的偏移
},{
name: "param",
size: 0x00010000,
offset: 0x00020000,
},{
name: "kernel",
size: 0x00200000,
offset: 0x00030000,
},{
name: "rootfs",
size: 0x00300000,
offset: 0x00230000,
},{
name: "yaffs",
size: 0x03A00000,
offset: 0x00530000,
}
};
struct s3c2410_nand_set nandset={
nr_partitions: 5, //分区数量
partitions: partition_info, //分区表
};
struct s3c2410_platform_nand superlpplatform={
//NAND Flash芯片支持
//参数意义可参考S3C2410手册
tacls: 0,
twrph0: 30,
twrph1: 0,
sets: &nandset,
nr_sets: 1,
};
修改s3c_device_nand,以加入NAND Flash驱动:
struct platform_device s3c_device_nand = {
.name = "s3c2410-nand", //设备名称
.id = -1,//有效设备编号,-1表示唯一设备
.num_resources = ARRAY_SIZE(s3c_nand_resource), //寄存器区的个数
.resource = s3c_nand_resource, //寄存器区的首地址
//添加如下信息,表示NAND Flash设备
.dev={
.platform_data=&superlpplatform
}
};
?指定启动时的设备初始化
#vi $KERNEL/arch/arm/mach-s3c2410/mach-smdk2410.c
修改:
static struct platform_device *smdk2410_devices[] __initdata = {
s3c_device_usb,
s3c_device_lcd,
s3c_device_wdt,
s3c_device_i2c,
s3c_device_i