块设备驱动之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.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都是支持这套协议的。

参考:韦东山视频第二期

块设备驱动之NOR FLASH驱动

时间: 2024-08-25 07:23:17

块设备驱动之NOR FLASH驱动的相关文章

嵌入式开发值zynq驱动—— zynq SPI Flash 驱动过程

http://blog.csdn.net/pengwangguo/article/details/52292664 http://blog.csdn.net/pengwangguo/article/details/51991750 http://www.cnblogs.com/surpassal/category/412020.html http://blog.csdn.net/a746742897/article/details/52803865 http://blog.csdn.net/em

《驱动学习 - Nor Flash驱动》

1.nor硬件介绍: 从原理图中我们能看到NOR FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,但是不能像SDRAM直接写入数据,需要有命令才行. 原文地址:https://www.cnblogs.com/zhuangquan/p/11703625.html

块设备驱动框架分析(二)

参考:块设备驱动之一  块设备驱动之二  块设备驱动之三 总结上一篇的块设备驱动的步骤: 1. 分配gendisk: alloc_disk static struct gendisk * ramblock_disk = alloc_disk(16); /* 次设备号个数: 分区个数+1 */2. 设置2.1 分配/设置队列: // 它提供读写能力static struct request_queue  * ramblock_queue = blk_init_queue(do_ramblock_r

块设备驱动之内存模拟硬盘

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25240899 一.块设备驱动框架 app:      open,read,write "hello.txt" ---------------------------------------------  文件的读写 文件系统: vfat, ext2, ext3, yaffs2, jffs2      (把文件的读写转换为扇区的读写) ----------------

块设备驱动

在Linux下,驱动设备有字符设备驱动.块设备驱动和网络设备驱动三种,之前学习了字符设备驱动,现在开始学习块设备驱动.首先来比较看这两种设备驱动有何不通,为什么要分割成不同类型的驱动.举一个例子说明引入块设备驱动的必要: 假如按照字符设备一样的框架去构造驱动,如图: 则需要频繁地对存储设备进行擦除,如果使用另一种框架构思(块设备思想): 对比之下,对于这样的存储设备,则引入块设备显然使得操作的效果大为提高.由此可知块设备的特点就是:把请求放入队列,优化后执行. 字符设备与块设备I/O操作的区别:

Smart210学习记录------nor flash驱动

nor flash驱动与nand flash驱动的差别不大,只是设置不同的结构体而已,, nor flash驱动代码: #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

块设备驱动程序的框架

块设备和前面的字符设备驱动主体框架和编程思想上基本相同,但是在操作的时候就不一样了. 框架: app: open,read,write "1.txt"--------------------------------------------- 文件的读写文件系统: vfat, ext2, ext3, yaffs2, jffs2 (把文件的读写转换为扇区的读写)-----------------ll_rw_block----------------- 扇区的读写 1. 把"读写&

块设备驱动之NAND FLASH驱动程序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25240909 一.框架总结 二.硬件原理 相比于nor flash,我们可以清楚的看出引脚少了很多,主要是输入输出引脚进行了复用.现在我说下各引脚的用途. a.LDATA0~LDATA7这8个引脚为输入输出引脚.命令.地址.数据的传输都是由这8个引脚实现的(引脚复用,节约引脚). b.RnB:此引脚用来判忙.因为命令.数据.地址发出去和收到时候不能立刻就完成,需要一个时间.此

FLASH驱动之-块设备驱动系统构架

一.  块设备是只能以块为单位进行访问的设备,块的大小一般是512个字节的整数倍,常见的块设备包括硬件,SD卡,光盘,flash等.驱动程序是块的整数倍从设备读写得到数据.块设备的最小访单位为块,不同系统之上,对块的大小是不一样的,linux一般定义为512个字节.我们每次访问一个块设备是最小访问单位为512个字节.这里的512字节是指硬件一次从磁盘上读写512个数据,而用户可能只需要1个字节.所以有时用户只得了1个字节. 二.块设备驱动系统框图 用户从磁盘中读取数据来分析