ARM-Linux移植之(二)——Linux2.6.22核心移植

來源:互聯網
上載者:User

ARM-Linux核心移植之(二)——Linux2.6.22核心移植

K-Style

 

轉載請註明來自于衡陽師範學院08電2  K-Style  http://blog.csdn.net/ayangke,QQ:843308498 郵箱:yangkeemail@qq.com

 

平台:mini2440  交叉工具鏈:arm-linux-gcc-4.3.2

 

一、核心移植基本知識

         移植核心也叫構建BSP(boardsupprot packet)。BSP的作用有兩個:一是為核心運行提供底層支援,二是屏蔽與板相關的細節。

         BSP的構建分三個層次

         1、體繫結構層次

         對一些體繫結提供linux核心支援,比如說ARM,X86等晶片。這一類工作一般在arc/xxx/下面額除了palt-xxx和mach-xxx目錄的其他目錄完成。

         2、SOC層次

         對一些公司提供的SOC微處理器提供linux核心支援,比如說三星公司的   S3C2440。這一類工作一般在arch/xxx/plat-xxxxarch/xxx/mach-xxxx目錄下完成。我們可以看到在arch/arm/目錄下同時有plat-s3c24xx和mach-s3c2440兩個目錄,這樣做是因為plat-s3c24xx目錄下存放了所有s3c24系列相同的代碼,mach-s3c2440則只存放了與S3C2440有關的代碼。

         2,板級層次

         這是我們一般的菜鳥要做的,上面兩個層次一般有晶片公司的大牛完成了,但是不同的電路板的板級層次則需要由我們菜鳥完成的。這一類工作主要在mach-xxxx/目錄下面的板檔案完成,比如說mach-s3c2440/smdk-s3c2440.c這個S3C2440標準板檔案。很多文檔很多書籍都都直接在這個檔案裡面進行修改,這樣是不對的,對於不同的電路板應該建立不同的板檔案,比如說我的是mini2440,就應該建立一個smdk-mini2440.c檔案或者mach-mini2440.c檔案在mach-s3c2440下面。如果直接在裡面修改是非常不規範的做法,這樣不是在移植核心,這樣是在破壞核心!(這一句是宋寶華說的)。

 

下面開始移植。

 

二、BSP構建

       1.建立板檔案支援

         這一步我會重建立立一個板檔案mach-mini2440.c,而不是直接在smdk-s3c2440.c裡面修改,這樣或許麻煩一些,但是為了保持對核心尊重的態度和規範的做法,認為應該這樣做。

如果我們重建立立一個空的板檔案將會導致大量的工作量,幸運的是smdk-s3c2440.c檔案已經幫我們做了大量的工作,我們直接拷貝過來命名為mach-mini2440.c

         cp   arch/arm/mach-s3c2440/smdks3c2440.c     arch/arm/mach-s3c2440/mach-mini2440.c

        

修改arch/arm/mach-s3c2440/mach-mini2440.c檔案將MACHINE_START宏括弧裡面的名字換成ID換成MINI2440,名字隨便取,我們取“MINI2440”,這個ID最終會被擴充為MACH_TYPE_MINI2440,然後到arch/arm/tools/mach_types裡面找對應的ID號,所有做完以這一步我們要在mach_types添加我們機器的ID

MACHINE_START(MINI2440,"MINI2440")

         /*Maintainer: Ben Dooks <ben@fluff.org> */

         .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

         然後在mach_types裡面添加我們機器的ID,再最後一行添加

         mini2440        MACH_MINI2440             MINI2440       1999

         第一個表示機器名字,這個也隨便取,第二個在Kconfig配置項裡面定義的宏名稱,下面一步我們會定義到,我們取名為MACH_MINI2440,第三表示MACH_START第一個參數ID名字,第四個是ID號。ID號我們取為1999。

        

修改arch/arm/mach-s3c2440/目錄下的Kconfig和Makefile,以建立核心對板檔案的支援使其可以被配置和編譯進核心。

         首先修改Kconfig,在endmenu之前加入下面的內容:

 

87 config MACH_MINI2440     // 開發板名稱宏定義

88  bool "mini2440"    // 開發板名稱

89  select CPU_S3C2440     // 開發板使用的處理器類型

90  help

91     Say Y here if you are using the mini2440. // 協助資訊

 

         再修改Makefile

         obj-$(CONFIG_MACH_MINI2440)+= mach-mini2440.o

         注意這一行要添加在obj-$(CONFIG_ARCH_S3C2440)+= smdk-s3c2440.o後面,否則會編譯錯誤。

         這樣我們就可以通過makemenuconfig配置mini2440的板檔案是否編譯進核心。

        

         我們再跳到linux-2.6.22目錄,執行makemenuconfig

         執行載入預設設定檔後,可以開始配置新增加的菜單。進入System Types功能表項目,開啟S3C24XX Implementations菜單,出現一個目標開發板的列表:

 

[ ] Simtec ElectronicsBAST (EB2410ITX)

[ ] IPAQ H1940

[ ] Acer N30

[ ] SMDK2410/A9M2410

[ ] SMDK2440

[ ] AESOP2440

[ ] Thorcom VR1000

[ ] HP iPAQ rx3715

[ ] NexVision OTOM Board

[ ] NexVision NEXCODER2440 Light Board

[ ] mini2440

         選中mini2440選項

         然後執行makezImage,如果能夠正常編譯,已經能夠將mini2440板檔案編譯進核心了。如果不行,請檢查上述步驟。

        

         2.修改機器碼

         將編譯在arch/arm/boot下面產生的zImage燒寫到nand的kernel分區,然後啟動。

         Copylinux kernel from 0x00060000 to 0x30008000, size = 0x00500000 ... done

zImage magic = 0x016f2818

Setup linux parameters at 0x30000100

linux command line is: "console=ttySAC0 root=/dev/nfsnfsroot=192.168.1.101:/home/work/shiyan/rootfsip=192.168.1.102:192.168.1.101:192.168.1.1:255.255.255.0:mini2440:eth0:off"

MACH_TYPE = 362

NOW, Booting Linux......

UncompressingLinux.................................................................................................done, booting the kernel.

 

Error: unrecognized/unsupported machine ID (r1 = 0x0000016a).

核心提示不能識別的機器ID,於是修改bootloader的參數使其機器ID為1999,我用的是supervivi使用命令set parammach_type 1999

 

3.修改時鐘源頻率

啟動核心,出現一系列的亂碼,這是因為時鐘源設定的不對,我的開發板用的是12M的晶振,所以在arch/arm/mach-s3c2440.c的s3c24xx_init_clocks(16934400);處將16924400修改為12000000。即改為s3c24xx_init_clocks(12000000);

 

4.添加nand分區資訊

再啟動,發現還是不能啟動,這是因為核心中填寫的nand分區資訊不對。於是修改nand分區資訊,很多人的做法是直接修改arch/arm/plat-s3c24xx/Common-smdk.c檔案裡面的smdk_default_nand_part資料結構,這樣是不提倡的做法,因為還是那句話,破壞了核心。我們應該再arch/arm/mach-s3c2440/mach-mini2440.c檔案中建立我們自己板檔案的nand資訊。我們在mach-mini2440.c的staticstruct platform_device
*smdk2440_devices[]前面添加

static struct mtd_partition smdk_default_nand_part[] = {

/*這裡面填的是我用的mini2440分區資訊*/

     [0] = {

              .name       = "patition1 supervivi",

              .size = 0x00040000,

              .offset      = 0,

     },

     [1] = {

              .name       = "patition2 param",

              .offset =0x00040000,

              .size = 0x00020000,

     },

     [2] = {

              .name       = "patition3 kernel",

              .offset =0x00060000,

              .size = 0x00500000,

     },

     [3] = {

              .name       = "patition4 root",

              .offset      = 0x00560000,

              .size = 64*1024*1024,

     },

     [4] = {

              .name       = "patition5 nand",

              .offset = 0,

              .size = 64*1024*1024,

     },

 

};

 

static struct s3c2410_nand_set smdk_nand_sets[] = {

     [0] = {

              .name                = "NAND",

              .nr_chips = 1,

              .nr_partitions  = ARRAY_SIZE(smdk_default_nand_part),

              .partitions        = smdk_default_nand_part,

     },

};

 

再修改mach-mini2440.c的smdk2440_machine_init函數,將我們的nand傳給給nand裝置

static void __init smdk2440_machine_init(void)

{  

     s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);

 

     /*將我們的nand資訊傳給nand裝置*/

     s3c_device_nand.dev.platform_data= &smdk_nand_info;   //set nand infoto nand

    

     platform_add_devices(smdk2440_devices,ARRAY_SIZE(smdk2440_devices));

 

     //smdk_machine_init();

//smdk_machine_init()函數屏蔽,因為他會將arch/arm/plat-s3c24xx/Common-smdk.c裡面的分區資訊傳給nand,這樣我們的自己的nand資訊就被覆蓋了

 

     s3c2410_pm_init();//添加加這個函數是因為smdk_machine_init()裡面調用了。

}

 

再修改mach-mini2440.c的smdk2440_devices

static struct platform_device *smdk2440_devices[] __initdata = {

     &s3c_device_usb,

     &s3c_device_lcd,

     &s3c_device_nand,//向核心添加nand裝置

     &s3c_device_wdt,

     &s3c_device_i2c,

     &s3c_device_iis,

};

 

6.添加YAFFS檔案系統支援

完成上述步驟工作後,還是不能正常掛載根檔案系統,因為核心還沒對yaffs檔案系統進行支援。

下載cvs-root-yaffs.tar.gz補丁包檔案,解壓,運行yaffs2檔案夾裡面的指令檔patch-ker.sh來給核心打補丁,用法如下

Usage: ./patch-ker.sh  c/l kernelpath

if c/l is c,then copy, if l then link

如果是l則yaffs2源碼被連結到核心,如果是c則複製

我們運行./patch-ker.sh      c work/kernel_make/linux2.6.22

給核心打上yaffs2補丁,然後使用makemenuconfig配置核心使其支援yaffs2檔案系統

File systems   --->
Miscellaneous filesystems --->
    <*>YAFFS2 file system support

 

7.配置核心支援EABI介面

完成上面的步驟之後運行,核心會在輸出

VFS: Mounted root (yaffs filesystem) on device 31:2.

Freeing init memory: 132K

之後卡住,這個列印反應出核心實際上已經掛接上了根檔案系統,之所以卡在這裡是因為無法啟動根檔案系統上的init進程。是由於核心和根檔案系統的應用程式的介面不一致。所以在核心中使用make menuconfig配置EABI支援

Kernel Features --->
        Memory split...--->
        [ ]preemptible Kernel...
        [*]Use the ARM EABI to compile thekernel
       [*]        Allow old ABI binaries to run......
           Memory model(flatMemory)--->
        [ ]Add lru list to tarcknon-evictable pages

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.