分类: LINUX
2009-02-25 17:07:30
------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://sjj0412.cublog.cn/
------------------------------------------
一:准备工作
下载linux-
大家可以在
下载
下载yaffs2源码
大家可以在
,点download toolbar下载解压是cvs里面有yaffs,yaffs2源码。
二:配置,补丁,编译
解压linux-
Cd linux-
修改配置文件:
1.修改Makefile,匹配交叉编译器。
在内核代码根目录下:vim Makefile
找到ARCH:(用vi的查找命令/ARCH)
修改为
ARCH = arm
CROSS_COMPILE ?= /usr/local/arm/
CORSS_COMPILE视自己的环境而定。
2. 为了内核支持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
------------------------------------------------------------------------------------------------------------
修改源代码:
1. 添加yaffs2源码。
首先解压下载的yaffs2源码,解压后是cvs,有两个文件夹,找到yaffs2文件夹,里面有个patch-ker.sh,运行它,./patch-ker.sh /usr/src/linux-
即可为内核打支持yaffs2的补丁,其实这个补丁很简单,如果你下的yaffs2没有这个补丁文件,可以手动打。
首先将yaffs2文件夹拷贝到内核的fs文件夹下
1】修改fs/Kconfig
找到menu "Miscellaneous filesystems"在下面添加
include "fs/yaffs2/Kconifg"
注意KconfigZ中的K为大写
2】修改fs/Makefile
添加
Obj-$(CONFIG_YAFFS_FS)+=yaffs2/
2. 修改nand的分区信息。要让内核知道nand flash的分区信息.
在arch/arm/mach-s3c2410/mach-smdk2440.c中添加nand分区信息,;我这设置为3个分区,这个要和你的bootLoad的分区情况一样,否则加载内核可能失败。
可以在bootload模式下通过part show查看分区情况,然后设置这里的值。
在我的板子中修改如下:
static int chip0_map[] = { 0 };
struct mtd_partition bit_default_nand_part[] = {
[0] = {
.name = "bootloader",
.offset = 0x00000000,
.size = 0x00030000,
},
[1] = {
.name = "kernel",
.offset = 0x00050000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset = 0x00250000,
.size = 0x03dac000,
}
};
/* the bit has 1 selectable slots for nand-flash, the three
* on-board chip areas, as well as the external SmartMedia
* slot.
*
* Note, there is no current hot-plug support for the SmartMedia
* socket.
*/
static struct s3c2410_nand_set bit_nand_sets[] = {
[0] = {
.name = "chip0",
.nr_chips = 1,
.nr_map = chip0_map,
.nr_partitions = ARRAY_SIZE(bit_default_nand_part),
.partitions = bit_default_nand_part
},
};
static struct s3c2410_platform_nand bit_nand_info = {
.tacls = 0,
.twrph0 = 30,
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(bit_nand_sets),
.sets = bit_nand_sets,
}
添加nand设备
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_nand,
&s3c_device_iis,
};
修改smdk2440_map_io如下
void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);//默认值是1690000,改为12000000;
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
s3c24xx_set_board(&smdk2440_board);
s3c_device_nand.dev.platform_data = &bit_nand_info;//添加的原来没有
}
3.修改nand Flash的校验方式,去掉ECC校验。
在drivers/mtd/nand/s3c2410.c 第550行
将chip->ecc.mode = NAND_ECC_SOFT;
改为 chip->ecc.mode = NAND_ECC_NONE;
在内核中明确说明是不建议这样做的,因为这样就等于忽略了对NAND FLASH坏块的检测 由于这个地方设置为NAND_ECC_NONE了,mtd中的nand驱动就会报错,到时会出现如下错误,但是能正常挂载根目录。
Writing data without ecc to nand flash is not recommended
Reading data ……………….
这个使得启动很慢,且复制和创建文件时都有,很不舒服,这时就需要更改nand.h的驱动,将这些错误信息注释掉。
在drivers/mtd/nand/nand_base.c 873行
printk (KERN_WARNING "Writing data without ECC to NAND-FLASH is not recommended\n");
改为
// printk (KERN_WARNING "Writing data without ECC to NAND-FLASH is not recommended\n");
同时通过vi的查找命令找recommended,找到所有这些提示printk,都注释掉。
4由于添加了内容,需要添加相应头文件:
在mach-smdk2440.c中添加
#include
#include
#include
#include
否则会报错。
------------------------------------------------------------------------------------------------------------
配置
先把默认配置文件拷贝过来
cp arch/arm/configs/s3c2410_defconfig .config
配置
Make menuconfig
[*] Enable loadable module support --->
[*] Module unloading
[*] Automatic kernel module loading
选择这两个,剩下的可以去掉
System Type ---->
[*] S3C2410 DMA support
[*] Support ARM920T processor
S3C24xx Implementations --->
[*] SMDK2410/A9M2410
[*] SMDK2440
这里面只留这两项
Boot option ----->
修改启动参数为:
noinitrd root=/dev/31:2 init=/linuxrc console=ttySAC0,115200
可能根据个人板子的设置会不一样,我的是从Nand Flash中加载文件系统,其中31是nand主设备号,2代表第3分区,也可设置为/dev/mtdblock2,是存放我的Linux文件系统的分区。不过,在bootloader可以传递内核参数的情况下这个设置是无效的。
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[ ] S3C2410 NAND Hardware ECC //这个要去掉
File System--->
Miscellaneous filesystems--->
<*>YAFFS2 filesystem support
<*>Autoselect yaffs2 format
<*>Cache short name in RAM (下面两个个是在YAFFS2 filesystem support选择后自动选的)
……
……
<>journalling flash file systemversion(jffs) support
<>journalling flash file systemversion2(jffs2) support
取消这两个,否则当你的root_fs是yaffs2时,由于jffs和yaffs2文件系统都没有超级块,即不能识别文件类型,jffs也能挂载yaffs2系统,只不过他读的数据都是错的,并将所有数据放在/lost+found文件夹中,故如果jffs也加载了,他可能先挂载yaffs系统,这样就会挂载失败。
其他的选择默认就可以了。
------------------------------------------------------------------------------------------------------------
编译内核
最关键的时候到了
执行make zImage
如果你的机子够好,10多分钟Ok了。
然后将zimage下载到开发板,并制作yaffs根文件系统,进行验证。
制作yaffs根文件系统时,最好用yaffs源码下utils下的源文件编译得到的mkyaffsimage工具,否则可能通过此工具制作的yaffs2映像和内核的yaffs不一致,也可能加载根文件系统失败,如果你下载的源码中没有utils,可以下载这个试一下。