转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25240947

一.硬件原理

从原理图中我们能看到NOR FLASH有地址线,有数据线,能向内存一样读,不能向内存一样写(要发出某些命令)。这也使得NOR的数据非常可靠,所以一般用来存储bootloader。当然现在手机上都只有nand flash了,节约成本嘛。下节我会带大家去分析nand flash驱动,并进行总结。

二.驱动程序

/** 参考 drivers\mtd\maps\physmap.c*/#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <asm/io.h>static struct map_info *s3c_nor_map;
static struct mtd_info *s3c_nor_mtd;/*分区数组*/
static struct mtd_partition s3c_nor_parts[] = {[0] = {.name   = "bootloader_nor",.size   = 0x00040000,.offset = 0,},[1] = {.name   = "root_nor",.offset = MTDPART_OFS_APPEND,      //紧接着上一个.size   = MTDPART_SIZ_FULL,         //到最后}
};static int s3c_nor_init(void)  //入口函数
{/* 1. 分配map_info结构体 */s3c_nor_map = kzalloc(sizeof(struct map_info), GFP_KERNEL);;/* 2. 设置: 物理基地址(phys), 大小(size), 位宽(bankwidth), 虚拟基地址(virt) */s3c_nor_map->name = "s3c_nor";s3c_nor_map->phys = 0;          //物理地址s3c_nor_map->size = 0x1000000; /* >= NOR的真正大小 */s3c_nor_map->bankwidth = 2;     //位宽s3c_nor_map->virt = ioremap(s3c_nor_map->phys, s3c_nor_map->size);  //虚拟地址simple_map_init(s3c_nor_map);    //简单初始化/* 3. 使用: 调用NOR FLASH协议层提供的函数来识别 */printk("use cfi_probe\n");s3c_nor_mtd = do_map_probe("cfi_probe", s3c_nor_map);/*如果没识别就用jedec*/if (!s3c_nor_mtd){printk("use jedec_probe\n");s3c_nor_mtd = do_map_probe("jedec_probe", s3c_nor_map);}/*如果仍然没事别就释放掉,返回错误*/if (!s3c_nor_mtd){     iounmap(s3c_nor_map->virt);kfree(s3c_nor_map);return -EIO;}/* 4. add_mtd_partitions (添加分区)*/add_mtd_partitions(s3c_nor_mtd, s3c_nor_parts, 2);return 0;
}static void s3c_nor_exit(void)         //出口函数
{del_mtd_partitions(s3c_nor_mtd);  iounmap(s3c_nor_map->virt);         kfree(s3c_nor_map);
}module_init(s3c_nor_init);
module_exit(s3c_nor_exit);MODULE_LICENSE("GPL");

三.驱动分析

1. 分配map_info结构体

2. 设置: 物理基地址(phys), 大小(size), 位宽(bankwidth), 虚拟基地址(virt)

3. 使用: 调用NOR FLASH协议层提供的函数来识别

4. add_mtd_partitions (添加分区)

其实我们的这个驱动,主要把硬件上的差异性写出来就可以了,大部分的工作内核已经帮我们做了。现在我主要来分析第三步。cfi和jedec,这里主要分析cfi

/*NOR FLASH识别过程*/
do_map_probe("cfi_probe", s3c_nor_map);drv = get_mtd_chip_driver(name)ret = drv->probe(map);  // cfi_probe.ccfi_probemtd_do_chip_probe(map, &cfi_chip_probe);cfi = genprobe_ident_chips(map, cp);genprobe_new_chip(map, cp, &cfi)cp->probe_chip(map, 0, NULL, cfi)cfi_probe_chip// 进入CFI模式cfi_send_gen_cmd(0x98, 0x55, base, map, cfi, cfi->device_type, NULL);// 看是否能读出"QRY"qry_present(map,base,cfi)

我们进行的操作其实在协议层已经帮我们写好了,我们需要提供的其实就是硬件上的差异。因为所有的nor都是支持这套协议的。

参考:韦东山视频第二期

块设备驱动之NOR FLASH驱动相关推荐

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

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

  2. 十八、Linux驱动之nor flash驱动

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

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

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

  4. 《Linux驱动:Nor flash驱动看这一篇就够了》

    文章目录 一,前言 二,硬件电路 2.1 脚位功能 2.2 地址移位 三,Nand Flash和Nor Flash的区别 四,Nor flash CFI规范和JEDEC规范 4.1 JEDEC规范 4 ...

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

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

  6. linux3.2.0块设备及nandflash驱动框架

    块设备框架:app: open,read,write "1.txt" --------------------------------------------- 文件的读写 文件系 ...

  7. 34.驱动--块设备驱动

    Linux块设备IO子系统(一) _驱动模型 - Abnor - 博客园 22.Linux-块设备驱动之框架详细分析(详解) - 诺谦 - 博客园 23.Linux-块设备驱动(详解) - 诺谦 - ...

  8. 2017年5月问题记录与总结——powerpc p1020 spi flash驱动

    1.SPI基础 SPI是串行外围接口的意思,一般用来接一些低速的外围设备,比如eeprom,flash,ad传感器,rtc等.硬件上,SPI有四根线,SDI/SDO/CS/SCLK,具体的协议可以参看 ...

  9. 杰理之添加外挂 flash 驱动及实现音乐播放功能

    功能简单说明:在音乐模式下实现播放外挂 flash 里面的歌曲的功能,操作方式与 SD 卡,U 盘一致. 注意:flash 需预先把音乐文件和 fat 文件系统烧录进 flash.目前不支持写操作. ...

最新文章

  1. 双十二爬虫顶流崔庆才老师来图灵直播啦!快来围观啊!!!
  2. 混合云计算应用中小企业市场前景看好
  3. 组件中props参数的应用
  4. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...
  5. JasperReport:概述
  6. 卸载wrapt_[python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project...
  7. dairy-20110419-每日总结
  8. python实验九答案_Python程序设计实验报告:实验九 python 包管理
  9. Centos7.X安装mariadb及卸载mariadb安装mysql方法
  10. Android Unable to find source java class:<File>because it does not belong to any of the source dirs:
  11. html— Meta— http-equiv属性
  12. IPV6地址数据库导出
  13. guava深入理解(3)-字符串,实用方法,函数式编程
  14. CSS让行内元素撑满整个视口
  15. 【matlab】正弦波、方波、三角波、白噪声等8种基本信号
  16. 系统可用性SLA指标
  17. Usage of Pseudocode
  18. SHOW TABLES语法
  19. C语言-输出* 图形 ** *** **** *****
  20. sap 服务器 拷贝文件,本文示例如何使用SAP FTP Function将文件从应用服务器传输到另外一个FTP服务器上。...

热门文章

  1. Java学习第八天之super关键字的概念
  2. matlab拟合函数 自定义,MATLAB 自定义函数拟合
  3. 支付宝赏金红包搜索码自动复制自动跳转链接制作方法步骤
  4. 多智能体强化学习论文——COMA
  5. PHP Mysql字符集utf8mb4支持Emoji表情
  6. Android海外应用和安卓源码的多国语言翻译
  7. 第十二章 PHP设计模式之外观模式
  8. 什么是redo log和undo log
  9. 图像加密算法——Logistic混沌置乱
  10. EN 14313:PEF聚乙烯泡沫CE认证