linux-2.6.35內核移植——Nand flash 驅動的移植


  Nand flash 是嵌入式系統最常用的外部存儲設備,這里介紹Nand flash驅動移植的過程。

一、移植環境:

1、  Ubuntu 10.10發行版

2、  u-boot.bin

3、  目標機:FS_S5PC100平台

4、  交叉編譯器 arm-cortex_a8-linux-gnueabi-gcc

---------------------------------------------------------------------

二、移植步驟

在linux-2.6.35.2的內核中已經包含了s3c2410的nand flash控制器的驅動,但是需要我們正確配置后才能正常工作。

1、添加針對FS_S5PC100平台上的Nand flash驅動

  拷貝 s3c_nand.c 到drivers/mtd/nand下

  拷貝 regs-nand.h 到arch/arm/mach-s5pc100/include/mach下

2、針對FS_S5PC100平台上的nand flash 設備,修改driver/mtd/nand/nand_base.c

第2812行

/* Read entire ID string */
for (i = 0; i < 8; i++)

/* Read entire ID string */
for (i = 0; i < 5; i++)

3、添加內核配置選項

修改driver/mtd/nand/Kconfig添加如下內容:

config MTD_NAND_S3C
    tristate "NAND Flash support for S3C Soc"
    depends on (ARCH_S3C64XX || ARCH_S5P64XX || ARCH_S5PC1XX || ARCH_S5PC100) && MTD_NAND
    help
    This enables the NAND flash controller on the S3C.
    No board specfic support is done by this driver , each board
    must advertise a platform_device for the driver to attach.

config MTD_NAND_S3C_DEBUG
    bool "S3C NAND driver debug"
    depends on MTD_NAND_S3C
    help
    Enable debugging of the S3C NAND driver

config MTD_NAND_S3C_HWECC
    bool "S3C NAND Hardware ECC"
    depends on MTD_NAND_S3C
    help
    Enable the use of the S3C's internal ECC generator when 
    using NAND. Early versons of the chip have had problems with
    incorrect ECC generation, and if using these, the default of
    software ECC is preferable

    If you lay down a device with the hardware ECC, the you will
    currently not be able to switch to software, as there is no
    implementation for ECC method used by the S3C

 修改drivers/mtd/nand/Makefile添加如下內容:

obj-$(CONFIG_MTD_NAND_S3C)        += s3c_nand.o

4、修改平台代碼

修改arch/arm/mach-s5pc100/mach-smdkc100.c添加如下內容:

  • 添加頭文件
#if defined(CONFIG_MTD_NAND_S3C)
#include <linux/mtd/partitions.h>
#include <linux/mtd/mtd.h>
#include <plat/nand.h>
#endif
  • 添加平台設備
/** Nand flash Support **/
#if defined(CONFIG_MTD_NAND_S3C)
static struct mtd_partition s5pc100_nand_part[] = {
    [0] = {
        .name   = "bootloader",
        .size   = SZ_1M,
        .offset = 0,
    },
    [1] = {
        .name   = "kernel",
        .offset = MTDPART_OFS_APPEND,
        .size   = SZ_1M*3,
    },
    [2] = {
        .name   = "roorfs",
        .offset = MTDPART_OFS_APPEND,
        .size   = SZ_1M * 100,
    },
    [3] = {
        .name   = "usrfs",
        .offset = MTDPART_OFS_APPEND,
        .size   = MTDPART_SIZ_FULL,
    },
};
struct s3c_nand_mtd_info s5pc100_nand_mtd_part_info = {
    .chip_nr    = 1,
    .mtd_part_nr = ARRAY_SIZE(s5pc100_nand_part),
    .partition  = s5pc100_nand_part,
};

static struct resource s5pc100_nand_resource[] = {
    [0] = {
        .start  = 0xE7200000,
        .end    = 0xE7200000 + SZ_1M,
        .flags  = IORESOURCE_MEM,
    },
};

struct platform_device s5pc100_device_nand = {
    .name   = "s5pc100-nand",
    .id = -1,
    .num_resources  = ARRAY_SIZE(s5pc100_nand_resource),
    .resource   = s5pc100_nand_resource,
    .dev = {
        .platform_data = &s5pc100_nand_mtd_part_info,
    },
};
#endif
  • 添加平台設備列表

在smdkc100_device[]結構體數組中添加如下內容:

#if defined(CONFIG_MTD_NAND_S3C)
    &s5pc100_device_nand,
#endif  
  • 修改 arch/arm/plat-samsung/include/plat/nand.h 添加如下內容:
struct s3c_nand_mtd_info {
    uint chip_nr;
    uint mtd_part_nr;
    struct matd_partition *partition;
};

5、 配置內核

$ make menuconfig

修改

Device Drivers --->
        <*> Memory Technology Device (MTD) support --->
               [*]   MTD partitioning support
               <*>   Caching block device access to MTD devices
               <*>   NAND Device Support --->
                      <*>   NAND Flash support for S3C SoCs
                      [*]   S3C NAND Hardware ECC

File System --->
        Partition Types --->
               [*]   Advanced partitioin selection
               [*]   PC BIOS (MSDOS partition tables) support
               [*]   BSD disklabel (FreeBSD partition tables) support

---------------------------------------------------------------------

三、編譯內核並拷貝到tftpboot下

$ make zImage
$ cp arch/arm/boot/zImage /tftpboot

---------------------------------------------------------------------

四、測試

啟動目標板,查看系統信息:

# cat /proc/mtd
dev:  size  erasesize  name
mtd0: 00100000 00020000 "bootloader"
mtd1: 00300000 00020000 "kernel"
mtd2: 00400000 00020000 "rootfs"
mtd3: 0f800000 00020000 "usrfs"

 原文鏈接:http://www.cnblogs.com/lr-ting/archive/2012/07/05/2576705.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM