主要仍是參考tekkaman的文章http://blog.chinaunix.net/u1/34474/showart.php?id=369449本身修改了網卡移植這一部分。交叉編譯器用的是arm-linux-3.4.1版本。php
1、將Linux2.6.22.6內核源碼放到工做目錄的kernel文件夾下,並解壓。
#tar xzvf linux2.6.22.6.tar.gz
#pwd
/home/work/hzh1024n
# cd linux2.6.22.6
進入內核解壓後的目錄,之後示例中,只要是相對路徑所有是相對於
/home/work/hzh1024n/linux2.6.22.6/此目錄 html
2、修改內核源碼根目錄下的Makefile文件(CROSS_COMPILE =的值因我的狀況而定,其餘能夠照作。)
#vi Makefilelinux
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=算法
ARCH = arm
CROSS_COMPILE = /usr/local/arm/3.4.1/bin/arm-linux- 編程
3、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分區信息和Nand Flash的硬件信息。bash
......
/* NAND parititon from 2.4.18-swl5 */app
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "U-Boot-1.2.0",
.size = SZ_128K,
.offset = 0,
},
[1] = {
.name = "U-Boot-1.2.0 Parameter",
.offset = SZ_128K,
.size = SZ_64K,
},
[2] = {
.name = "Linux2.6.22.2 Kernel",
.offset = SZ_128K+SZ_64K,
.size = SZ_4M+(SZ_1M-SZ_128K-SZ_64K),
},
[3] = {
.name = "Root-JFFS2",
.offset = SZ_1M * 5,
.size = SZ_1M * 5,
},
[4] = {
.name = "Boot-Root(cramfs)",
.offset = SZ_1M * 10,
.size = SZ_1M * 10,
},
[5] = {
.name = "YAFFS",
.offset = SZ_1M * 20,
.size = SZ_1M * 44,
}
/*,
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}
*/
};
......less
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = ,
.twrph0 = 30,
.twrph1 = ,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
......socket
4、 修改drivers/mtd/nand/s3c2410.c,去掉nand flash 的ECC。
個人內核是經過U-BOOT寫到Nand Flash的, U-BOOT 經過的軟件ECC算法產生ECC校驗碼, 這與內核校驗的ECC碼不同, 內核中的ECC碼是由S3C2410中Nand Flash控制器產生的。因此,我在這裏選擇禁止內核ECC校驗。ide
(不過我不瞭解內核中的ECC碼生成原理,在查資料的過程當中我看到了《成功移植最新的2.6.22.3的linux kernel到S3C2410上》,連接是http://www.cnitblog.com/zouzheng/archive/2007/08/28/32545.html和http://hi.baidu.com/wangy0919/blog/item/0058652ae8c3133b5343c1cf.html,都是轉載的,但都沒找到原做者是誰。其中有這樣一段活:
「第三步:修改ECC校驗:
根據kernel官方網站上的說明,從2.6.22.3已經修改了ECC校驗的問題(這也是我移植2.6.22.3的一個重要緣由)。但實驗下來發現,不論是用軟件ECC仍是硬件ECC都不行。只好改爲NAND_ECC_NONE:
在driver/mtd/nand/s3c2410.c中找到s3c2410_nand_init_chip()函數,將其中的
chip->ecc.mode=NAND_ECC_SOFT;
改爲
chip->ecc.mode=NAND_ECC_NONE; 」
搜索關鍵字NAND_ECC_SOFT,在s3c2410_nand_init_chip函數裏,修改NAND_ECC_SOFT爲NAND_ECC_NONE
5、增長Yaffs2文件系統的支持
對於YAFFS文件系統,我在移植時查閱了許多資料。有的博客上說沒有必要移植YAFFS2,由於它是爲每頁大於1024B的NAND Flash設計的。即便移植了YAFFS2,若是你的NAND Flash是每頁512+16B的那系統也會自動掛載YAFFS。因此在這裏要移植YAFFS2或是YAFFS 隨你的便。我移植的是YAFFS2。
1、下載Yaffs2
URL:http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
2、解壓Yaffs2並將其加入Linux內核(打補丁的方式)
#cd yaffs2
#./patch-ker.sh c /home/work/hzh1024n/linux-2.6.22.6/
六、配置內核
在配置內核前,先拷貝s3c2410開發板的默認配置到內核根目錄下,以簡化配置過程。
#pwd
/home/work/hzh1024n/linux-2.6.22.6
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
如下是在 s3c2410_defconfig 基礎上要配置的選項(有一些必須的選項在s3c2410_defconfig裏已經選上了,因此我沒有寫出來。如下的選項非特別說明,可能不用選,我沒有作實驗證實哪些要、哪些不要,因此有興趣的能夠本身作實驗看看,歡迎發E-Mail告訴我結果。謝謝)
General setup --->
[*] Configure standard kernel features (for small systems) --->
選上這項,不然文件系統中的一些選項不會出現
System Type --->
S3C2410 Machines --->
[*] SMDK2410/A9M2410 留下這項就夠了,其餘所有「N」掉
「N」掉 S3C2412 Machines ---> 、 S3C2440 Machines ---> 和 S3C2443 Machines ---> 裏的全部選項,都是和2410無關的選項。
Boot options --->
將 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string
改爲 (noinitrd root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200 init=/linuxrc mem=64M) Default kernel command string
#說明:
#mtdblock3表明第4個flash分區,用來做根文件系統rootfs;
# console=ttySAC0,115200使kernel啓動期間的信息所有輸出到串口上,波特率爲115200;
# 2.6內核對於串口的命名改成ttySAC0,但這不影響用戶空間的串口編程。
# 用戶空間的串口編程針對的還是/dev/ttyS0等
# mem=64M表示內存是64M,若是是32則設爲32M
在實踐中,我發現「rootfstype=jffs2」這句仍是挺重要的。若是沒有這句,系統啓動時即便分區掛載正確了,可是文件系統的類型有可能出錯。在這裏定義過,就不會出錯了。這裏的選項也和根文件系統的配置有關。(我先使用jffs2作跟文件系統,之後再換YAFFS)
Userspace binary formats --->
< > Kernel support for a.out and ECOFF binaries (去除該選項,a.out和ECOFF是兩種可執行文件的格式,在ARM-Linux下通常都用ELF,因此這兩種基本用不上。)
Networking --->
Networking options --->
<*> Packet socket
[*] Packet socket: mmapped IO
-我移植華碩無限網卡,因此我選了WLAN(802.11)的選項,不需的能夠不選-
Wireless --->
--- Improved wireless configuration API
--- Wireless extensions
<*> Generic IEEE 802.11 Networking Stack (mac80211)
[*] Enable LED triggers
[ ] Enable debugging output (NEW)
<*> Generic IEEE 802.11 Networking Stack
[ ] Enable full debugging output (NEW)
--- IEEE 802.11 WEP encryption (802.1x)
< > IEEE 802.11i CCMP support (NEW)
< > IEEE 802.11i TKIP encryption (NEW)
<*> Software MAC add-on to the IEEE 802.11 networking stack
[ ] Enable full debugging output (NEW)
Device Drivers --->
「N」掉 Parallel port support ---> 裏的全部選項。
Plug and Play support --->裏的全部選項必定要「N」掉,否則編譯會出錯!!!!!!!!
Network device support --->
Ethernet (10 or 100Mbit) --->
選上<*> DM9000 support和< > Generic Media Independent Interface device support
-------——————————————————------
我用的是DM9000A網卡,網卡驅動移植後面介紹
-----------------------------
「N」掉 [ ] Ethernet (1000 Mbit) --->和 [ ] Ethernet (10000 Mbit) --->
Wireless LAN --->
[*] Wireless LAN (pre-802.11)
[*] Wireless LAN (IEEE 802.11)
USB Network Adapters --->
<*> Multi-purpose USB Networking Framework
<*> MMC/SD card support --->
Real Time Clock --->
「N」掉 [ ] Set system time from RTC on startup and resume
#接下來作的是針對文件系統的設置!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(注意:不要試圖按照舊內核的方法增長 devfs 的支持,由於在這個內核裏已經完全刪除了
devfs的源代碼。我曾試圖將舊內核的devfs源代碼複製過來,不過編譯會出錯!
補救的辦法就是用BusyBox的mdev來代替,在講根文件系統的創建時我會說明,你也能夠到網上找mdev的資料。)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
File systems -->
< > Second extended fs support #去除對ext2的支持
< > Ext3 journalling file system support #去除對ext3的支持
<*> Kernel automounter support
<*> Kernel automounter version 4 support (also supports v3)
<*> Filesystem in Userspace support
Pseudo filesystems -->
[*] Virtual memory file system support (former shm fs)
<*> Userspace-driven configuration filesystem (EXPERIMENTAL)
Miscellaneous filesystems -->
<*> YAFFS2 file system support
「N」掉[ ]Autoselect yaffs2 format 和
[ ]Cache short names in RAM ,由於這是給每頁大於1024B的NAND Flash設計的
<*> Journalling Flash File System v2 (JFFS2) support
(0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
[*] JFFS2 write-buffering support
[ ] JFFS2 summary support (EXPERIMENTAL)
[ ] JFFS2 XATTR support (EXPERIMENTAL)
[*] Advanced compression options for JFFS2
[*] JFFS2 ZLIB compression support
[*] JFFS2 RTIME compression support
[*] JFFS2 RUBIN compression support
JFFS2 default compression mode (priority) --->
Network File Systems -->
<*> NFS file system support
--如下最好選上,由於在掛載NFS時可能出現protocol不支持的狀況--
[*]Provide NFSv3 client support
[*]Provide client support for the NFSv3 ACL protocol extension
[*] Provide NFSv4 client support (EXPERIMENTAL)
[*] Allow direct I/O on NFS files
-------------------------------------------------------------------------
<*> NFS server support
[*] Provide NFSv3 server support
[*]Provide server support for the NFSv3 ACL protocol extension
[*] Provide NFSv4 server support (EXPERIMENTAL)
--- Provide NFS server over TCP support
[*] Root file system on NFS
保存退出,產生.config文件。
7、編譯內核
#make zImage
正常來講編譯是不會出錯的,只有一些警告。
八、移植到s3c2440