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

Android2.3.4在OK6410上的移植

前幾天一直在考慮著把Android系統移植到mini2440上去,搞了好幾天發現沒頭緒,表示鴨梨大啊,網上資料也都一些零零碎碎的,正在灰常無語的時候,實驗室有個朋友有塊OK6410,剛好空閒著,這不剛合我口味不,立馬的拿上開發板,哎怎麼說呢,那知道拿著飛凌的6410鴨梨更大了,哥還搞了兩個SD卡,真奶奶的無語啊。

大概花了整整一天是時間,才學會怎麼玩這個開發板.唉,最後我考慮了很久,又由於時間不是很給力的情況下,我還是選擇這樣來移植,(android2.3.4配套的是Linux2.6.36內核)

最後我覺得先移植Linux,再做個補丁直接打到android內核文件上去,這樣可能效果會好些.畢竟是菜鳥級選手嘛。

今天開始移植在移植NANDFLASH的時候簡直是快崩潰了,編譯過無數次原因也找到了,怎麼修改都有錯,最後將內核鏡像下載到SDRAM中運行的時候就是不顯示我所分的區,在網上查閱各種資料,貌似這個基於OK6410的Linux系統移植的資料也不是很多啊......最後解壓了飛凌提供的移植好的代碼一看原來它們自己寫了NANDFLASH的驅動。。。。也正好我一直是卡在校驗那個地方動都動不得,又經過幾個小時的折騰終於把這個NAND支持給移植上去了NAND型號(K9GAG08U00)

趕緊做個筆記吧,這對以後肯定是大大的有用

環境:Ubuntu10.10

Linux內核:linux2.6.36.2.tar,gz

uboot:uboot.1.1.6飛凌官方自帶

目標機:OK6410

SDRAM:128M

NAND:K9GAG08U00

交叉編譯器:arm-linux-gcc 飛凌自帶

說明:紅色代碼段部分是需要修改或者添加的部分

一、移植准備

源代碼下載 交叉編譯器的安裝等.這裡省了。。。。。。。

二、解壓源碼進入源碼主目錄

    2.1、修改Makefile

大概是在191~192行修改成如下:

ARCH        ?= arm
CROSS_COMPILE    ?= arm-linux-

保存退出

    2.2克隆板層文件

進入板層文件目錄下

#cd arch/arm/mach-s3c64xx/

#cp mach-smdk6410.c mach-eilian6410.c   //這名字隨便你了取了

使用VI編輯器將mach-eilian6410.c中的所有smdk6410都改成eilian6410  ,這個性移植不,操作如下,在命令模式下輸入哦

   

    2.2.3、修改arch/arm/mach-s3c64xx/目錄下的Kconfig 和Makefile 修改如下

因為Linux中都是用Makefile來管理的,操作如下

先修改Kconfig 打開Kconfig文件拷貝110------132行代碼並做如下修改

config MACH_EILIAN6410    
    bool "EILIAN6410"
    select CPU_S3C6410
    select SAMSUNG_DEV_ADC
    select S3C_DEV_HSMMC
    select S3C_DEV_HSMMC1
    select S3C_DEV_I2C1
    select SAMSUNG_DEV_IDE
    select S3C_DEV_FB
    select S3C_DEV_RTC
    select SAMSUNG_DEV_TS
    select S3C_DEV_USB_HOST
    select S3C_DEV_USB_HSOTG
    select S3C_DEV_WDT
    select SAMSUNG_DEV_KEYPAD
    select HAVE_S3C2410_WATCHDOG
    select S3C64XX_SETUP_SDHCI
    select S3C64XX_SETUP_I2C1
    select S3C64XX_SETUP_IDE
    select S3C64XX_SETUP_FB_24BPP
    select S3C64XX_SETUP_KEYPAD
    help
      Machine support for the Samsung EILIAN6410   

道理同上的打開Makefile 在第61行添加

obj-$(CONFIG_MACH_EILIAN6410)    += mach-eilian6410.o

修改kconfig能使我們在配置菜單中能找到EILIAN6410這款開發板,在Makfile中添加哪行代碼後能使該項配置生效

    2.2.4、測試一下先/ 測試前先做如下工作回到主目錄進行清除和加載缺省文件及配置

#make distclean

#cp arch/arm/configs/s3c6400_defconfig .config

#make menuconfig

這個配置沒什麼好配置的,選中我們的目標板就OK,看下圖

   

現在看看上面我們修改的那個Kconfig和Makefile起作用了吧。。。選中後退出執行

#make zImage

。。。。。。。測試通過

3、讓目標板支持NANDFLASH

3.1.1、修改板層文件mach-eilian6410.c 進入相應的目錄下

#vi mach-eilian6410.c

添加如下一段代碼

/************************************************
 * Configuring Nandflash on Eilian6410
 ************************************************
 */
struct mtd_partition eilian6410_nand_part[] = {
    {
        .name        = "Bootloader",
        .offset        = 0,
        .size        = (1 * SZ_1M),
        .mask_flags    = MTD_CAP_NANDFLASH,
    },
    {
        .name        = "Kernel",
        .offset        = (1 * SZ_1M),
        .size        = (5*SZ_1M) ,
        .mask_flags    = MTD_CAP_NANDFLASH,
    },

    {
        .name        = "User",
        .offset        = (6 * SZ_1M),
        .size        = (200*SZ_1M) ,
    },
    {
        .name        = "File System",
        .offset        = MTDPART_OFS_APPEND,
        .size        = MTDPART_SIZ_FULL,
    }
};
//將NANDFLASH分成四個區域,這些分區大小必須要和你的UBOOT中NAND的分區要一致,否則後果自負。。
static struct s3c2410_nand_set eilian6410_nand_sets[] = {
    [0] = {
        .name       = "nand",
        .nr_chips   = 1,
        .nr_partitions  = ARRAY_SIZE(eilian6410_nand_part),
        .partitions = eilian6410_nand_part,
    },
};
//在arch/arm/plat-samsung/include/plat/目錄下的nand.h文件中有兩個結構體

這兩個結構體都是與具體的芯片相關的,裡面的有些東西需要我們在板層文件中給他們傳值

/********************************************************************************

定義芯片信息

struct s3c2410_nand_set {
    unsigned int        disable_ecc:1;
    unsigned int        flash_bbt:1;

    unsigned int        options;
    int            nr_chips;
    int            nr_partitions;
    char            *name;
    int            *nr_map;
    struct mtd_partition    *partitions;
    struct nand_ecclayout    *ecc_layout;
};
/***對於NANDFLASH作為平台設備的一些時序信息等
struct s3c2410_platform_nand {
    /* timing information for controller, all times in nanoseconds */

    int    tacls;    /* time for active CLE/ALE to nWE/nOE */
    int    twrph0;    /* active time for nWE/nOE */
    int    twrph1;    /* time for release CLE/ALE from nWE/nOE inactive */

    unsigned int    ignore_unset_ecc:1;

    int            nr_sets;
    struct s3c2410_nand_set *sets;

    void            (*select_chip)(struct s3c2410_nand_set *,
                           int chip);
};

/**********************************************************************************

static struct s3c2410_platform_nand eilian6410_nand_info = {
    .tacls      = 25,
    .twrph0     = 55,
    .twrph1     = 40,
    .nr_sets    = ARRAY_SIZE(eilian6410_nand_sets),
    .sets       = eilian6410_nand_sets,
};
/************************************************
 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 *^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 ************************************************
 */

該代碼放在static struct platform_device *eilian6410_devices[] __initdata = {上面就行

同時記得添加如下頭文件

#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <plat/nand.h>

Copyright © Linux教程網 All Rights Reserved