您的位置:首页 > 运维架构 > Linux

移植linux2.6.19成功^_^

2013-07-23 18:53 295 查看
前几天把VIVI和U-BOOT移植成功后,就进入了主要的学习环节,LINUX的移植,从www.kernel.org下载2.6.19.tar.bz2,解压:
#tar jxvf 2.6.19.tar.bz2

1、修改内核顶层目录的Makefile,找到ARCH和CROSS_COMPILE的地方,修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
保存。必须使用3.2以上的编译器,我使用的是3.4.1

2、 修改arch/arm/mach-s3c2410/common-smdk.c
设置Nand Flash的分区和信息,下面是我的分区结构:

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_1M,
.offset = 0,
},
[1] = {
.name = "kernel",
.offset = SZ_1M,
.size = SZ_2M,
},
[2] = {
.name = "root",
.offset = SZ_1M*3,
.size = SZ_8M*5,
},
[3] = {
.name = "user",
.offset = SZ_1M*43,
.size = SZ_1M*21,
},
};

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,
};

说明:如果bootloader是VIVI的话,必须和VIVI里面的分区设置一致,可以启动VIVI,用part show命令查看,并且2.6.19的设置分区与其他版本如2.6.14或2.6.11有点区别,其他版本是修改
arch/arm/mach-s3c2410/devs.c和arch/arm/mach-s3c2410/mach-smdk2410.

3、指定启动时初始化
kernel启动时依据我们对分区的设置进行初始配置
修改arch/arm/mach-s3c2410/mach_smdk2410.c文件
修改smdk2410_devices[].指明初始化时包括我们在前面所设置的flash分区信息

static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
/* 添加如下语句即可 */
&s3c_device_nand,
};
保存,退出。
在这里不仅仅是NAND FLASH,其他新增加设备的移植和初始化方法也是如此!!!
我用的是2.6.19的内核,在这里我实验了几次,发现我添加了这句之后启动信息里面会出现下面的错误

S3C2410: Initialising architecture
kobject_add failed for s3c2410-nand with -EEXIST, don't try to register things with the same name in the same directory.
s3c24xx: failed to add board device s3c2410-nand (-17) @c024f38c
当我去掉这句之后就没有这样的错误了,可能是因为2.6.10以后的版本不用再添加这样的信息吧!可以参考网络上的一篇文章《Linux 2.6.10 以后版本对 S3C2410 的支持》

4、禁止Flash ECC校验
我使用的内核是通过u-boot写数据到Nand Flash的, u-boot通过的软件ECC算法产生ECC校验码, 这与内核校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的. 所以, 我们在这里选择禁止内核ECC校验。
修改drivers/mtd/nand/s3c2410.c 文件,找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:
chip->eccmode = NAND_ECC_NONE;
保存,退出。

5、2.6内核不支持DEVFS,而使用的是udev,网络上有一篇关于UDEV的文章写的很不错,《udev嵌入式上路经历》,可以看看!
我看了网上很多人说可以用下面的方法是其支持devfs,可以自己实验一下,我没有使用

支持启动时挂载devfs
为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改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

6、使用SMDK板子的config配置内核
#cp arch/arm/configs/smdk2410_defconfig .config
#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=64M
#说明:mtdblock2代表第3个NAND Flash分区,用来作根文件系统rootfs;
# console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上,波特率为115200;
# 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。但是看了很多网上的资料,也只有三星的S3C2410开发板才是ttySAC0,其他的仍然是ttyS0,我也没有实验过,因为我的开发板就是2410的!^_^
# 用户空间的串口编程针对的仍是/dev/ttyS0等
# mem=64M表示内存是64M,如果是32则设为32M
Floating 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 -->

阅读(1478) | 评论(1) | 转发(0) |

0
上一篇:使U-BOOT能正确引导LINUX

下一篇:编译busybox

相关热门文章

linux 常见服务端口

什么是shell

linux socket的bug??

【ROOTFS搭建】busybox的httpd...

linux的线程是否受到了保护?...

如何编写一个C程序实现将字符...

C程序能不能在main函数之前调...

看一个程序调用了哪些动态库用...

回复不了你啊,咋,威望值不够...

mysql的medium.cnf在哪里?...

给主人留下些什么吧!~~



Kernel Honey2007-12-19 20:35:22
You're Special 你不一般
你怎样完成的?
That's Incredible 简直难以置信

回复 | 举报

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: