【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

很长一段时间,nand flash都是嵌入式的标配产品。nand flash价格便宜,存储量大,适用于很多的场景。现在很普及的ssd,上面的存储模块其实也是由一块一块nand flash构成的。对于linux嵌入式来说,开始uboot的加载是硬件完成的,中期的kernel加载是由uboot中的nand flash驱动完成的,而后期的rootfs加载,这就要靠kernel自己来完成了。当然,这次还是以三星s3c芯片为例进行说明。

1、nand flash驱动在什么地方,可以从drviers/mtd/Makefile来看

obj-y        += chips/ lpddr/ maps/ devices/ nand/ onenand/ tests/

2、nand在mtd下面,是作为一个单独目录保存的,这时应该查看nand下的Kconfig

config MTD_NAND_S3C2410tristate "NAND Flash support for Samsung S3C SoCs"depends on ARCH_S3C24XX || ARCH_S3C64XXhelpThis enables the NAND flash controller on the S3C24xx and S3C64xxSoCsNo board specific support is done by this driver, each boardmust advertise a platform_device for the driver to attach.config MTD_NAND_S3C2410_DEBUGbool "Samsung S3C NAND driver debug"depends on MTD_NAND_S3C2410helpEnable debugging of the S3C NAND driverconfig MTD_NAND_S3C2410_CLKSTOPbool "Samsung S3C NAND IDLE clock stop"depends on MTD_NAND_S3C2410default nhelpStop the clock to the NAND controller when there is no chipselected to save power. This will mean there is a small delaywhen the is NAND chip selected or released, but will saveapproximately 5mA of power when there is nothing happening.

3、不难发现,MTD_NAND_S3C2410才是那个真正的macro,尝试在Makefile找文件

obj-$(CONFIG_MTD_NAND_S3C2410)       += s3c2410.o

4、查看s3c2410.c文件,看看基本结构构成

static struct platform_driver s3c24xx_nand_driver = {.probe     = s3c24xx_nand_probe,.remove       = s3c24xx_nand_remove,.suspend = s3c24xx_nand_suspend,.resume     = s3c24xx_nand_resume,.id_table    = s3c24xx_driver_ids,.driver       = {.name   = "s3c24xx-nand",.of_match_table = s3c24xx_nand_dt_ids,},
};module_platform_driver(s3c24xx_nand_driver);

5、继续分析s3c24xx_nand_probe函数

     s3c2410_nand_init_chip(info, nmtd, sets);

6、之所以从中摘出了s3c2410_nand_init_chip这个函数,是因为里面进行了函数注册

类似的函数还有s3c2410_nand_update_chip函数

 chip->write_buf    = s3c2410_nand_write_buf;chip->read_buf     = s3c2410_nand_read_buf;chip->select_chip  = s3c2410_nand_select_chip;chip->chip_delay   = 50;nand_set_controller_data(chip, nmtd);chip->options     = set->options;chip->controller   = &info->controller;switch (info->cpu_type) {case TYPE_S3C2410:chip->IO_ADDR_W = regs + S3C2410_NFDATA;info->sel_reg   = regs + S3C2410_NFCONF;info->sel_bit    = S3C2410_NFCONF_nFCE;chip->cmd_ctrl  = s3c2410_nand_hwcontrol;chip->dev_ready = s3c2410_nand_devready;break;case TYPE_S3C2440:chip->IO_ADDR_W = regs + S3C2440_NFDATA;info->sel_reg   = regs + S3C2440_NFCONT;info->sel_bit  = S3C2440_NFCONT_nFCE;chip->cmd_ctrl  = s3c2440_nand_hwcontrol;chip->dev_ready = s3c2440_nand_devready;chip->read_buf  = s3c2440_nand_read_buf;chip->write_buf  = s3c2440_nand_write_buf;break;case TYPE_S3C2412:chip->IO_ADDR_W = regs + S3C2440_NFDATA;info->sel_reg   = regs + S3C2440_NFCONT;info->sel_bit    = S3C2412_NFCONT_nFCE0;chip->cmd_ctrl  = s3c2440_nand_hwcontrol;chip->dev_ready = s3c2412_nand_devready;if (readl(regs + S3C2410_NFCONF) & S3C2412_NFCONF_NANDBOOT)dev_info(info->device, "System booted from NAND\n");break;}

7、抓住了函数接口,就找到了基本逻辑。

对于框架来说,它不关心你的代码如何实现。只要你按照它的接口写,就能让上层正常获得数据。platform、usb、pci这都是一种接口形式,具体实现还要按照各个具体功能模块来实现才行。

8、为什么我们都用s3c芯片进行举例

因为它用的场景最多,学习资料最全,对于新手来说,这会少很多麻烦。

9、这个驱动依赖的kernel版本是什么

这里最有的代码都是按照最新4.16的版本进行分析的,大家可以直接查看这里的地址。

linux驱动编写(nand flash驱动)相关推荐

  1. linux用户空间flash驱动,全面掌握Linux驱动框架——字符设备驱动、I2C驱动、总线设备驱动、NAND FLASH驱动...

    原标题:全面掌握Linux驱动框架--字符设备驱动.I2C驱动.总线设备驱动.NAND FLASH驱动 字符设备驱动 哈~ 这几天都在发图,通过这种方式,我们希望能帮大家梳理学过的知识,全局的掌握Li ...

  2. 《Linux驱动:nand flash驱动看这一篇就够了》

    文章目录 一,前言 二,硬件电路 2.1 Nand flash相关 2.2 S3c2440相关 2.3 Nand flash 位反转 三,Nand flash驱动框架 四,S3c2440 Nand F ...

  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驱动之nor flash驱动

    1. 基本概念 NOR FLASH是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上 ...

  6. Nand flash驱动的编写与移植

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

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

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

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

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

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

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

最新文章

  1. keepalived 高可用日志说明及实战配置日志路径
  2. 订货(bzoj 2424)
  3. 1.3 安装Oracle遇到的问题-yum更新配置
  4. 一个最简单的例子学会使用nodejs redis库进行数据库操作
  5. 关于Xcode 7.3 7.3.1 断点 卡死 无限菊花
  6. oracle io lost,磁盘IO故障
  7. 【LeetCode】剑指 Offer 39. 数组中出现次数超过一半的数字
  8. 安装php扩展后,执行时找不到扩展 class xxx no found
  9. WebRTC-集成qsv硬解码实现
  10. OCRKit Pro for mac (OCR文字识别工具)
  11. 【毕业季】这四年一路走来都很值得——老学长の忠告
  12. win10操作系统如何整理桌面
  13. 【读书笔记】--少有人走的路①:心智成熟的旅程
  14. Lucene打分公式详解(TFIDFSimilarity)
  15. 川崎机器人f控制柜接线图_川崎机器人PROFINET总线通信图文教程
  16. 【Houdini18.5/入门】程序化uv01-将uv壳布局在指定范围
  17. 网页游戏HTML5--爱心鱼实现过程
  18. opencv 实现导向滤波
  19. GPS北斗定位模块如何应用于智慧农业
  20. 任正非签发文章,时隔五年再被翻出

热门文章

  1. Data Binding的使用总结
  2. F5 APM针对Vmware view7.3 VDI业务发布测试问题分析
  3. Android中监听ScrollView滑动停止和滑动到底部
  4. Find Minimum in Rotated Sorted Array leetcode java
  5. JavaScript使用正则表达
  6. [收藏]实践参考:parted创建硬盘分区并创建LVM
  7. Dynamics CRM 2013 installation
  8. 【题解】最近公共祖先
  9. php 根据常量名称判断是否定义 和常量名称输出值
  10. Caffe框架详细梳理