Nor和Nand可以说各有所长吧,但是随着现在工艺的提升,Nand出现坏块或位反转的情形已大有改观。所以如果对数据没有十分严格的要求,大部分情况下,一般人还是乐意用nand的。谁又会去和钱过不去呢?
Nor支持XIP 直接从片内取指令执行。
Nor的电路连接如上所示,用到16条数据线和16条地址线。
- /*
- * 参考: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 = dev->dev.bus_id;
- s3c_nor_map->name = "s3c_nor"; /* 名字 */
- // s3c_nor_map->phys = dev->resource->start;
- s3c_nor_map->phys = 0; /* 物理地址 */
- // s3c_nor_map->size = dev->resource->end - dev->resource->start + 1;
- s3c_nor_map->size = 0x1000000; /* 大小 16M(一定要>=Nor的真正大小 */
- // s3c_nor_map->bankwidth = physmap_data->width;
- s3c_nor_map->bankwidth = 2; /* 位宽 16位 */
- // s3c_nor_map->set_vpp = physmap_data->set_vpp;
- s3c_nor_map->set_vpp = physmap_data->set_vpp; /* */
- // s3c_nor_map->virt = ioremap(info->map.phys, info->map.size);
- 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);
- if (!s3c_nor_mtd)
- {
- printk("use jeded_probe\n");
- s3c_nor_mtd = do_map_probe("jeded_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(struct mtd_info * master,const struct mtd_partition * parts,int nbparts)
- add_mtd_partitions(s3c_nor_mtd, s3c_nor_parts, 2);
- return 0;
- }
- static int 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_DESCRIPTION("nor_flash driver test for the s3c2440");
- MODULE_LICENSE("GPL");
阅读(407) | 评论(0) | 转发(0) |