ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:335.53KB ,
资源ID:16728540      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16728540.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(linux下nand+flash驱动Word下载.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

linux下nand+flash驱动Word下载.docx

1、单个cell大小大小单个Cell成本高低读耗时快慢单字节的编程时间多字节的编程时间擦除时间功耗低,但是需要额外的RAM是否可以执行代码是不行, 但是一些新的芯片,可以在第一页之外执行一些小的loader即是否允许,芯片内执行(XIP, eXecute In Place) 位反转Bit twiddling几乎无限制1-3次,也称作 “部分页编程限制”也就是数据错误了?在芯片出厂时候是否允许坏块不允许允许【Nand Flash的种类】具体再分,又可以分为1)Bare NAND chips:裸片,单独的nand 芯片2)SmartMediaCards: =裸片+一层薄塑料,常用于数码相机和MP3播放

2、器中。之所以称smart,是由于其软件smart,而不是硬件本身有啥smart之处。_3)DiskOnChip:裸片+glue logic,glue logic=硬件ECC产生器+用于静态的nand 芯片控制的寄存器+直接访问一小片地址窗口,那块地址中包含了引导代码的stub桩,其可以从nand flash中拷贝真正的引导代码。【Nand flash的特点】Nand flash的操作,和其他一些常见的设备,如硬盘等,不同,其有自己特殊的方式。其特殊就在于:1.Nand flash的最小单位是页page,而不是其他很多设备所说的位bit。2.写入数据之前必须先进行擦除erase操作3.写的时候,

3、最小单位是页page,对也进行写操作,也称作“页编程”,page programming4.擦除的最小单位是块block5.由于物理特性,容易出错,所以无论是读还是写,都要采取检测和校验,即EDC。6.nand flash出厂时候,就有一定坏的块block,成为换块,并且做了一定标记。7.nand flash中有个额外的空间,叫做spare area/oob【spare area/oob】Nand由于最初硬件设计时候考虑到,额外的错误校验等需要空间,专门对应每个页,额外设计了叫做spare area空区域,在其他地方,比如jffs2文件系统中,也叫做oob(out of band)数据。其具体

4、用途,总结起来有:1. 标记是否是坏快2. 存储ECC数据3. 存储一些和文件系统相关的数据,如jffs2就会用到这些空间存储一些特定信息【常见Nand Flash的大小及参数】常见的nand flash 的大小,由最开始的小于256M,到现在的常见的1G,2G,甚至更大。以前的nand flash的Pagesize页大小,多为512B+16B的oob,block大小为64*(512B+16B)=32KB+1KB现在目前市场上见到的,绝大多数,都是新的nand falsh,其Pagesize页大小多为2KB+64B的oob,block大小多为64pages页=64*(2K+64B)=128KB

5、+4KB,一个nand flash中的芯片,一般含有4096个块,比如samsung的K9F4G08U0M,所以这个nand flash大小就是4096 Blocks = 4096 * 64 *(2K+64B)=512MB即:1 Page = (2K + 64)Bytes1 Block = (2K + 64)B x 64 Pages= (128K + 4K) Bytes1 Device = (2K+64)B x 64Pages x 4,096 Blocks= 4,224 Mbits =512MB【Nand flash工作原理】所谓工作原理,其实也就是对应对其如何操作的。还是以上面提到的sams

6、ung的K9F4G08U0M的nand flash为例,简单描述如下:1.nand flash定义了一些引脚,使得你可以发送命令过去,实现对nand flash的操控:上面这些引脚,需要解释的主要是CLE,使能,只有使能有效,你才能进行后续的操作。只能选中了这个nand芯片,才能进行后续的读写。ALE,在发送地址时,要锁住地址总线,才可以操作。RE,WE,在读写之前,要对应的引脚有效,才可以进行读写的。其他见解释皆可。所有如上的引脚,都是驱动中,通过发送命令,具体内部控制逻辑去实现的。而驱动开发者要关心的,是何时去发送对应的命令。具体想要实现一操作,要何时发送什么命令才能实现,要继续看下面的d

7、atasheet中的解释:如果想要对nand flash操作,就要根据datasheet中的规范进行,比如对页的写操作/写编程要根据这个顺序去操作:其具体的细节,包含了哪些操作,可以看这个时序图:从上图可以看出来,要先发80h的命令,再继续后面的操作。这里的80h命令的含义,参考这个图表:从这个图表,可以看到,80h就是page program的第一个命令。而时序图中的先两个col列地址,后三个row行地址,是根据下面这个图得来的:此时才能定位到你所要操作的页,才能进行写操作。再多说几句,上图表示了,如果想要对这个nand flash操作,读或写,需要进行3次列地址和三次的行地址,才能定位到你

8、所要操作的地方,才能读写。同时显示了,每次每个位,对应代表的地址位。此处的2个列地址和3个行地址,是由硬件设计决定的。老的nand flash由于每个页只有512B,所以,最后的操作,只需要1个列地址和3个行地址就可以定位了。感兴趣的可以去网上下载samsung一些老的nand flash,可以对比着看,更明白些。而每个操作,比如上面的写操作,都是需要一定时间的,其具体硬件操作所需的时间,见这个图:此处可以看到,写一个页,即页编程,一般需要200us,最大需要700us,所以驱动开发者在开发的时候,要知道这个细节,要等待对应的时间,再去判断,是否写操作顺利完成了,才能接下来继续后面其他的操作的

9、。上述的具体代码实现,可以去看driversmtdnandnand_base.c中的nand_command_lp()函数中的代码:/* Command latch cycle */对命令锁存,然后才能发送命令 chip-cmd_ctrl(mtd, command & 0xff, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); if (column != -1 | page_addr != -1) int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;/先发送2次col地址,构成整个列地址 /* Serially

10、input address */ if (column ! /* Adjust columns for 16 bit buswidth */ if (chip-options & NAND_BUSWIDTH_16) column = 1; chip-cmd_ctrl(mtd, column, ctrl); ctrl &= NAND_CTRL_CHANGE;cmd_ctrl(mtd, column 8, ctrl); /再发送3次row地址,构成整个行地址 if (page_addr !cmd_ctrl(mtd, page_addr, ctrl);cmd_ctrl(mtd, page_addr

11、8, NAND_NCE | NAND_ALE); /* One more address cycle for devices 128MiB */chipsize (128 16, NAND_NCE | NAND_ALE); 这样就可以定位到我们要操作的位置,进行操作了。2.软件方面:Linux驱动原理具体内部很多实现,已经包含在driversmtdnandnand_base.c中了【nand flash驱动加载识别nand类型过程】在驱动加载的时候,会去调用:nand_get_flash_type()其中,就会对nand的类型和其他相关参数进行检查。1) 选中对应设备,如果此时只有一个nand

12、 芯片,则此步可以省略 /* Select the device */select_chip(mtd, 0);x2) 发读命令,去读取设备类型代码 /* Send the command for reading device ID */cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);3) 判断是哪个厂商的,哪个类型的flash /* Read manufacturer and device IDs */ *maf_id = chip-read_byte(mtd); dev_id = chip-4) 在事先已经定义好的nand flash类型中查找属于何种厂商和型

13、号 /* Lookup the flash id */ for (i = 0; nand_flash_idsi.name != NULL; i+) if (dev_id = nand_flash_idsi.id) type = &nand_flash_idsi; break;5) 继续判断具体nand flash的各个参数,包括芯片信息,Pagesize页大小,oobsize即oob的大小,blocksize块大小,buswidth总线宽度是8位还是16位。如果页大小不是之前老的nand的512B,而是新的nand的2K或更大,则后面对应的发送给nand flash命令的的时候,调用的函数就由

14、nand_command()变成nand_command_lp()了。后者主要比前者多一发个命令:chip-即,多发一个列地址命令。因为大页面(2KB)的寻址需要2次column,而小页面(512B)只需要1次的列地址。具体可以参考nand flash的datasheet。6) 接着会做一些其他初始化操作,包括最后调用nand_set_defaults()去实现的默认函数的挂载,如果你的nand flash驱动没有实现的话,就是挂载默认的了。【模块加载原理】这个内容太大,此处只是简单说说。驱动加载的功能主要是probe函数实现的,主要去识别设备的类型和各个参数,并且为设备的使用进行正常的初始化

15、。对应卸载时候执行的remove函数,施放对应的,之前申请的一些资源。【MTD设备】在Linux下,将nand Flash等设备归属到MTD设备下进行统一管理。Mtd,即memory technology deveice,即将nand看出是存储设备来管理。之所以会这么说和这么做,是因为前面提高的nand flash和普通硬盘等设备的特殊性:IO接口,最小单位是页,写前需擦除等,导致了,不能像平常对待硬盘等操作一样去操作nand flash,只能采取一些特殊方法,这就诞生了mtd设备的统一抽象层,将nand flash,nor flash和其他类型的flash等设备,统一抽象成mtd设备来管理,

16、根据这些设备的特点,上层实现了常见的操作函数封装,底层具体的内部实现,就需要驱动设计者自己来实现了。MTD设备和硬盘设备之前的区别HARD drivesMTD device连续的扇区连续的可擦除块扇区都很小(512B,1024B)可擦除块比较大 (32KB,128KB)主要通过两个操作对其维护操作:读扇区,写扇区主要通过三个操作对其维护操作:从擦除块中读,写入擦除块,擦写可擦除块坏快被重新映射,并且被硬件隐藏起来了(至少是在如今常见的LBA硬盘设备中是如此)坏的可擦除块没有被隐藏,软件中要处理对应的坏块问题。HDD扇区没有擦写寿命超出的问题。可擦除块是有擦除次数限制的,大概是104-105次.

17、【Linux下nand flash驱动编写步骤简介】 了解硬件的nand flash的各个参数和工作原理具体参考nand flash的datasheet,主要包括,自己nand flash的厂商,型号等。Nand flash的页大小,oob大小,块大小,位宽8bit还是16bit。工作原理,上面已经做了一定描述,不清楚的,可以参考datasheet,多看看,就会明白很多。 按照linux下驱动编写规范编写nand flash驱动,可以参考其他已经有的驱动,比如内核源码中已经有的driversmtdnands3c2410.c就是个很好的例子。自己以其为模板,实现自己板子的nand flash驱动

18、。其实主要工作就是,实现static struct platform_driver s3c2410_nand_driver = .probe = s3c2410_nand_probe, .remove = s3c2410_nand_remove, .suspend = s3c24xx_nand_suspend, .resume = s3c24xx_nand_resume, .driver = .name = s3c2410-nand, .owner = THIS_MODULE, ,;中的XXX_nand_probe函数XXX_nand_remove函数XXX_nand_enable_hwecc

19、,如果支持硬件ecc的话。对nand flash的读写,这两个函数,实现了对nand的具体操作。【Linux下Nand Flash驱动编写简单步骤】软件和硬件知识,都已经了解的话,由于上层的linux的 mtd框架中,已经完全封装好了,对nand flash的write page,write oob等相关函数的实现,那么剩下的只是相对来说已经是很少量的,关于nand 驱动具体内部操作方面的工作:1.初始化先是在nand 芯片初始化的时候,对其XXX_nand_init_chip()给对应的芯片chip赋给对应的XXX_nand_read_buf和XXX_nand_write_buf等函数: c

20、hip-cmd_ctrl = XXX_nand_hwcontrol;dev_ready = XXX_nand_devready;read_buf = XXX_nand_read_buf;write_buf = XXX_nand_write_buf;以实现后续的对nand芯片的操作。然后根据ecc类型,赋给对应的ecc的校验与纠错函数:ecc.hwctl = XXX_nand_enable_hwecc;ecc.calculate = XXX _nand_calculate_ecc; 实现上面提到的对应的各个函数,关于如何实现,参考一下其他nand驱动,就会理解很多了。4. 驱动测试,参考具体的 ldd3(Linux Device Driver version 3)的测试相关部分内容。说得很乱,希望对大家有些帮助。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1