2.6.14 內核移植說明文檔

admin @ 2014-03-25 , reply:0

一、編譯內核

  1.    make distclean 或者 make mrproper
     如果你是新下載的內核,那這一步就不用了。但如果你用的是別人移植好的內核,那最好在編譯內核之前先清除一下中間文件,因為你們用來編譯內核的交叉編譯工具可能不同。
  2.    修改 Makefile
    主要是以下兩項:
    1) ARCH = arm
    2) CROSS_COMPILE = /usr/local/arm/3.4.1/bin/arm-linux-
    注 :在我的宿主機上有不少的交叉編譯工具,而我又不習慣每次都傳遞參數,所以我選擇寫進 Makefile ,如果你的交叉編譯工具存放在不同的目錄或者使用不同的交叉編譯工具,那你改變一下 CROSS_COMPILE 的值就行了。
  3.    配置內核( Make menuconfig )
    我一般會選擇 load 一個配置文件然後在它的基礎上修改。方法:選中 load an Alternate Configuration File ,然後鍵入配置文件的路徑。
    在我剛編譯內核的時候選擇的是 linux-2.6.14/arch/arm/configs/smdk2410_defconfig 這個配置文件。
  4.    make

然後一切 OK , 2.6 內核的編譯就是這麼簡單。你可以在 linux-2.6.14/arch/arm/boot/ 目錄下看到我們需要的 zImage 文件。這就是經過壓縮的內核鏡像文件,把它下載到目標板上的 flash 中即可運行。由於 2410 已經作為 2.6 內核的標準板來支持,所以上面編譯的這個內核不用什麼修改即可運行,在串口可以看到內核的啟動信息。主要是啟動參數的問題:在 2.6 內核中, 2410 的串口由原來的 ttyS0 變為 ttySAC0 (聽說其它的板還是保持不變,具體沒有研究)。有關內核啟動參數的設置以後會逐步提到。 

二、讓內核支持 yaffs 文件系統

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 上吧,不過也不排除例外。那你就乾脆讓它們留著好了,因為編譯出來后實在多不了多少,我把它們去掉的原因只是為了試驗 ^_^ 

2.文件系統的支持

Yaffs 文件系統是專業針對 nand flash 的文件系統,比 jffs2 文件系統擁有更高的處理速度,更節省內存,支持的 mtd 分區更大等眾多優點,所以在此選用 yaffs 文件系統。

Yaffs 文件系統內核沒有集成,可以對其主頁下載:

http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/#dirlist

建議下載 yaffs2 源碼包,裡面就支持了 yaffs 和 yaffs2 兩種文件系統,把它添加進內核也很方便,有專門的腳本來處理。以下是我在文壇上發過的貼,裡面介紹了把 yaffs 文件系統支持添加進內核的全過程:

一、首先下載內核2.6.14和交叉編譯工具3.4.1。
可以看到其實要修改部分不多,主要是加上nandflash的支持和mtd分區表的填寫,如下:
1.修改arch\arm\mach-s3c2410\devs.c文件
增加頭文件定義
/***********add here***********/
#include   <linux/mtd/partitions.h>
#include   <asm/arch/nand.h>
#include   <linux/mtd/nand.h>
/**************end add********/

增加nand flash分區信息
/***********add here***********/
static struct mtd_partition partition_info[] ={
{
name: "loader",
size: 0x00020000,
offset: 0,
}, {
name: "param",
size: 0x00010000,
offset: 0x00020000,
}, {
name: "kernel",
size: 0x001c0000,
offset: 0x00030000,
}, {
name: "root",
size: 0x00200000,
offset: 0x00200000,
mask_flags: MTD_WRITEABLE,
}, {
name: "user",
size: 0x03af8000,
offset: 0x00400000,
}
};

struct s3c2410_nand_set nandset ={
nr_partitions: 5 ,
partitions: partition_info ,
};

struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
/**************end add********/

struct platform_device s3c_device_nand = {
.name  = "s3c2410-nand",
.id  = -1,
.num_resources  = ARRAY_SIZE(s3c_nand_resource),
.resource  = s3c_nand_resource,

/***********add here****************/
.dev = {
.platform_data = &superlpplatform
}
/**************end here************/
};
2. 修改arch\arm\mach-s3c2410\mach-smdk2410.c文件
Startic struct platform_device *smdk2410_devices[] __initdata={
&s3c_device_usb,
&s3c_device_lcd;
&s3c_device_wdt,
&s3c_device_i2c;
&s3c_device_iis,
&s3c_device_nand, /*add here*/
};

註:分區表信息要參考你自己的內核和文件系統的大小,排布來設置,vivi中的分區信息要和mtd分區信息一致,分多少個區由你自己決定,我的就只分了4個區^_^。

二、為了支持yaffs2文件系統,需要幫內核加上對yaffs2文件系統的支持。
主要是把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.12的fs/Kconfig中拷貝下面幾項到2.6.14的fs/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”

四、總結:

幸好以前有發貼的習慣,內容保存得很好。寫這份文檔主要是根據我以後配置內核的經驗對以前的配置作一點修改和提一下要點。如果不明的話恐怕你要自己多配置多查資料了,畢竟內核配置是以後經常要用到的,對內核配置選項的熟悉其重要性就不用多說了。好了,總結如此,希望對你有幫助。




[admin via 研發互助社區 ] 2.6.14 內核移植說明文檔已經有1250次圍觀

http://cocdig.com/docs/show-post-42460.html