NOR Flash驱动

发布时间:2024-07-31  

 

驱动程序

/*
* 参考:
* .linux-2.6.22.6driversmtddevicesmtdram.c
* .linux-2.6.22.6driversmtdmapsphysmap.c
*/
#include
#include
#include
#include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18
19
20 static struct map_info *nor_map;
21 static struct mtd_info *nor_mtd;
22
23
24 //分区信息
25 static struct mtd_partition nor_parts[] = {
26         [0= {
27                 .name         "bootloader_nor",                        
28                 .size         = 0x00040000,                        
29                 .offset = 0,                                        /* offset within the master MTD space */
30         },
31
32         [1= {
33                 .name         "root_nor",                                
34                 .offset = MTDPART_OFS_APPEND,        //紧跟着上一个分区的大小
35                 .size         = MTDPART_SIZ_FULL,                
36         },
37 };
38
39
40
41 /* 1 出入口函数 */
42 static int __init nor_init(void)
43 {
44         /* 2 分配map_info结构体 */
45         nor_map = kmalloc(sizeof(struct map_info), GFP_KERNEL);
46         /******** 2 end ********/
47
48
49         /* 3 设置:物理基地址(phys)、大小(size)、位宽(bankwidth)、虚拟基地址(virt) */
50         nor_map->name "nor";
51         nor_map->phys = 0;
52         nor_map->size = 1000000;        //16M,大于nor的实际大小
53         nor_map->bankwidth = 2;
54         nor_map->virt = ioremap(nor_map->phys, nor_map->size);
55
56         simple_map_init(nor_map);
57         /******** 3 end ********/
58
59
60         /* 4 使用:调用Nor Flash协议层提供的函数来识别 */
61         printk("use cfi_proben");
62         nor_mtd = do_map_probe("cfi_probe", nor_map);
63         if (!nor_mtd)
64         {
65                 printk("use jedec_proben");
66                 nor_mtd = do_map_probe("jedec_probe", nor_map);
67         }
68         
69         if (!nor_mtd)
70         {
71                 printk("failn");
72                 iounmap(nor_map->virt);
73                 kfree(nor_map);
74                 kfree(nor_mtd);
75                 return -EIO;
76         }
77         /******** 4 end ********/
78
79         /* 5 添加分区:add_mtd_partison */
80         add_mtd_partitions(nor_mtd, nor_parts, 2);
81         /******** 5 end ********/
82         return 0;
83 }
84
85
86 static void __exit nor_exit(void)
87 {
88         iounmap(nor_map->virt);
89         kfree(nor_map);
90         kfree(nor_mtd);
91         del_mtd_partitions(nor_mtd);
92         return;
93 }
94
95 module_init(nor_init);
96 module_exit(nor_exit);
97
98 MODULE_LICENSE("GPL");
99 /******** 1 end ********/

   

   

调试

测试1:通过配置内核支持NOR FLASH

1. make menuconfig

-> Device Drivers

-> Memory Technology Device (MTD) support

-> Mapping drivers for chip access

CFI Flash device in physical memory map

(0x0) Physical start address of flash mapping // 物理基地址

(0x1000000) Physical length of flash mapping // 长度

(2) Bank width in octets (NEW) // 位宽

 

2. make modules

cp drivers/mtd/maps/physmap.ko /work/nfs_root/first_fs

3. 启动开发板

ls /dev/mtd*

insmod physmap.ko

ls /dev/mtd*

cat /proc/mtd

   

测试2: 使用自己写的驱动程序:

1. ls /dev/mtd*

2. insmod s3c_nor.ko

3. ls /dev/mtd*

4. 格式化: flash_eraseall -j /dev/mtd1

5. mount -t jffs2 /dev/mtdblock1 /mnt

在/mnt目录下操作文件

 

 

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)

.....

 

do_map_probe("jedec_probe", s3c_nor_map);

drv = get_mtd_chip_driver(name)

ret = drv->probe(map); // jedec_probe

jedec_probe

mtd_do_chip_probe(map, &jedec_chip_probe);

genprobe_ident_chips(map, cp);

genprobe_new_chip(map, cp, &cfi)

cp->probe_chip(map, 0, NULL, cfi)

jedec_probe_chip

// 解锁

cfi_send_gen_cmd(0xaa, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);

cfi_send_gen_cmd(0x55, cfi->addr_unlock2, base, map, cfi, cfi->device_type, NULL);

 

// 读ID命令

cfi_send_gen_cmd(0x90, cfi->addr_unlock1, base, map, cfi, cfi->device_type, NULL);

 

// 得到厂家ID,设备ID

cfi->mfr = jedec_read_mfr(map, base, cfi);

cfi->id = jedec_read_id(map, base, cfi);

 

// 和数组比较

jedec_table


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>