080923 linux2.6的移植 2.6.14

计划采用 yaffs文件系统.

linux2.6.19 的内核开始提供了队yaffs文件系统的支持, 在这之前的版本没有, 需要给linux内核打补丁使支持yaffs2文件系统.

 

我的预计分区是:

 启动开发板,进入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

基于linux2.6.14的移植

一、编译内核 <?XML:NAMESPACE PREFIX = O />

1. make distclean 或者 make mrproper

如果你是新下载的内核,那这一步就不用了。但如果你用的是别人移植好的内核,那最好在编译内核之前先清除一下中间文件,因为你们用来编译内核的交叉编译工具可能不同。

2.修改 Makefile

主要是以下两项: (编译环境改成3.4.1, remember vivi用的2.9.5)

1 ARCH = arm

2) CROSS_COMPILE = /usr/local/arm/<?XML:NAMESPACE PREFIX = ST1 />3.4.1/bin/arm-linux-

 3.  将分区信息加入内核

     

#vi $KERNEL/arch/arm/mach-s3c2410/devs.c
添加头文件:
              #include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h>
#include <asm/arch/nand.h>
添加分区结构:
              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_iis,
              //添加如下信息
              s3c_device_nand,
};
Ø        禁止Flash ECC效验
内核通过vivi把数据写入NAND Flash,而vivi的ECC效验算法和内核的不同,内核的效验码是由NAND Flash控制器产生的,所以在此必须禁用NAND Flash ECC。
#vi $KERNEL/drivers/mtd/nand/s3c2410.c
找到s3c2410_nand_init_chip函数,将chip->eccmode的值修改为:
NAND_ECC_NONE

 

 

 

二、让内核支持 yaffs 文件系统

   Yaffs2加载

Ø        下载Yaffs2
Ø        解压Yaffs2并将其加入Linux内核
       #cd ~
       #tar zxvf yaffs2.tar.gz
       #cd yaffs2
       #sh patch-ker.sh c /defoe/kernelfile/linux-2.6.14.1/   (写自己的目录)
 
好了以后内核的fs目录下会有一个 yaffs2的文件夹. 同时会提示更改了makefil和kconfig文件, 这样在linux2.6.14.1中执行make menuconfig就会有支持yaffs2的选项
 
 
或者手动来做这个.
    将 yaffs2文件夹copy到 linux.2.6.14.1内核的fs目录下
     改makefile文件
 添加一行: obj-$(CONFIG_YAFFS_FS)+=yaffs2/
   改kconfig 文件
 添加一行: source "fs/yaffs2/Kconfig
 
呵呵,  我直接开始make menuconfig 是看不到YAFFS2的选项的, 只有"load an altemate configuration file",选择 arch/arm/configs/smdk2410_defconfig   这个配置文件load进来才能看到 file systems-> miscellaneous filesystems->[ ]YAFFS2 file system support

估计是有某种依赖关系.  有待研究.//

 

解决:  要打开mtd的选项 ,才能看到 yaffs2的选项.

 

 

 

 

关于make menuconfig 的配置问题:

1. MTD 分区的支持

前面介绍了如何编译一个内核,现在要介绍的是如何让内核支持 yaffs 文件系统。在介绍添加文件系统的支持之前,首先了解一下有关 mtd 分区的概念:

MTD(memory technology device 内存技术设备 ) 是用于访问 memory 设备( ROM flash )的 Linux 的子系统。 MTD 的主要目的是为了使新的 memory 设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。

好了,其它的就不说了,有兴趣可以上网查一下相关的资料,下面说明让内核支持 mtd 分区的配置选项:

进入Device Drivers->Memory Technology Devices(MTD)目录,配置界面如下:
Memory Technology Device (MTD) support
[ ]   Debugging                                                          
│ │
[ ]   MTD concatenating support                                          
│ │
[*]   MTD partitioning support                                          
│ │
[ ]     RedBoot partition table parsing                                  
│ │
[ ]     Command line partition table parsing                            
│ │
[ ]     ARM Firmware Suite partition parsing                            
│ │
---   User Modules And Translation Layers                                
│ │
[*]   Direct char device access to MTD devices                          
│ │
[*]   Caching block device access to MTD devices                        
│ │
[ ]   FTL (Flash Translation Layer) support                              
│ │
[ ]   NFTL (NAND Flash Translation Layer) support                        
│ │
[ ]   INFTL (Inverse NAND Flash Translation Layer) support              
│ │
RAM/ROM/Flash chip drivers  --->                                  
│ │
Mapping drivers for chip access  --->                              
│ │
Self-contained MTD device drivers  --->                            
│ │
NAND Flash Device Drivers  --->                                    
│ │

进入NAND Flash Device Drivers目录,配置界面如下:
[*] NAND Device Support                                              
│ │
[ ]   Verify NAND page writes                                        
│ │
[*] NAND Flash support for S3C2410/S3C2440 SoC                      
│ │
[*]   S3C2410 NAND driver debug                                      
│ │
[ ]   S3C2410 NAND Hardware ECC                                      
│ │
[ ] DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplement
│ │
[ ] Support for NAND Flash Simulator                                
│ │

其它不用多设,甚至 Direct char device access to MTD devices 选项和Mapping drivers for chip access  ---> 目录下的所有选项都可以去掉(经已试验过) 。因为那些是为 nor flash 服务的,一般文件系统都会放在 nand flash 上吧,不过也不排除例外。那你就干脆让它们留着好了,因为编译出来后实在多不了多少,我把它们去掉的原因只是为了试验 ^_^

 

};

注:分区表信息要参考你自己的内核和文件系统的大小,排布来设置,vivi中的分区信息要和mtd分区信息一致,分多少个区由你自己决定,我的就只分了4个区^_^

二、为了支持yaffs2文件系统,需要帮内核加上对yaffs2文件系统的支持,详细请看这个贴:
http://www.hfrk.net/S3C2410/kaifa/061400335345164_30.htm

主要是把yaffs2文件系统的文件拷贝到fs目录,并修改Makefile Kconfig文件。

在配置方面有些地方要注意一下,以下是我的配置信息:

注:mtd分区配置的信息前面已经有了,可以回头参考前面的配置。

File systems->Miscellaneous filesystems 目录,配置信息如下:
[*] YAFFS2 file system support                                              
│ │
---   512 byte / page devices                                                
│ │
[]     Lets Yaffs do its own ECC                                            
│ │
[]       Use the same ecc byte order as Steven Hill's nand_ecc.c            
│ │
---   2048 byte (or larger) / page devices                                  
│ │
[]     Autoselect yaffs2 format                                            
│ │
[]     Disable lazy loading                                                
│ │
[]   Turn off wide tnodes                                                  
│ │
[]   Turn off debug chunk erase check                                      
│ │
[]   Cache short names in RAM

在这里要说明一下以上的配置,在论坛发贴的时候我因为对它不怎么了解,几乎是全部选上的。后来经过自己的理解和摸索,发现:

1、 ---   2048 byte (or larger) / page devices   目录以下全部不用选,因为这是 yaffs2 文件系统的,如果你是用 yaffs 文件系统的话就不必选择这个了 ( 我到现在还没去研究 yaffs2 yaffs 文件系统优越多少,反正 yaffs 文件系统用得好好的 )  

2、 Lets Yaffs do its own ECC 这一项,网上很多人说 yaffs 文件系统和 mtd 驱程的更新速度问题,导致加上 ecc 检测后,会挂不了 yaffs 文件系统,所以要把 mtd 驱程的 ecc 检测去掉,让 yaffs 自己做 ecc 检测(就是要选上这一项)。不过去掉 mtd 驱程 ecc 检测的后果就是换来烦人的 Reading data from NAND FLASH without ECC is not recommended 的提示,后来发现原来把 mtd 驱程的 ecc 检测加回去,也可以很好的支持 yaffs 文件系统,所以就把这一项去掉了,终于可以不用再看那烦人的提示了 ^_^

 

三、现在轮到郁闷我了很久的devfs的问题,因为2.6.12内核以后取消了devfs的配置选项,具体为了什么我不清楚,不过缺少了它内核问题抱怨找不到mtdblock设备。据我所知网上每天都有不少的新手在为此事而困扰^_^

以下给出解决方法:

2.6.12fs/Kconfig中拷贝下面几项到2.6.14fs/Kconfig中去:

config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
depends on EXPERIMENTAL
help
…………………………………………………

config DEVFS_MOUNT
bool "Automatically mount at boot"
depends on DEVFS_FS
help
………………………………………………….

config DEVFS_DEBUG
bool "Debug devfs"
depends on DEVFS_FS
help
…………………………………………………..

help 的部分就省了,反正你在 2.6.12 内核的配置文件会看得到,或者自己写上去也行。

重新make menuconfig 在File systems->Pseudo filesystems目录里面可以后到devfs的配置选项如下:
[*] /proc file system support                                          
│ │
[*] /dev file system support (OBSOLETE)                                
│ │
[*]   Automatically mount at boot                                      
│ │
[*]   Debug devfs                                                      
│ │
[*] Virtual memory file system support (former shm fs)                
│ │
[ ] Relayfs file system support

顺便说一下,在内核配置的时候经常会看到 debug 选项吧?这是为了调度内核用的,你不需要的话可以去掉。有时还会让你选择 quiet nosy ,选择 nosy 的话输出的调试信息当然会比 quiet 要多了。

 

三、内核的下载和使用(关于文件系统的制作和下载请看相应的贴)

下载内核相当简单,我是直接在 vivi 下使用 load flash kernel u 来下载的内核(其实在下载内核和文件系统之前要涉及到 vivi mtd 分区的设置问题,不过还是在文件系统的制作和使用部分再说好了)。

文件系统和内核的关系不是很大,所以你可以用你新做好的 2.6 内核看看能否挂载板上自带的 yaffs 文件系统,我还没做自己的文件系统之前就是这样做的。如果成功的话,恭喜你迈出了第一步。

顺便介绍一下内核启动参数的设置:

Flash 启动: param set linux_cmd_line “noinitrd root=/dev/mtdblock/3 (init=/linuxrc) console=ttySAC0”

Nfs 启动: param set linux_cmd_line “console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.115:/friendly-arm/root ip=192.168.1.128:192.168.1.1:192.168.1.1:255.255.255.0:luofuchong:eth0:off”

 

四、总结:

幸好以前有发贴的习惯,内容保存得很好。写这份文档主要是根据我以后配置内核的经验对以前的配置作一点修改和提一下要点。如果不明的话恐怕你要自己多配置多查资料了,毕竟内核配置是以后经常要用到的,对内核配置选项的熟悉其重要性就不用多说了。好了,总结如此,希望对你有帮助。

发布了35 篇原创文章 · 获赞 3 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章