2.6核心NorFlash驅動

來源:互聯網
上載者:User

2.6核心中NorFlash的驅動基本和2.4中的一樣
隨便在maps中找一個都可以拿來改改用的,不過方便一點還是提供一份源碼好了
這個驅動是 for Intel E28F128J3A-150 on s2c2410 的,不同的晶片就需修改一些參數了

當然需要在maps/Kconfig中添加選項,在MTD_SA1100後添加
config MTD_S3C2410
    tristate "CFI Flash device mapped on ARM S3C2410"
    depends on MTD_CFI && ARCH_SMDK2410 && MTD_PARTITIONS
    help
       .....

修改maps/Makefile
添加 obj-(CONFIG_MTD_S3C2410) += s3c2410.o

接著配置一下核心
    # make menuconfig
    以下內容必選:
    Memory Technology Devices(MTD)-->
        <*>Memory Technology Device (MTD) support
        [*]MTD partitioning support
        <*>Caching block device access to MTD devices
        RAM/ROM/Flash chip drivers-->
            <*>Detect flash chips by Common Flash Interface (CFI) probe
            <*>Support for Inter/Sharp flash chips
        Mapping drivers for chip access-->
            <*>CFI flash device mapped on S3C2410
    Miscellaneous filesystems-->
        <*>Journalling Flash File System v2 (JFFS2) support
    # make zImage

由於2.6下Mtd裝置的驅動沒有調用devfs_register註冊裝置,所以需要自己建裝置節點
# gunzip ramdisk.image.gz
# mkdir disk
# mount -o loop ramdisk.image ./disk
# cd disk/dev
# mkdir mtdblock
# cd mtdblock
# mknod -m 666 0 b 31 0
# mknod -m 666 1 b 31 1
# mknod -m 666 2 b 31 2
# mknod -m 666 3 b 31 3
# cd ../../..
# umount disk
# gzip ramdisk.image

非常有必要到ppcboot的命令列中erase一下flash
# protect off all
# erase 0x540000 0xffffff     // 我的jffs2分區位址範圍
這樣也就不需要燒寫jffs2.img這個檔案了

這樣啟動開發板,就可以 mount -t jffs2 /dev/mtdblock/3 /jffs2 了
jffs2目錄為空白,可以向裡面copy自己的檔案了
需要啟動時自動mount的話,可以在etc/init.d/rcS中添加
或者修改etc/fstab 添加
/dev/mtdblock/3   /jffs2    jffs2   default  1  1
當然核心配置需要添加
File systems --->
     <*> Kernel automounter support
注意並不需要修改主裝置號,在2.4時把major該成了30

/* maps driver for Intel E28F128J3A-150 on s2c2410 */

#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/io.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>

/* We split the flash chip up into four parts.
 * 1: bootloader firts (0x00000000 - 0x0003FFFF) size 0x040000
 * 2: kernel    (0x00040000 - 0x0013FFFF) size 0x100000
 * 3: compressed root ramdisk (0x00140000 - 0x0053FFFF) size 0x400000
 * 4: jffs (0x00540000 - 0x00FFFFFF) size 0xac0000
 */

#define FLASH_PHYS_ADDR 0x00000000
#define FLASH_SIZE 0x01000000

#define FLASH_PARTITION0_ADDR 0x00000000
#define FLASH_PARTITION0_SIZE 0x00040000

#define FLASH_PARTITION1_ADDR 0x00040000
#define FLASH_PARTITION1_SIZE 0x00100000

#define FLASH_PARTITION2_ADDR 0x00140000
#define FLASH_PARTITION2_SIZE 0x00400000

#define FLASH_PARTITION3_ADDR 0x00540000
#define FLASH_PARTITION3_SIZE 0x00ac0000

struct map_info s3c2410_map = {
  .name =  "s3c2410 NOR flash Intel E28F128J3A",
  .size =  FLASH_SIZE,
  .bankwidth = 2,
  .phys = FLASH_PHYS_ADDR,
};

struct mtd_partition s3c2410_parts[] = {
 {
  .name =  "Bootloader",
  .offset = FLASH_PARTITION0_ADDR,
  .size =  FLASH_PARTITION0_SIZE,
  .mask_flags = MTD_WRITEABLE
 },
 {
  .name =  "Kernel",
  .offset = FLASH_PARTITION1_ADDR,
  .size =  FLASH_PARTITION1_SIZE,
  .mask_flags = MTD_WRITEABLE
 },
 {
  .name =  "Ramdisk",
  .offset = FLASH_PARTITION2_ADDR,
  .size =  FLASH_PARTITION2_SIZE,
  .mask_flags = MTD_WRITEABLE
 },
 {
  .name =  "Jffs2",
  .offset = FLASH_PARTITION3_ADDR,
  .size =  FLASH_PARTITION3_SIZE
 }
};

#define PARTITION_COUNT (sizeof(s3c2410_parts)/sizeof(struct mtd_partition))

static struct mtd_info *mymtd;

int __init init_s3c2410(void)
{
 printk(KERN_NOTICE "s3c2410 flash device: %x at %x/n",
   FLASH_SIZE, FLASH_PHYS_ADDR);
 s3c2410_map.phys = FLASH_PHYS_ADDR;
 s3c2410_map.virt = ioremap(FLASH_PHYS_ADDR,
     FLASH_SIZE);
 if (!s3c2410_map.virt) {
  printk("Failed to ioremap/n");
  return -EIO;
 }
 simple_map_init(&s3c2410_map);
 mymtd = do_map_probe("cfi_probe", &s3c2410_map);
 if (mymtd) {
  mymtd->owner = THIS_MODULE;
  mymtd->erasesize=0x20000;
  add_mtd_partitions(mymtd, s3c2410_parts, PARTITION_COUNT);
  printk(KERN_NOTICE "s3c2410 flash device initialized/n");
  return 0;
 }
 iounmap((void *)s3c2410_map.virt);
 return -ENXIO;
}

static void __exit cleanup_s3c2410(void)
{
 if (mymtd) {
  del_mtd_partitions(mymtd);
  map_destroy(mymtd);
 }
 if (s3c2410_map.virt) {
  iounmap((void *)s3c2410_map.virt);
  s3c2410_map.virt = 0;
 }
}

module_init(init_s3c2410);
module_exit(cleanup_s3c2410);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Dansen");
MODULE_DESCRIPTION("MTD map driver for S3C2410"); 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.