NAND Flash驱动

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

硬件原理及分析

管脚说明

   

   

Pin Name

Pin Function

R/B(RnB)

The R/B output indicates the status of the device operation. When low, it indicates that a program, erase or random read

operation is in process and returns to high state upon completion. It is an open drain output and does not float to high-z condition when the chip is deselected or when outputs are disabled.

CLE(CLE)

The CLE input controls the activating path for commands sent to the command register. When active high, commands are

latched into the command register through the I/O ports on the rising edge of the WE signal.

CE(nFCE)

The CE input is the device selection control. When the device is in the Busy state, CE high is ignored, and the device does

not return to standby mode in program or erase operation.

ALE(ALE)

The ALE input controls the activating path for address to the internal address registers. Addresses are latched on the rising

edge of WE with ALE high.

WE(nFWE)

The WE input controls writes to the I/O port. Commands, address and data are latched on the rising edge of the WE pulse.

RE(nFRE)

The RE input is the serial data-out control, and when active drives the data onto the I/O bus. Data is valid tREA after the falling

edge of RE which also increments the internal column address counter by one.

I/O(LDATA0-LDATA7)

The I/O pins are used to input command, address and data, and to output data during read operations. The I/O pins float to

high-z when the chip is deselected or when the outputs are disabled.

   

在U-BOOT上操作Nand Flash

NAND FLASH S3C2440

发命令 选中芯片

CLE设为高电平 NFCMMD=命令值

在DATA0~DATA7上输出命令值

发出一个写脉冲

 

发地址 选中芯片 NFADDR=地址值

ALE设为高电平

在DATA0~DATA7上输出地址值

发出一个写脉冲

   

发数据 选中芯片 NFDATA=数据值

ALE,CLE设为低电平

在DATA0~DATA7上输出数据值

发出一个写脉冲

   

读数据 选中芯片 val=NFDATA

发出读脉冲

读DATA0~DATA7的数据

   

 

OpenJTAG> help md

md [.b, .w, .l] address [# of objects]

- memory display

   

OpenJTAG> help mw

mw [.b, .w, .l] address value [count]

- write memory

•b        1字节

•W        2字节

•l        4字节

 

   

1. 读ID

S3C2440

u-boot

选中 NFCONT的bit1设为0

md.l 0x4E000004 1; mw.l 0x4E000004 1

发出命令0x90 NFCMMD=0x90

mw.b 0x4E000008 0x90

发出地址0x00 NFADDR=0x00

mw.b 0x4E00000C 0x00

读数据得到0xEC val=NFDATA

md.b 0x4E000010 1

读数据得到device code val=NFDATA

md.b 0x4E000010 1

退出读ID的状态 NFCMMD=0xff

mw.b 0x4E000008 0xff

 

2. 读内容: 读0地址的数据

使用UBOOT命令:

nand dump 0

Page 00000000 dump:

17 00 00 ea 14 f0 9f e5 14 f0 9f e5 14 f0 9f e5

   

S3C2440

u-boot

选中 NFCONT的bit1设为0

md.l 0x4E000004 1; mw.l 0x4E000004 1

发出命令0x00 NFCMMD=0x00

mw.b 0x4E000008 0x00

发出地址0x00 NFADDR=0x00

mw.b 0x4E00000C 0x00

发出地址0x00 NFADDR=0x00

mw.b 0x4E00000C 0x00

发出地址0x00 NFADDR=0x00

mw.b 0x4E00000C 0x00

发出地址0x00 NFADDR=0x00

mw.b 0x4E00000C 0x00

发出地址0x00 NFADDR=0x00

mw.b 0x4E00000C 0x00

发出命令0x30 NFCMMD=0x30

mw.b 0x4E000008 0x30

读数据得到0x17 val=NFDATA

md.b 0x4E000010 1

读数据得到0x00 val=NFDATA

md.b 0x4E000010 1

读数据得到0x00 val=NFDATA

md.b 0x4E000010 1

读数据得到0xea val=NFDATA

md.b 0x4E000010 1

退出读状态 NFCMMD=0xff

mw.b 0x4E000008 0xff

   

ECC的作用

 

 

 

S3C2440-Nand Flash Controller Register

 

   

S3C2440-Nand Flash Memory Timing

   

K9F2G08U0C-Key Characteristic

   

K9F2G08U0C-Operation Timing

   

   

驱动程序

driver.c

1 /*
2 * SAMSUNG: K9F2G08U0C
3 * 参考:
4 * .linux-2.6.22.6driversmtdnands3c2410.c
5 * .linux-2.6.22.6driversmtdnandat91_nand.c
6 */
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18         
19 #include
20 #include
21 #include
22 #include
23         
24 #include
25         
26 #include
27 #include
28
29 struct regs_nand {
30         unsigned long         NFCONF;                
31         unsigned long        NFCONT;                 
32         unsigned long        NFCMMD;                 
33         unsigned long        NFADDR;                 
34         unsigned long        NFDATA;
35         unsigned long        NFMECCD0;
36         unsigned long        NFMECCD1;
37         unsigned long        NFSECCD;
38         unsigned long        NFSTAT;
39         unsigned long        NFESTAT0;         
40         unsigned long        NFESTAT1;
41         unsigned long        NFMECC0;                
42         unsigned long        NFMECC1;                        
43         unsigned long        NFSECC;                 
44         unsigned long        NFSBLK;                 
45         unsigned long        NFEBLK;
46 };
47
48 static struct nand_chip *nand;
49 static struct mtd_info *mtd;
50 static struct regs_nand *regs_nand;
51
52 //分区信息
53 static struct mtd_partition nand_parts[] = {
54         [0] = {
55                 .name         = 'bootloader',                        
56                 .size         = 0x00040000,                        
57                 .offset = 0,                                        /* offset within the master MTD space */
58         },
59
60         [1] = {
61                 .name         = 'params',                        
62                 .offset = MTDPART_OFS_APPEND,        //紧跟着上一个分区的大小
63                 .size         = 0x00020000,                        
64         },
65
66         [2] = {
67                 .name         = 'kernel',                                
68                 .offset = MTDPART_OFS_APPEND,        //紧跟着上一个分区的大小
69                 .size         = 0x00200000,                        
70         },
71
72         [3] = {
73                 .name         = 'root',                                
74                 .offset = MTDPART_OFS_APPEND,        //紧跟着上一个分区的大小
75                 .size         = MTDPART_SIZ_FULL,                
76         },
77 };
78
79 static void nand_select_chip(struct mtd_info *mtd, int chipnr)
80 {
81         if (chipnr == -1)
82         {
83                 //取消选中:NFCONT[1]:0
84                 regs_nand->NFCONT |= (1<<1);
85         }
86         else {
87                 //选中:NFCONT[1]:1
88                 regs_nand->NFCONT &= ~(1<<1);
89         }
90         return;
91 }
92
93 static void nand_cmd_ctrl(struct mtd_info *mtd, int dat, unsigned int ctrl)
94 {
95         if (ctrl & NAND_CLE)
96         {
97                 //发命令:NFCMMD=dat
98                 regs_nand->NFCMMD = dat;
99         }
100         else
101         {
102                 //发地址:NFADDR=dat
103                 regs_nand->NFADDR = dat;
104         }
105         return;
106 }
107
108 static int nand_dev_ready(struct mtd_info *mtd)
109 {
110         return (regs_nand->NFSTAT & (1<<0));
111 }
112
113
114 /* 1 出、入口函数 */
115 static int __init nand_init(void)
116 {
117         struct clk *clk;
118
119         /* 2 分配一个nand_chip结构体 */
120         nand = kzalloc(sizeof(struct nand_chip), GFP_KERNEL);
121         /******** 2 end ********/
122
123         regs_nand = ioremap(0x4E000000, sizeof(struct regs_nand));
124
125         /* 3 设置:nand_chip */
126         //提供:选中、发命令、发地址、发数据、读数据、判断状态的功能
127         nand->select_chip         = nand_select_chip;                //片选
128         nand->cmd_ctrl                = nand_cmd_ctrl;                //发命令
129         nand->IO_ADDR_R                = ®s_nand->NFDATA;        //读
130         nand->IO_ADDR_W                = ®s_nand->NFDATA;        //写
131         nand->dev_ready                = nand_dev_ready;                //Flash 状态(忙/空闲)
132         nand->ecc.mode                = NAND_ECC_SOFT;                //ecc软件校验
133         /******** 3 end ********/
134
135         /* 4 硬件相关的操作:时序 */
136         //使能时钟
137         clk = clk_get(NULL, 'nand');
138         clk_enable(clk);
139         
140 #define TACLS        0
141 #define TWRPH0        1
142 #define TWRPH1        0
143         //时间参数设置
144         regs_nand->NFCONF        = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
145
146         //控制---使能nand flash控制器,取消片选
147         regs_nand->NFCONT        = (1<<0) | (1<<1);
148         /******** 4 end ********/
149         
150
151         /* 5 使用:nand_scan */
152         mtd = kzalloc(sizeof(struct mtd_info), GFP_KERNEL);
153         mtd->owner        = THIS_MODULE;
154         mtd->priv        = nand;                //私有数据
155         
156         nand_scan(mtd, 1);                //识别nand_flash,构造mtd_info结构体
157         /******** 5 end ********/
158
159
160         /* 6 添加分区:add_mtd_partitions */
161         add_mtd_partitions(mtd, nand_parts, 4);
162
163         //不分区的情形
164         //add_mtd_device(mtd);
165         /******** 6 end ********/
166
167         return 0;
168 }
169
170 static void __exit nand_exit(void)
171 {
172         del_mtd_partitions(mtd);
173         kfree(nand);
174         kfree(mtd);
175         iounmap(regs_nand);
176         return;
177 }
178
179 module_init(nand_init);
180 module_exit(nand_exit);
181 MODULE_LICENSE('GPL');
182 /******** 1 end ********/

[1] [2]
关键字:NAND  Flash驱动  S3C2440 引用地址:NAND Flash驱动

上一篇:中断和异常
下一篇:NOR Flash驱动

推荐阅读最新更新时间:2024-11-13 16:51

东芝在闪存峰会上展示最新NAND和存储产品
东京—东芝公司 (TOKYO:6502)今天宣布,该公司在闪存峰会(Flash Memory Summit)上展示其最新的NAND闪存和存储产品。闪存峰会是全球最大的闪存讨论会,于8月5至7日在美国加州圣塔克拉拉市的圣塔克拉拉会议中心(Santa Clara Convention Center)举行。 闪存峰会的展览环节在会议的最后两天8月6日和7日举行,东芝在504号展位布展。 主要展品 企业级固态硬盘(eSSD): 企业级读密集型SSD PX03SN/HK3R系列 应用于服务器的高读取率IOPS的SSD PX03SN系列展示 消费级固态硬盘(cSSD): 高端消费级SSD HG6系列 采用TLC NAND闪存的消费级SSD
[嵌入式]
s3c2440裸机-nandflash编程(一. nandflash原理及结构简介)
1.nandflash的原理图如下: 引脚属性见下表: 引脚名称 引脚功能 IO0~IO7 数据输入输出(命令、地址、数据共用数据总线) CLE 命令使能 ALE 地址使能 /CE 芯片使能(片选) /RE 读使能 /WE 写使能 R/B 就绪/忙输出信号(低电平表示操作还在进行中,高电平表示操作完成) 2.nandflash内部存储结构 nandflash内部存储结构如下: 我们常见的Nand Flash,内部只有一个chip,每个chip只有一个plane。但也有些复杂的,容量更大的Nand Flash,内部有多个chip,每个chip有多个plane,这类的Nand Flash,其实就是多了一
[单片机]
<font color='red'>s3c2440</font>裸机-nandflash编程(一. nandflash原理及结构简介)
SK 海力士公布新NAND Flash 发展规划,800+层,200TB 容量
目前,两大韩系NAND Flash 厂商──三星及SK 海力士在之前就已经公布了新NAND Flash 产品的发展规划。其中,三星宣布推出136 层堆叠的第6 代V-NAND Flash 之外,SK 海力士则是宣布成功开发出128 层堆叠的4D NAND Flash,并已经进入量产阶段。不过,虽然两家厂商竞相推出NAND Flash 的新产品,但是堆叠技术的发展至今仍未到达极限。所以,SK 海力士日前在一场会议上就公布了公司的规划,预计在2030 年推出800+ 层的NAND Flash,届时将可轻松打造出100 到200TB 容量的SSD。 在日前举行的「 Flash Memory Summit 」 大会上,SK 海
[嵌入式]
SK 海力士公布新<font color='red'>NAND</font> <font color='red'>Flash</font> 发展规划,800+层,200TB 容量
s3c2440裸机-UART编程(二、UART编程实现)
UART编程 1.初始化 我们的2440支持3个UART串口,以uart0为例讲解。 那么我们需要实现以下这几个函数完成串口的最基本功能: (1)uart0_init()用于初始化串口 (2)putchar()用于发送一个字符 (3)getchar()用于接收一个字符 (4)puts()用于发送一串字符 1.uart0_init() 1.配置uart0引脚 (1)根据原理图GPH2,3用于TxD0, RxD0。 (2)查看dataset,配置GPH控制寄存器,让GPH2,3配成uart模式;为了将其保持为高电平,先设置其为上拉。 GPHCON &= ~((3 4) | (3 6)); GPHCON |= ((2 4) | (
[单片机]
<font color='red'>s3c2440</font>裸机-UART编程(二、UART编程实现)
内存 Q3 景气,DRAM 乐观、NAND 有杂音
DRAM 厂南亚科将于 17 日召开法人说明会,市场预料,南亚科可望释出正面讯息,第 3 季 DRAM 市况将持续乐观。 反观另一内存 NAND Flash 市况则恐有杂音。 内存市场去年出现动态随机存取内存(DRAM)与储存型闪存(NAND Flash)齐旺的罕见情况,今年来两大内存市况不同调,价格出现分歧走势。 DRAM 市场今年来供需持续健康,产品价格延续扬升走势,NAND Flash 市场需求则是趋缓,产品价格回调修正。 南亚科第 2 季即在 DRAM 销售价量齐扬下,营运表现亮丽,业绩逐月改写历史新高纪录,季营收达新台币 245.92 亿元,季增达 30.8% ,并刷新单季业绩历史新高纪录。 内存模块厂威刚今年上半年靠着
[手机便携]
s3c2440——Nandflash
简介:   Nandflash与计算机的硬盘类似,用于保存系统运行所必须的操作系统、用户数据、运行过程等各类数据。并且在Nandflash中的数据在掉电后仍可永久保存。 一、目标芯片(K9F1208U0M)   1、此芯片为三星公司生产的容量为64MB。(下图为网上图片、非本人原创)。由下图可以看出,1page = 528byte(其中Data feild = 512bytes、spare = 16bytes)。 1 block = 32 pages = 32 * 528byte。其中可以存储数据的是 (32 * 512byte) = 16KB。然而此芯片有4096个block。所以此芯片的容量可以计算得出:(4096 * 3
[单片机]
<font color='red'>s3c2440</font>——Nandflash
ARM 开发板 NAND FLASH空间不足解决方法
由于FL2440自带128M 的NAND flash,而分给Linux文件系统的只有60M,由于系统中有许多库文件,导致文件系统过大。 可以有两种解决方案: 1、修改bootloader和内核源代码中有关分区的信息,删除Windows CE分区,重新编译bootloader和内核,当然这样比较麻烦可以参考 http://blog.csdn.net/ll_0520/archive/2010/12/25/6098565.aspx 这需要有心理准备,很可能会遇到很多麻烦,当然解决麻烦也是锻炼动手能力的一个过程。 2、将文件系统中一些有关QT界面的库文件如:/usr/lib目录以NFS的形式挂载,这样可以节省出20M的空间 具
[单片机]
美光减少供货,NAND Flash要涨价
    韩国NAND Flash大厂三星及SK海力士,4月以来减少供货,市场原冀望美大厂美光(Micron)可释出更多货源,但美光5月底未如预期释出货源,连日本东芝6月底季底作帐期间也未增加供货,让模块厂及通路商跌破眼镜,不得不在7月开始追货。      MLC、TLC规格NAND Flash芯片同步缺货,通路业者已打算提前涨价,初估7月上旬32Gb MLC/TLC价格将上涨到3.8~4美元以上,64Gb则上看5.5~6美元,平均涨幅至少达一成,对于NAND营收占比较高的创见、广颖、劲永等模块厂,第3季营运是旺上加旺。      第2季是NAND Flash传统淡季,但受到韩系NAND厂减少供货影响,价格并未出现淡季下跌效应。三星及
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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