Nand flash芯片工作原理:
------------------------------------
    Nand flash芯片型号为Samsung K9F2G08U0A,数据存储容量为256MB,总线宽度为8bit,页大小为2048字节,需要5个寻址命令,采用块页式存储管理。8个I/O引脚充当数据、地址、命令的复用端口。

芯片内部存储布局及存储操作特点:
    一片Nand flash为一个设备(device), 其数据存储分层为:
    1 (Device) = 2048 (Blocks)
    1 (Block) -= 64  (Pages/Rows) 页与行是相同的意思,叫法不一样

1 (Page)   =  数据块大小(2KB) + OOB 块大小(64Bytes)

在每一页中,最后64个字节(又称OOB)用于Nand Flash命令执行完后设置状态用,剩余2k字节又
分为前半部分和后半部分。可以通过Nand Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位通过Nand Flash内置的指针指向各自的首地址。

存储操作特点:
    1. 擦除操作的最小单位是块。
    2. Nand Flash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).
    3. 对于现在常见的页大小为2K的nand flash,把块中第一页的OOB部分的第1个字节标志为是否是坏块,如果不是坏块该值为FF,否则为坏块。
    4. 除OOB第1字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码

------------------------------------
下面对nand flash的初始化代码nand_init()进行分析:
1.如果定义(CONFIG_COMMANDS & CFG_CMD_NAND)没定义(CFG_NAND_LEGACY)则start_armboot()调用driver/nand/nand.c中的nand_init(),否则如果定义(CONFIG_COMMANDS&CFG_CMD_NAND)并且有定义了CFG_NAND_LEGACY,则调用自己定义的nand_init()。在我当前的情景中是使用driver/nand/nand.c中的nand_init()。
2.nand_init()调用本文件中的nand_init_chip()对nand进行初始化。
3.nand_init_chip()首先调用board_nand_init()。
4.board_nand_init()是需要自己添加的函数,这个函数的主要功能是对struct nand_chip结构体的函数指针赋值,让它们指向自己为nand驱动编写的一些函数,对未赋值的指针,uboot会在后面为其赋上通用nand驱动函数指针。
5.nand_init_chip()接着调用nand_scan().
6.nand_scan()定义在drivers/nand/nand_base.c文件中。它首先对struct nand_chip结构体中在board_nand_init()函数中未赋值的指针赋上通用nand驱动函数指针。
7.通用nand驱动函数nand_select_chip()赋值给structnand_chip结构体的函数指针用于打开或关闭nand芯片,0为打开,1为关闭。在这个函数中会调用nand_chip结构体中的hwcontrol函数指针,这个指针指向的函数是需要自己编写的。这个函数指针在board_nand_init()函数中被赋值。主要作用是向nand flash发送一些nand flash开启与关闭命令。
8.nand_scan()剩余部分初始化nand_chip和mtd_info结构体。
9.nand_scan()最后在返回时调用drivers/nand/nand_bbt.c文件中的nand_default_bbt()。
10.nand_default_bby()选择一个坏块描述表,返回时调用本文件中的nand_scan_bbt()。
11.nand_scan_bbt()寻找建立一个坏块描述表。
12.最后返回到nand_init(),这样nand驱动的初始化完成了。

下面对命令nand read addr ofs size的执行流程进行分析:
1.nand read addr ofs size命令的作用是从nand flash地址的偏移量ofs处读取长度为size字节的数据存储到内存地址addr处。
2.common/main.c文件中的main_loop()主要执行read_line()读取命令行。
3.read_line()读取到命令行后会调用common/main.c文件中的run_command()。
4.run_command()调用common/command.c文件中的find_cmd()在.u_boot_cmd段中寻找该命令的cmd_tbl_t结构,找到后返回该结构。该命令的结构是通过定义在include/command.h中的宏定义U_BOOT_CMD登记进.u_boot_cmd段中的。
5.run_command()找到该命令的cmd_tbl_t结构后则执行该命令对应的函数。对于本情景是nand命令对应的函数do_nand()。
6.do_nand()有两个版本,一个是定义了CFG_NAND_LEGACY。另一个是未定义CFG_NAND_LEGACY。这两个版本都定义在common/cmd_nand.c文件中。对于本情景使用未定义CFG_NAND_LEGACY的do_nand()函数。要使用do_nand()还必须定义宏CONFIG_COMMANDS&CFG_CMD_NAND。(若未定义CFG_NAND_LEGACY则在这个情景中的do_nand()函数调用的函数都定义在drivers/nand_legacy/nand_legacy.c文件中)。
7.对于我们的情景do_nand()会调用定义在include/nand.h文件中的nand_read()。
8.nand_read()则调用本nand芯片对应的nand_info_t结构的read指针。而read指针在nand_scan()中被指向了同文件(drivers/nand/nand_base.c)中的nand_read()函数。
9.nand_read()函数最终会调用nand_chip结构中的cmdfunc指针,通过这个指针指向的函数向nand flash芯片发送命令。最终完成整个命令的执行。

uboot下的nand flash驱动分析相关推荐

  1. Linux MTD架构下的nand flash驱动详解

    转载自:http://blog.csdn.net/wang_zheng_kai/article/details/18988521 有了前面的基础(Nandflash详解:https://blog.cs ...

  2. linux nand 驱动,Linux NAND FLASH驱动分析(一)

    最近一直在忙着工作上的事情,好久都没有更新博客了,发现最近思想是比较混乱的.学任何东西都坚持不下去,既然选择驱动开发这条路就要坚持下去. 之前分析了Linux块设备驱动,是以内存块来模拟的虚拟块设备. ...

  3. nand flash 经典 全面 ------如何编写Linux下Nand Flash驱动

    Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开 ...

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

    http://www.cnblogs.com/sankye/articles/1638852.html 向作者Sankye致敬 [编写驱动之前要了解的知识] 1.       硬件特性: [Flash ...

  5. linux驱动编写(nand flash驱动)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 很长一段时间,nand flash都是嵌入式的标配产品.nand flash价格便宜,存储量大, ...

  6. Linux NAND FLASH驱动程序分析(mini2440)

    Linux NAND FLASH驱动程序分析(mini2440) 一.Linux-MTD Subsystem介绍 FLASH在嵌入式系统中是必不可少的,它是bootloader.linux内核和文件系 ...

  7. ARM9 2410移植之Nand flash 驱动的编写与移植

    1 Nand flash 工作原理 S3C2410 板的Nand Flash 支持由两部分组成:Nand Flash 控制器(集成在S3C2410 CPU)和Nand Flash 存储 芯片(K9F1 ...

  8. [转]ARM9 2410移植之Nand flash 驱动的编写与移植

    1 Nand flash 工作原理 S3C2410 板的Nand Flash 支持由两部分组成:Nand Flash 控制器(集成在S3C2410 CPU)和Nand Flash 存储 芯片(K9F1 ...

  9. nand flash驱动调试学习

    nand flash基础知识 nand flash上为什么只有地址线.如何传输数据和命令: 地址,数据,命令是复用的.使用ALE,CLE来进行区分的 通过RnB引脚来区分数据操作是否完成 nand f ...

最新文章

  1. 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数
  2. 为您解析大数据的未来趋势
  3. ftp无法与服务器建立连接_建立与Oracle数据库服务器连接的两种连接模式
  4. Redis中的Cluster总结
  5. Android之多线程----异步消息处理机制之Handler详解
  6. 文献阅读 | Epigenetics in ENS development and Hirschsprung disease
  7. 微信公众平台开发模式背后的原理?
  8. 百度AI学习:一、语音识别
  9. linux 查看所有端口号_linux系统:ss命令
  10. bzoj 2528: [Poi2011]Periodicity【kmp+构造】
  11. jquery中常容易出错的checkbox的获得值
  12. JSON字符串,JSON对象,JSON数组,实体类转换
  13. 天龙源码框架分析_天龙八部源码描述【转】
  14. 那个软件测试cpu温度准确,什么软件测试cpu温度准确_测试cpu温度准确软件汇总...
  15. SAS学习笔记27 卡方检验
  16. dedecms教程:龙书浩最新DedeCmsV5.7建站仿站VIP视频教程免费下载
  17. Dapper使用技巧和基础CRUD
  18. 访问者模式(Vistor Pattern)
  19. 动手写操作系统9----键盘鼠标中断实现
  20. 计算机图形学——光线追踪(RayTracing)算法

热门文章

  1. 关于安装PotPlayer64出现PotPlayer 64 bit need right Try agin的问题
  2. 硕士毕业,两年北漂算法工程打工生活【上】
  3. QT 5.12 安装MinGW 7.3.0 32bit
  4. Linux基本命令 初级10个
  5. CentOS 8.5下安装R语言经验总结
  6. 云效,云原生时代一站式研发平台
  7. fp5139应用电路图_基于FP5139的可调节电压源适配器
  8. spring boot启动后控制台没有端口信息打印日志也很少
  9. 马云:2019年两大行业,会成就一批千万富翁!
  10. 该怎么回答面试官问“你有什么优缺点?”