NAND FLASH是一个存储芯片

那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A"





问1. 原理图上NAND FLASH和S3C2440之间只有数据线,

     怎么传输地址?

答1.在DATA0~DATA7上既传输数据,又传输地址

     当ALE为高电平时传输的是地址,





问2. 从NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令

     怎么传入命令?

答2.在DATA0~DATA7上既传输数据,又传输地址,也传输命令

     当ALE为高电平时传输的是地址,

     当CLE为高电平时传输的是命令

     当ALE和CLE都为低电平时传输的是数据





问3. 数据线既接到NAND FLASH,也接到NOR FLASH,还接到SDRAM、DM9000等等

     那么怎么避免干扰?

答3. 这些设备,要访问之前必须"选中",

     没有选中的芯片不会工作,相当于没接一样





问4. 假设烧写NAND FLASH,把命令、地址、数据发给它之后,

     NAND FLASH肯定不可能瞬间完成烧写的,

     怎么判断烧写完成?

答4. 通过状态引脚RnB来判断:它为高电平表示就绪,它为低电平表示正忙





问5. 怎么操作NAND FLASH呢?

答5. 根据NAND FLASH的芯片手册,一般的过程是:

     发出命令

     发出地址

     发出数据/读数据





          NAND FLASH                      S3C2440(有MAND FLASH控制器)

发命令    选中芯片                   

          CLE设为高电平                   NFCMMD=命令值     

          在DATA0~DATA7上输出命令值

          发出一个写脉冲

            

发地址    选中芯片                        NFADDR=地址值

          ALE设为高电平

          在DATA0~DATA7上输出地址值

          发出一个写脉冲





发数据    选中芯片                        NFDATA=数据值

          ALE,CLE设为低电平

          在DATA0~DATA7上输出数据值

          发出一个写脉冲





读数据    选中芯片                        val=NFDATA

          发出读脉冲

          读DATA0~DATA7的数据





用UBOOT来体验NAND FLASH的操作:





1. 读ID

                                             S3C2440                          u-boot 

选中                           NFCONT的bit1设为0   md.l 0x4E000004 1; mw.l 0x4E000004  1

发出命令0x90                   NFCMMD=0x90         mw.b 0x4E000008 0x90 

发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00

读数据得到0xEC                 val=NFDATA          md.b 0x4E000010 1

读数据得到device code          val=NFDATA          md.b 0x4E000010 1

          0xda

退出读ID的状态                 NFCMMD=0xff         mw.b 0x4E000008 0xff

     

2. 读内容: 读0地址的数据

使用UBOOT命令:

nand dump 0

Page 00000000 dump:

        17 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5





                                             S3C2440                            u-boot 

选中                           NFCONT的bit1设为0   md.l 0x4E000004 1; mw.l 0x4E000004  1

发出命令0x00(读)              NFCMMD=0x00         mw.b 0x4E000008 0x00 

发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00

发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00

发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00

发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00

发出地址0x00                   NFADDR=0x00         mw.b 0x4E00000C 0x00

发出命令0x30                   NFCMMD=0x30         mw.b 0x4E000008 0x30 

读数据得到0x17                 val=NFDATA          md.b 0x4E000010 1

读数据得到0x00                 val=NFDATA          md.b 0x4E000010 1

读数据得到0x00                 val=NFDATA          md.b 0x4E000010 1

读数据得到0xea                 val=NFDATA          md.b 0x4E000010 1

退出读状态                     NFCMMD=0xff         mw.b 0x4E000008 0xff









NAND FLASH驱动程序层次





看内核启动信息

S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c2440-nand s3c2440-nand: Tacls=3, 30ns Twrph0=7 70ns, Twrph1=3 30ns

NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)

Scanning device for bad blocks

Bad eraseblock 256 at 0x02000000

Bad eraseblock 257 at 0x02020000

Bad eraseblock 319 at 0x027e0000

Bad eraseblock 606 at 0x04bc0000

Bad eraseblock 608 at 0x04c00000

Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":

0x00000000-0x00040000 : "bootloader"

0x00040000-0x00060000 : "params"

0x00060000-0x00260000 : "kernel"

0x00260000-0x10000000 : "root"





搜"S3C24XX NAND Driver"

S3c2410.c (drivers\mtd\nand)





s3c2410_nand_inithw

s3c2410_nand_init_chip

nand_scan  // drivers/mtd/nand/nand_base.c 根据nand_chip的底层操作函数识别NAND FLASH,构造mtd_info

    nand_scan_ident

        nand_set_defaults

              if (!chip->select_chip)

                           chip->select_chip = nand_select_chip; // 默认值不适用





              if (chip->cmdfunc == NULL)

                          chip->cmdfunc = nand_command;

                                                               chip->cmd_ctrl(mtd, command, ctrl);

             if (!chip->read_byte)

                         chip->read_byte = nand_read_byte;

                                                                  readb(chip->IO_ADDR_R);

              if (chip->waitfunc == NULL)

                        chip->waitfunc = nand_wait;

                                                      chip->dev_ready

        

        

        nand_get_flash_type

             chip->select_chip(mtd, 0);

             chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);

            *maf_id = chip->read_byte(mtd);

            dev_id = chip->read_byte(mtd);

    nand_scan_tail

        mtd->erase = nand_erase;

        mtd->read = nand_read;

        mtd->write = nand_write;

s3c2410_nand_add_partition

    add_mtd_partitions

        add_mtd_device

            list_for_each(this, &mtd_notifiers) { // 问. mtd_notifiers在哪设置

                                                  // 答. drivers/mtd/mtdchar.c,mtd_blkdev.c调用register_mtd_user

                struct mtd_notifier *not = list_entry(this, struct mtd_notifier, list);

                not->add(mtd);

                // mtd_notify_add  和 blktrans_notify_add

                先看字符设备的mtd_notify_add

                        class_device_create

                        class_device_create

                再看块设备的blktrans_notify_add

                    list_for_each(this, &blktrans_majors) { // 问. blktrans_majors在哪设置

                                                            // 答. drivers\mtd\mdblock.c或mtdblock_ro.c   register_mtd_blktrans

                        struct mtd_blktrans_ops *tr = list_entry(this, struct mtd_blktrans_ops, list);              

                        tr->add_mtd(tr, mtd);

                                mtdblock_add_mtd (drivers\mtd\mdblock.c)

                                    add_mtd_blktrans_dev

                                        alloc_disk

                                        gd->queue = tr->blkcore_priv->rq; // tr->blkcore_priv->rq = blk_init_queue(mtd_blktrans_request, &tr->blkcore_priv->queue_lock);

                                        add_disk            













测试4th:

1. make menuconfig去掉内核自带的NAND FLASH驱动

-> Device Drivers

  -> Memory Technology Device (MTD) support

    -> NAND Device Support

   < >   NAND Flash support for S3C2410/S3C2440 SoC

2. make uImage

   使用新内核启动, 并且使用NFS作为根文件系统

3. insmod s3c_nand.ko

4. 格式化 (参考下面编译工具)

   flash_eraseall  /dev/mtd3  // yaffs

   

5. 挂接

   mount -t yaffs /dev/mtdblock3 /mnt

6. 在/mnt目录下建文件   













编译工具:

1. tar xjf mtd-utils-05.07.23.tar.bz2        (这个工具mtd-utils-05.07.23.tar.bz2 就是用于格式化分区)

2. cd mtd-utils-05.07.23/util

修改Makefile:

#CROSS=arm-linux-

改为

CROSS=arm-linux-

3. make

4. cp  flash_erase  flash_eraseall   /work/nfs_root/first_fs/bin/               (把它拷贝到单板的bin目录)

NAND FLASH 驱动分析的更多相关文章

  1. linux下Pl353 NAND Flash驱动分析

    linux的NAND Flash驱动位于drivers/mtd/nand子文件夹下: nand_base.c-->定义通用的nand flash基本操作函数,如读写page,可自己重写这些函数 ...

  2. 十八、Nand Flash驱动和Nor Flash驱动

    在读者学习本章之前,最好了解Nand Flash读写过程和操作,可以参考:Nand Flash裸机操作. 一开始想在本章写eMMC框架和设备驱动,但是没有找到关于eMMC设备驱动具体写法,所以本章仍继 ...

  3. Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  4. 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  5. Nand Flash驱动(实现初始化以及读操作)

    简单制作一个Nand Flash驱动(只需要初始化Flash以及读Flash) 打开2440芯片手册,K9F2G08U0M芯片手册(因为2440中Nand Flash是用的256MB(2Gb)内存,8 ...

  6. 如何编写linux下nand flash驱动-4

    2.       软件方面 如果想要在Linux下编写Nand Flash驱动,那么就先要搞清楚Linux下,关于此部分的整个框架.弄明白,系统是如何管理你的nand flash的,以及,系统都帮你做 ...

  7. NAND FLASH驱动框架以及程序实现

    1.NAND FLASH的硬件连接: 实验用的NAND FLASH芯片为K9F2G08U0C,它是三星公司的存储芯片,它的大小为256M.它的接线图如下所示: 它的每个引脚的分别为LDATA0-LDA ...

  8. Smart210学习记录----nand flash驱动

    [详解]如何编写Linux下Nand Flash驱动  :http://www.cnblogs.com/linux-rookie/articles/3016990.html 当读写文件请求到来的时候, ...

  9. linux2.6.30.4内核移植(2)——Nand Flash驱动移植

    内核源码:linux2.6.30.4 交叉编译工具:3.4.5 移植linux内核至:TQ2440 工作基础:http://www.cnblogs.com/nufangrensheng/p/36696 ...

随机推荐

  1. jquery开发js插件

    1.需要掌握的知识点 1)(function($){...}(jQuery)):实际上就是匿名函数并且函数用()阔起来,形成闭包,外界对其内部函数没有影响 $(function(){…});   jQ ...

  2. java基础10(IO流)-字节流

    IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...

  3. HBase-scan简介及优化(缓存与批量处理)

    扫描(scan) 这种技术类似于数据库系统中的游标(cursor),并利用到了HBase提供的底层顺序存储的数据结构. 扫描操作的使用跟get方法非常类似.由于扫描操作的工作方式类似于迭代器,所以用户 ...

  4. 分布式技术 webservice

    web service 是一个平台独立的.低耦合的.自包含的.基于编程的web的应用程序,可使用开发的XML(标准通用标记语言下的一个字表)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...

  5. 啥是ETL、ELT

    ETL就是Extract.Transfrom.Load即抽取.转换.加载三个英文单词首字母的集合.抽取:就是从源系统抽取需要的数据,这些源系统可以是同构也可以是异构的:比如源系统可能是Excel电子表 ...

  6. 51nod 1243 二分+贪心

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 1243 排船的问题 题目来源: Codility 基准时间限制: ...

  7. Github删除项目

    相关博客:GitLab删除项目操作 发现github的项目删除按钮挺难找的,记录一下. 1,先在github打开项目,进入项目 2,点击Settings,进去后往下拉就是删除按钮.

  8. Atom设置震撼的编辑效果

    在代码编辑器.文本编辑器领域,有着不少的「神器」级的产品,如历史悠久的 VIM.Emacs 以及如今当红的SublimeText.另外还有 EditPlus.NotePad++.UltraEdit 等 ...

  9. linux 下sed命令

    sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作.sed是按行来处理文本内容的.在shell中,使用sed来批量修改文本内容是非常方便的. sed [选项] [动作 ...

  10. SVM模型进行分类预测时的参数调整技巧

    一:如何判断调参范围是否合理 正常来说,当我们参数在合理范围时,模型在训练集和测试集的准确率都比较高:当模型在训练集上准确率比较高,而测试集上的准确率比较低时,模型处于过拟合状态:当模型训练集和测试集 ...