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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章