块设备驱动之NOR FLASH驱动
转载请注明出处: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驱动相关推荐
- linux用户空间flash驱动,全面掌握Linux驱动框架——字符设备驱动、I2C驱动、总线设备驱动、NAND FLASH驱动...
原标题:全面掌握Linux驱动框架--字符设备驱动.I2C驱动.总线设备驱动.NAND FLASH驱动 字符设备驱动 哈~ 这几天都在发图,通过这种方式,我们希望能帮大家梳理学过的知识,全局的掌握Li ...
- 十八、Linux驱动之nor flash驱动
1. 基本概念 NOR FLASH是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上 ...
- linux nand 驱动,Linux NAND FLASH驱动分析(一)
最近一直在忙着工作上的事情,好久都没有更新博客了,发现最近思想是比较混乱的.学任何东西都坚持不下去,既然选择驱动开发这条路就要坚持下去. 之前分析了Linux块设备驱动,是以内存块来模拟的虚拟块设备. ...
- 《Linux驱动:Nor flash驱动看这一篇就够了》
文章目录 一,前言 二,硬件电路 2.1 脚位功能 2.2 地址移位 三,Nand Flash和Nor Flash的区别 四,Nor flash CFI规范和JEDEC规范 4.1 JEDEC规范 4 ...
- 《Linux驱动:nand flash驱动看这一篇就够了》
文章目录 一,前言 二,硬件电路 2.1 Nand flash相关 2.2 S3c2440相关 2.3 Nand flash 位反转 三,Nand flash驱动框架 四,S3c2440 Nand F ...
- linux3.2.0块设备及nandflash驱动框架
块设备框架:app: open,read,write "1.txt" --------------------------------------------- 文件的读写 文件系 ...
- 34.驱动--块设备驱动
Linux块设备IO子系统(一) _驱动模型 - Abnor - 博客园 22.Linux-块设备驱动之框架详细分析(详解) - 诺谦 - 博客园 23.Linux-块设备驱动(详解) - 诺谦 - ...
- 2017年5月问题记录与总结——powerpc p1020 spi flash驱动
1.SPI基础 SPI是串行外围接口的意思,一般用来接一些低速的外围设备,比如eeprom,flash,ad传感器,rtc等.硬件上,SPI有四根线,SDI/SDO/CS/SCLK,具体的协议可以参看 ...
- 杰理之添加外挂 flash 驱动及实现音乐播放功能
功能简单说明:在音乐模式下实现播放外挂 flash 里面的歌曲的功能,操作方式与 SD 卡,U 盘一致. 注意:flash 需预先把音乐文件和 fat 文件系统烧录进 flash.目前不支持写操作. ...
最新文章
- 双十二爬虫顶流崔庆才老师来图灵直播啦!快来围观啊!!!
- 混合云计算应用中小企业市场前景看好
- 组件中props参数的应用
- linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...
- JasperReport:概述
- 卸载wrapt_[python] 安装TensorFlow问题 解决Cannot uninstall 'wrapt'. It is a distutils installed project...
- dairy-20110419-每日总结
- python实验九答案_Python程序设计实验报告:实验九 python 包管理
- Centos7.X安装mariadb及卸载mariadb安装mysql方法
- Android Unable to find source java class:<File>because it does not belong to any of the source dirs:
- html— Meta— http-equiv属性
- IPV6地址数据库导出
- guava深入理解(3)-字符串,实用方法,函数式编程
- CSS让行内元素撑满整个视口
- 【matlab】正弦波、方波、三角波、白噪声等8种基本信号
- 系统可用性SLA指标
- Usage of Pseudocode
- SHOW TABLES语法
- C语言-输出* 图形 ** *** **** *****
- sap 服务器 拷贝文件,本文示例如何使用SAP FTP Function将文件从应用服务器传输到另外一个FTP服务器上。...