NOR Flash驱动

发布者:WhisperingWind最新更新时间:2024-07-31 来源: cnblogs关键字:NOR  Flash驱动 手机看文章 扫描二维码
随时随地手机看文章

 

驱动程序

/*
* 参考:
* .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


关键字:NOR  Flash驱动 引用地址:NOR Flash驱动

上一篇:NAND Flash驱动
下一篇:关于ARM9 S3C2440 wince6.0 内存 128M的使用问题

推荐阅读最新更新时间:2026-03-22 14:55

NOR 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/
[单片机]
Smart210学习记录----nand flash驱动
当读写文件请求到来的时候,流程如下   1.通过vfs进入文件系统,   2.文件系统把文件读写转换为块设备读写,其中有运用算法对读写操作进行合并,排序等,最后把块设备读写放进队列   3.循环从队列中取出读写要求,然后用处理函数(blk_init_queue设置)进行处理。    这个函数就是连接上层(IO调度)跟底层(硬件操作)的桥梁,当我们调用add_mtd_partitions的时候,就建立了上下层的联系。   4.对不同的处理要求,调用不同的nand的底层处理函数 nand flash驱动代码: #include linux/module.h #include linux/types.h #in
[单片机]
Smart210学习记录----nand <font color='red'>flash</font><font color='red'>驱动</font>
如何通过STM32CubeMX制作外部Flash的烧写驱动 (.stdlr)
前言 目前,越来越多的应用需要扩展外部的Flash来满足存储需求。那么,在调试及批量生产的过程中,需要对外扩的Flash进行烧录操作。由于STM32 ST-LINK Utility以及STM32CubeProgrammer中,对Flash支持的型号有限,只能覆盖一部分MCU和Flash的型号,无法完全满足客户的需求。而且,它提供的external loader的制作模板存在覆盖的芯片型号较少,且无法前期QSPI Flash调试的问题。本文旨在提供一种通过stm32CubeMX制作external Flash loader的方法。客户可以根据自己的型号,进行定制化的生成。本文中,以某客户实际使用的MCU(STM32H750) 和Fl
[单片机]
如何通过STM32CubeMX制作外部<font color='red'>Flash</font>的烧写<font color='red'>驱动</font> (.stdlr)
如何通过STM32CubeMX制作外部Flash的烧写驱动
前言 目前,越来越多的应用需要扩展外部的Flash来满足存储需求。那么,在调试及批量生产的过程中,需要对外扩的Flash进行烧录操作。由于STM32 ST-LINK Utility以及STM32CubeProgrammer中,对Flash支持的型号有限,只能覆盖一部分MCU和Flash的型号,无法完全满足客户的需求。而且,它提供的external loader的制作模板存在覆盖的芯片型号较少,且无法前期QSPI Flash调试的问题。本文旨在提供一种通过stm32CubeMX制作external Flash loader的方法。客户可以根据自己的型号,进行定制化的生成。本文中,以某客户实际使用的MCU(STM32H750) 和Fl
[单片机]
如何通过STM32CubeMX制作外部<font color='red'>Flash</font>的烧写<font color='red'>驱动</font>
通过 STM32CubeMX制作外部Flash的烧写驱动
前言 目前,越来越多的应用需要扩展外部的Flash来满足存储需求。那么,在调试及批量生产的过程中,需要对外扩的Flash进行烧录操作。由于STM32 ST-LINK Utility以及STM32CubeProgrammer中,对Flash支持的型号有限,只能覆盖一部分MCU和Flash的型号,无法完全满足客户的需求。而且,它提供的external loader的制作模板存在覆盖的芯片型号较少,且无法前期QSPI Flash调试的问题。本文旨在提供一种通过stm32CubeMX制作external Flash loader的方法。客户可以根据自己的型号,进行定制化的生成。本文中,以某客户实际使用的MCU(STM32H750) 和Fl
[单片机]
ARM笔记:U-Boot之移植 nand-flash 驱动
1、增加nand_flash.c 文件:cpu/arm920t/s3c24x0/nand_flash.c #include #if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY) #include #include DECLARE_GLOBAL_DATA_PTR; #define S3C2410_NFSTAT_READY (1 0) #define S3C2410_NFCONF_nFCE (1 11) #define S3C2440_NFSTAT_READY (1 0) #define S3C2440_NFCONT_nFCE (1 1) st
[单片机]
U-Boot中SMDK2410的NAND Flash驱动
标准的SMDK2410板不支持NAND Flash,启动的时候是这样的: U-Boot 1.1.2 (May 28 2006 - 08:20:50) U-Boot code: 33F80000 - 33F99A14 BSS: - 33F9DB0C RAM Configuration: Bank #0: 30000000 64 MB Flash: 1 MB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial 有NAND支持的多一行(NAND 64MB): U-Boot 1.1.2 (May 28 2006 - 0
[单片机]
[ARM笔记]驱动对设备的识别过程及实例——NAND Flash
驱动程序识别设备时,有以下两种方法: (1)驱动程序本身带有设备信息,比如开始地址、中断号等;加载驱动程序时,就可以根据这些信息来识别设备。 (2)驱动程序本身没有设备信息,但是内核中已经(或以后)根据其他方式确定了很多设备的信息;加载驱动程序时,将驱动程序与这些设备逐个比较,确定两者是否匹配(math)。如果驱动程序与某个设备匹配,就可以通过该驱动程序来操作这个设备了。 内核常使用第二种方法来识别设备,这可以将各种设备集中在一个文件中管理,当开发板的配置改变时,便于修改代码。在内核文件include/linux/platform_device.h中,定义了两个数据结构来表示这些设备和驱动程序:platform_device结
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved