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//这个代码自己去分析,你会发现和我们以前讲得是一样的
 */

你可能感兴趣的:(Linux块设备驱动之NOR FLASH)