博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
块设备驱动之NOR FLASH驱动
阅读量:6075 次
发布时间:2019-06-20

本文共 2917 字,大约阅读时间需要 9 分钟。

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

一.硬件原理

从原理图中我们能看到NOR FLASH有地址线,有数据线,能向内存一样读,不能向内存一样写(要发出某些命令)。

这也使得NOR的数据很可靠,所以一般用来存储bootloader。当然如今手机上都仅仅有nand flash了。节约成本嘛。下节我会带大家去分析nand flash驱动,并进行总结。

二.驱动程序

/* * 參考 drivers\mtd\maps\physmap.c */#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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.c            cfi_probe                mtd_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都是支持这套协议的。

參考:韦东山视频第二期

你可能感兴趣的文章
技术汇之物联网设备网关技术架构设计
查看>>
OSX10.11 CocoaPods 升级总结
查看>>
深入浅出Netty
查看>>
3.使用maven创建java web项目
查看>>
笔记本搜索不到某一AP广播的SSID,信道的原因
查看>>
基于Spring MVC的异常处理及日志管理
查看>>
MediaBrowserService 音乐播放项目《IT蓝豹》
查看>>
MySQL入门12-数据类型
查看>>
Windows Azure 保留已存在的虚拟网络外网IP(云服务)
查看>>
修改字符集
查看>>
HackTheGame 攻略 - 第四关
查看>>
js删除数组元素
查看>>
带空格文件名的处理(find xargs grep ..etc)
查看>>
华为Access、Hybrid和Trunk的区别和设置
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>
关于HTML5的理解
查看>>
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>