yiffer的个人空间 https://blog.eetop.cn/edesign [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

2.6内核NorFlash驱动

已有 2479 次阅读| 2009-4-5 21:48 |个人分类:Linux移植

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");
 

 

本文来源:http://blog.csdn.net/dansen_xu/archive/2007/12/06/1920944.aspx


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 0

    好友
  • 20

    获赞
  • 69

    评论
  • 3705

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 22:38 , Processed in 0.014666 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部