Linux块设备驱动之NOR FLASH

简介:
块设备驱动之NOR FLASH和NAND基本没有区别,具体两者功能上区别,做嵌入式开发的朋友们就一定要理解过来,这里牵扯到很多地址的问题,超出本文的范围,有机会我会把整个项目从硬件到应用程序的流程写出来,这是一个费时的过程,我也得慢慢修改和查找相关资料,免得写出来误人子弟。大笑我只是一介菜鸟。
/*
 * 参考 drivers\mtd\maps\physmap.c
 */
 
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);//和NAND 的模型是一样的
if (!s3c_nor_mtd)//选择cfi_probe还是jedec_probe
{
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);//和NAND一样的


return 0;
}


static void s3c_nor_exit(void)
{
iounmap(s3c_nor_map->virt);
kfree(s3c_nor_map);
}


总结:NOR FLASH和NAND FLASH基本一样,框架只是有一点很小的差异,基地址和位宽


都是构造一个mtd_info结构体,然后自己构造一个自己硬件的结构体,NAND FLASH 是nand_chip
NOR FLASH是map_info,最后这两个结构体最终会被mtd_info调用。


下面随便提一下还可以用内存模拟一个flash,只是需要我们构造一个mtd_info结构体,其他的工作别人已经做好了
/*
 * 参考 drivers\mtd\devices\Mtdram.c//这个代码自己去分析,你会发现和我们以前讲得是一样的
 */
目录
相关文章
|
7月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
74 6
|
7月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
90 5
|
7月前
|
Ubuntu NoSQL Linux
Linux内核和驱动
Linux内核和驱动
59 2
|
8月前
|
存储 JSON Linux
|
7月前
|
数据采集 Linux
Linux源码阅读笔记20-PCI设备驱动详解
Linux源码阅读笔记20-PCI设备驱动详解
|
7月前
|
存储 缓存 Linux
Linux源码阅读笔记15-块设备详解
Linux源码阅读笔记15-块设备详解
|
8月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
252 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
6月前
|
Linux API
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
|
7月前
|
Linux
【linux】【驱动】<specifier>-map-pass-thru讲解
【linux】【驱动】<specifier>-map-pass-thru讲解
36 0
|
7月前
|
Linux
【linux】【驱动】phy接口类型
【linux】【驱动】phy接口类型
40 0