移植Linux2.6.22.6到s3c2410/2440開發板成功

主要仍是參考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
 
個人內核是經過UBOOT寫到Nand Flash, UBOOT 經過的軟件ECC算法產生ECC校驗碼, 這與內核校驗的ECC碼不同, 內核中的ECC碼是由S3C2410Nand Flash控制器產生的。因此,我在這裏選擇禁止內核ECC校驗。ide


 (不過我不瞭解內核中的ECC碼生成原理,在查資料的過程當中我看到了《成功移植最新的2.6.22.3linux kernelS3C2410上》,連接是http://www.cnitblog.com/zouzheng/archive/2007/08/28/32545.htmlhttp://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_SOFTNAND_ECC_NONE


 5、增長Yaffs2文件系統的支持
  
對於YAFFS文件系統,我在移植時查閱了許多資料。有的博客上說沒有必要移植YAFFS2,由於它是爲每頁大於1024BNAND Flash設計的。即便移植了YAFFS2,若是你的NAND Flash是每頁51216B的那系統也會自動掛載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裏已經選上了,因此我沒有寫出來。如下的選項非特別說明,可能不用選,我沒有作實驗證實哪些要、哪些不要,因此有興趣的能夠本身作實驗看看,歡迎發EMail告訴我結果。謝謝)

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表明第4flash分區,用來做根文件系統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.outECOFF是兩種可執行文件的格式,在ARMLinux下通常都用ELF,因此這兩種基本用不上。)

Networking  --->
Networking options  --->  

    <*> Packet socket 

    [*]   Packet socket: mmapped IO


-我移植華碩無限網卡,因此我選了WLAN802.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源代碼複製過來,不過編譯會出錯!

   補救的辦法就是用BusyBoxmdev來代替,在講根文件系統的創建時我會說明,你也能夠到網上找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 ,由於這是給每頁大於1024BNAND 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

   首先,Linux2.6.22.6自己就支持s3c2440處理器,因爲2410和2440基本兼容,因此在linux源碼裏2440的不少文件是和2410共用的。因此在按照我移植2410記錄的基礎上,主要修改以下:
 
1、開發板選項的選擇。
System Type  --->      
   S3C2440 Machines  --->  
    [*] SMDK2440
    [*] SMDK2440 with S3C2440 CPU module
留下這兩項就夠了,S3C2400 Machines  ---> 、S3C2410 Machines  --->、S3C2412 Machines  --->、S3C2442 Machines  --->、S3C2443 Machines  --->裏的項目所有「N」掉。
 
這兩個選項是區分你的目標芯片是2410仍是2440的關鍵選項!!
2、系統初始化時的芯片晶振頻率的修改,修改arch/arm/mach-s3c2440/mach-smdk2440.c
 ......
    static void __init smdk2440_map_io(void)
{
    s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
    s3c24xx_init_clocks( 12000000);
    s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
 ......
若是沒有改這個參數,系統啓動時到了"done, booting the kernel." 以後就會出現亂碼現象或是沒有輸出。我一開始就碰到了這個麻煩。出現此類亂碼或沒有輸出現象的另外一個緣由多是你的bootloader對CPU的主頻和 分頻的設置不正確。SBC2440V4的設置最好是時鐘頻率405MHz,分頻比爲1:4:8,否則有可能出現上述現象。
 
#make zImage編譯的內核就支持s3c2440了。
 
網卡的移植之後再講。
相關文章
相關標籤/搜索