2.6.27是Linux内核的最新版本。昨天中午下载的,用了半天的时间完成了针对ARM CPU的基本配置,第一次做Linux移植就出乎意料的顺利,其实这主要得益于Linux内核优良的设计和该版本对ARM处理器近乎完美的支持!
关键词: Linux 2.6.27 内核 移植 ARM S3C2410
再写一遍:
下面把我的整个配置过程与大家分享一下:
第一部分 准备工作
1. 下载Linux内核:
从 http://www.kernel.org/pub/linux/kernel/v2.6/ 下载最新版的,tar.gz和tar.bz2 均可,我下载的是linux-2.6.27.tar.bz2这个,使用 tar -jxvf linux-2.6.27.tar.bz2 解压缩,cd linux-2.6.27 转到内核代码根目录;
2. 下载安装并配置 arm-linux-gcc 工具链:
以前配置过的话,该步可以忽略。我用的是3.4.1版本,建议安装到/usr/local/arm/3.4.1目录下,记得要设置一下工具链程序的搜索目录, export PATH=$PATH:/usr/local/arm/3.4.1/bin 即可;
第二部分 代码配置
3. 修改Makefile:
# gedit Makefile
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
4. 修改C程序文件,指明Flash分区信息,添加NAND Flash驱动支持:
总共只有两个文件需要修改:
/arch/arm/plat-s3c24xx/common-smdk.c
/arch/arm/plat-s3c24xx/devs.c
(1) 指明分区信息:
common-smdk.c 中找到 static struct mtd_partition smdk_default_nand_part[],根据自己板子的分区结构修改,例如我的vivi下的分区信息为:
name offset size flag
------------------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00040000 0x002c0000 0 2M+768k
root : 0x00300000 0x01d00000 16 29M
rootfs : 0x02000000 0x01f00000 0 31M
我的Flash分了4个区,这个变量就应设置为:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "vivi",
.offset = 0x00000000,
.size = 0x00020000,
},
[1] = {
.name = "param",
.offset = 0x00020000,
.size = 0x00010000,
},
[2] = {
.name = "kernel",
.offset = 0x00040000,
.size = 0x002c0000,
},
[3] = {
.name = "root",
.offset = 0x00300000,
.size = 0x01d00000,
},
[4] = {
.name = "rootfs",
.offset = 0x02000000,
.size = 0x01f00000,
},
};
与上面的信息一一对应,很容易理解;
(2) 建立NAND Flash芯片支持:
common-smdk.c 中找到 static struct s3c2410_platform_nand smdk_nand_info,修改为:
/*static*/
struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0,
.twrph0 = 30,
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
这个变量是与NAND Flash时序有关的设置,talcs, twrph0, twrph1 的含义见S3C2410手册的6-3,随着板子的Flash芯片不同这里的值可能会有些差别,我的是K9S1208型号的;另外注意,一定要将变量前面的static修饰词删除或者注释掉,原因在后面;
(3) 加入NAND Flash芯片支持到NAND Flash驱动:
devs.c 中找到 struct platform_device s3c_device_nand,在前面加上前面 smdk_nand_info 变量的 extern,后面加上smdk_nand_info的指针引用,具体代码如下:
extern struct s3c2410_platform_nand smdk_nand_info;
struct platform_device s3c_device_nand = {
.name = "s3c2410-nand",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource,
/* Add the NAND Flash device */
.dev=
{
.platform_data = &smdk_nand_info,
}
};
(4) 指定启动时初始化:
找到这一段代码:
static struct platform_device __initdata *smdk_devs[] = {
&s3c_device_nand,
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
};
这段代码指定了内核启动时初始化的设备,其中s3c_device_nand是必须有的,因为我们需要NAND Flash驱动来挂载根文件系统,其余的根据需可自行添加,这里我们使用默认设置,不做修改。
5. 禁止Flash ECC校验:据说vivi或uboot通过软件算法产生的ecc校验码于S3C2410 NAND Flash 控制器产生的ecc校验码不一致,所以我们在这里选择禁止内核ECC校验,具体做法如下:
在drivers/mtd/nand/s3c2410.c文件中找到s3c2410_nand_init_chip()函数,在函数体最后加上 chip->ecc.mode = NAND_ECC_NONE; 保存,退出。
以下为内核配置部分
6. 支持启动时挂载devfs:
由于2.6内核去掉了对devfs的支持,这里我们需要手动将其加上,并在/sbin/init运行之前能自动挂上/dev为devfs文件系统,修改fs/Kconfig文件:
找到menu "Pseudo filesystem",在其后添加如下语句:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depend on DEVFS_FS
7. 配置内核产生.config文件
# cp arch/arm/configs/s3c2410_defconfig ./.config
# make menuconfig
绝大部分选项都先采用默认设置,待移植成功后我们再进一步裁减,这里只设置一项:
Boot Options ---> Default kernel command string: noinitrd root=/dev/mtdblock4 console=ttySAC0,115200
注:因为我的Flash分了5个区,标识符分别为mtdblock0、mtdblock1... mtdblock4,第五个分区(也就是mtdblock4)是我们存放cramfs根文件系统的分区,故设置 root=/dev/mtdblock4。
到此,内核配置完成
第三部分 编译测试
8. 编译内核
# make zImage
9. 载入内核映像,试运行: 可以先用tftp将zImage映像下载到RAM某个地址(通常是0x30008000),然后用vivi命令 go 0x30008000 0 193 跳到这个地址执行(0和193是传递给内核的参数,用寄存器r0, r1存放),之后如果在终端中打印出设备初始化信息,那恭喜你,你已经成功一大半了!否则,回过头去检查是否有遗漏或错误的地方。
第四部分 应用程序的移植
包括busybox的移植、启动脚本的编写、cramfs映像的创建等,请参见《Linux系统移植》文档的《应用程序移植》章节
再写一遍关键词: S3C2410 ARM 内核移植 Linux 2.6.27
参考资料:
刘勇等. Linux系统移植. ---, --- http://www.gd-emb.com/bbs/data/uploads/linux_mig_release_G4oyxcsIVyIZ.pdf
所用设备:
阳初S3C2410开发板V2.3版 http://www.yangchu.com/
(原创文章,转载时请注明本文网址)