歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 2.6內核在S3C2440平台上移植

此教程適合2.6.38之前的版本,其中2.6.35之前使用同一yaffs補丁包,2.6.36--2.6.28 yaffs文件系統有所改變,2.6.39之後的暫時不支持,源碼下載請到:http://www.kernel.org/

1.解壓linux-2.6.34.tar.bz2源碼包

#tar jxvf  linux-2.6.34.tar.bz2


2.修改linux-2.6.34/Makefile文件,在makefile中找到以下兩條信息並做修改

ARCH ? =arm 

CROSS_COMPILE?=/usr/local/arm/4.3.2/bin/arm-linux-

注意:

    交叉編譯器的環境變量也需要改為4.3.2

    #export PATH=/usr/local/arm/4.3.2/bin/:$PATH

    其中ARCH變量用來決定:配置、編譯時讀取Linux源碼arch目錄下哪個體系結構的文件

    PATH 用來決定交叉編譯器版本


3.修改機器類型ID號

    Linux源碼中支持多種平台的配置信息,內核會根據bootloader傳進來的mach-types決定那份平台的代碼起作用,本人手裡的板子是仿照三星公司官方給出的demo板改版而來,所以采用arch/arm/mach-s3c2440/mach-smdk2440.c此配置文件,打開此文件,翻到最後,有以下信息:

MACHINE_START(S3C2440, "SMDK2440")
    /* Maintainer: Ben Dooks <[email protected]> */
    .phys_io= S3C2410_PA_UART,
    .io_pg_offst= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
    .boot_params= S3C2410_SDRAM_PA + 0x100,
    .init_irq= s3c24xx_init_irq,
    .map_io= smdk2440_map_io,
    .init_machine= smdk2440_machine_init,
    .timer= &s3c24xx_timer,
MACHINE_END

   MACHINE_START(S3C2440, "SMDK2440")決定了此板子的mach-types,可以在以下文件中找到S3C2440對應的具體數字"arch/arm/tools/mach-types"文件查找S3C2440,362,這裡剛好與我們的bootloader相同,所以不用做修改,直接保存退出即可,如果不同則根據bootloader的內容修改此文件,或根據此文件修改boorloader的內容(在vivi中可通過param show查看,u-boot在Y:\test\u-boot_src\u-boot_edu-2010.06\board\samsung\unsp2440\unsp2440.c文件:gd->bd->bi_arch_number = MACH_TYPE_S3C2440;中決定)。

4.修改平台輸入時鐘

    由於我們使用的開發板跟SMDK2440.c晶振不同,需要修改 修改平台的時鐘頻率,修改內核源碼“arch/arm/mach-s3c2440/mach-smdk2440.c”,把時鐘初始化中(S3C24XX_init_clocks(16934400 ))的16934400 改為12000000,因為我們的開發板上為12M。


5.解壓yaffs.tar.gz2源碼包,進入yaffs2文件夾,給內核打上補丁使內核支持yaffs2

Linux官方不支持yaffs文件系統,我們需要打上相應的補丁

2.6.35(含)之前的補丁與2.6.36(含)之後的補丁從這裡下載

下載在Linux公社的1號FTP服務器裡,下載地址:

FTP地址:ftp://www.linuxidc.com

用戶名:www.linuxidc.com

密碼:www.muu.cc

在 2011年LinuxIDC.com\10月\Linux 2.6內核在S3C2440平台上移植

下載方法見 http://www.linuxidc.net/thread-1187-1-1.html

 

#./patch-ker.sh c /home/linux-2.6.34


6.修改內核mtd分區和bootloader(vivi)使其一致

    使用vivi或U-boot燒寫內核、根文件系統時,需要知道內核以及根文件系統的具體物理地址,我們可以修改一下文件更改此信息,注必須保證這裡的地址與vivi,u-boot保持一致,否則出現燒寫啟動不一致的現象。

我的分區是:

bootloader:    192k 

param:         128k (vivi和u-boot的參數保存區域,內核裡沒有表明,但地址空間預留出來了)

kernel:        3M

rootfs:        60M

編輯文件arch/arm/plat-s3c24xx/common-smdk.c

static struct mtd_partitionsmdk_default_nand_part[] =

 {

       [0]= {

              .name      = "bootloader",

              .size = 0x00030000,

              .offset     = 0,

       },

       [1]= {

              .name      = "kernel",

              .offset= 0x00050000,

              .size = 0x00300000,

       },

       [2]= {

              .name      = "rootfs",

              .offset= 0x00350000,

              .size = 0x03cac000,

       }

};


7.修改文件drivers/mtd/nand/s3c2410.c

    內核中去掉對nand FLASH的ecc校驗,由yaffs自己完成

    將s3c2410_nand_init_chip函數裡的NAND_ECC_SOFT改為NAND_ECC_NONE

 

8.到llinux-2.6.30目錄下執行命令

    找一個內核自帶的與S3C2440比較接近的配置文件,修改得到我們的配置文件

    #cp  arch/arm/configs/s3c2410_defconfig  .config

 

9.執行make menuconfig,並對選項進行配置

    1)SystemType --->

         S3C2440 and S3C2442 machines --->

         僅保留SMDK2440 與SMDK2440 whith S3C2440CPU module兩個選項,將其他的選項全部勾掉

    2)Kernel Features --->

         [*]Usethe arm EABI to compile the kernel(選中該選項,因為我們采用的編譯器是帶EABI(軟浮點運算)的編譯器) 

    3)Filesystems --->

          a、把與ext2 ext3 ext4相關的所有選項全部去掉(為了減小編譯完內核的體積、可選)

          b、Miscellaneous filesystems --->

              <*>yaffs2file system support(選中此選項)

    4)Device Drivers----->
       Character devices--->
          [*]/dev/kmem virtual device support
          [*]Legacy(BSD) PTY support
       Block devices--->
            <>Loopback device support
            <>RAW block device support

5)保存退出

10.編譯

make zImage,在arch/arm/boot下生成編譯好的可執行程序:zImage  vivi一般采用此類型的內核

make uImage,在arch/arm/boot下生成編譯好的可執行程序:UImage  u-boot一般采用此類型的內核

Copyright © Linux教程網 All Rights Reserved