S3C2440 nand_flash驱动程序

发布者:快乐的旅程最新更新时间:2024-08-05 来源: cnblogs关键字:S3C2440  nand_flash  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

129 发出命令0x90            NFCMMD=0X90            mw.b 0x4E000008 0x90

130 发出地址0x00            NFADD=0X00            mw.b 0x4E00000c 0x00

131 读出数据得到0XEC          val=NFDATA            md.b 0x4E000010 1

132 读数据得到device code    val=NFDATA             md.b 0x4E000010 1

133 退出读ID状态            NFCMMD=0xff            mw.b 0x4E000008 0xff

134 

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

136 输入命令: nand dump 0  得到nand

137 

138 选中                    NFCONT的bit1设为0    md.1 0x4E000004 1;    mw.1 0x4e000004 1

139 发出命令0x00            NFCMMD=0X00            mw.b 0x4E000008 0x00

140 

141 发出地址0x00            NFADD=0X00            mw.b 0x4E00000c 0x00

142 发出地址0x00            NFADD=0X00            mw.b 0x4E00000c 0x00

143 发出地址0x00            NFADD=0X00            mw.b 0x4E00000c 0x00

144 发出地址0x00            NFADD=0X00            mw.b 0x4E00000c 0x00

145 发出地址0x00            NFADD=0X00            mw.b 0x4E00000c 0x00

146 

147 发出命令0x30            NFCMMD=0X00            mw.b 0x4E000008 0x30

148 

149 //接下来就是从0地址开始一个字节一个字节的读出数据,和前面nand dump 0 的数据一样

150 读出数据得到0x17          val=NFDATA            md.b 0x4E000010 1

151 读出数据得到0x00          val=NFDATA            md.b 0x4E000010 1

152 读出数据得到0x00          val=NFDATA            md.b 0x4E000010 1

153 

154 退出读状态                NFCMMD=0xff            mw.b 0x4E000008 0xff

155 

156 3.NAND  flash 驱动层次  Atmel_nand.c  Mtdchar.c

157 块设备:        知道怎么优化

158 NAND Flash协议:知道发什么来读写,擦除,识别

159 硬件相关:        知道怎样发命令/地址,读写数据

160 

161 硬件相关:

162 ①分配nand_chip 结构体 

163 ②设置nand_chip 

164 ③硬件相关设备 

165 ④使用 nand_scan / add_mtd_partitions

166 

167 

168 4.ECC校验码  64byte的OOB内存

169 flash每一页都有64B不参与编址,被称为OOB(out of bank)

170 原因是,nand flash的内存中,数据很容易发生位反转,为了防止数据出错,引入了ECC校验,

171 解决:①写一页的数据 ②用这一页的内容生成ECC校验码 ③把ECC校验码写入OOB中

172 读取:①读page ②读OOB里的ECC ③根据page的内容算ECC 

173       ④将算的ECC校验码和读取OOB中的校验码进行校验和校准,可以算出哪一位发生错误。

174 ECC校验码生成:可以硬件也可以软件

175 

176 */


四、增加分区挂接


要增加分区的话,首先要定义mtd_partition结构体,里面定义了分区的名字,起始地址,以及分区的大小等参数。


 1 //定义nand flash的分区

 2 static struct mtd_partition lhy_nand_part[] = {

 3     [0] = {

 4         .name    = 'bootloader',

 5         .size    = 0x40000,

 6         .offset    = 0,

 7     },

 8     [1] = {

 9         .name    = 'params',

10         .offset = MTDPART_OFS_APPEND,  //大小紧跟真前面这个分区

11         .size    = 0x20000,

12     },

13     [2] = {

14         .name    = 'kernel',

15         .offset = MTDPART_OFS_APPEND,  //大小紧跟真前面这个分区

16         .size    = 0x200000,

17     },

18     [3] = {

19         .name    = 'root',

20         .offset = MTDPART_OFS_APPEND,

21         .size    = MTDPART_SIZ_FULL,        //剩余的所有大小

22     },

23 };


接着就是在init函数中添加分区结构体。


1     /* 5.add_mtd_partitions 添加分区 */

2     //如果想整块flash只作为一个分区,使用add_mtd_device就够了

3     //add_mtd_device(lhy_mtd);

4     //如果要创建多个分区的话,那么就要使用add_mtd_partitions

5     add_mtd_partitions(lhy_nand_mtd, lhy_nand_part, 3);

附上驱动程序nand_flash4.c


  1 /* 

  2  * 参考:linux-2.6.31driversmtdnands3c2410.c   atmel_nand.c 

  3  */

  4 

  5 #include

  6 #include

  7 #include

  8 #include

  9 #include

 10 #include

 11 #include

 12 #include

 13 #include

 14 #include

 15 #include

 16 

 17 //寄存器结构体

 18 struct lhy_nand_regs{

 19     unsigned long NFCONF   ; //偏移地址: S3C2410_NFREG(0x00)

 20     unsigned long NFCONT   ; //偏移地址: S3C2410_NFREG(0x04)

 21     unsigned long NFCMD    ; //偏移地址: S3C2410_NFREG(0x08)

 22     unsigned long NFADDR   ; //偏移地址: S3C2410_NFREG(0x0C)

 23     unsigned long NFDATA   ; //偏移地址: S3C2410_NFREG(0x10)

 24     unsigned long NFECCD0  ; //偏移地址: S3C2410_NFREG(0x14)

 25     unsigned long NFECCD1  ; //偏移地址: S3C2410_NFREG(0x18)

 26     unsigned long NFECCD   ; //偏移地址: S3C2410_NFREG(0x1C)

 27     unsigned long NFSTAT   ; //偏移地址: S3C2410_NFREG(0x20)

 28     unsigned long NFESTAT0 ; //偏移地址: S3C2410_NFREG(0x24)

 29     unsigned long NFESTAT1 ; //偏移地址: S3C2410_NFREG(0x28)

 30     unsigned long NFMECC0  ; //偏移地址: S3C2410_NFREG(0x2C)

 31     unsigned long NFMECC1  ; //偏移地址: S3C2410_NFREG(0x30)

 32     unsigned long NFSECC   ; //偏移地址: S3C2410_NFREG(0x34)

 33     unsigned long NFSBLK   ; //偏移地址: S3C2410_NFREG(0x38)

 34     unsigned long NFEBLK   ; //偏移地址: S3C2410_NFREG(0x3C)

 35 };

 36 

 37 static struct nand_chip *lhy_nand;   

 38 static struct mtd_info *lhy_mtd;            //定义一个mtd_info结构体

 39 static struct lhy_nand_regs *lhy_nand_res;    //定义寄存器的结构体指针

 40 

 41 //定义nand flash的分区

 42 static struct mtd_partition lhy_nand_part[] = {

 43     [0] = {

 44         .name    = 'bootloader',

 45         .size    = 0x40000,

 46         .offset    = 0,

 47     },

 48     [1] = {

 49         .name    = 'params',

 50         .offset = MTDPART_OFS_APPEND,  //大小紧跟真前面这个分区

 51         .size    = 0x20000,

 52     },

 53     [2] = {

 54         .name    = 'kernel',

 55         .offset = MTDPART_OFS_APPEND,  //大小紧跟真前面这个分区

 56         .size    = 0x200000,

 57     },

 58     [3] = {

 59         .name    = 'root',

 60         .offset = MTDPART_OFS_APPEND,

 61         .size    = MTDPART_SIZ_FULL,        //剩余的所有大小

 62     },

 63 };

 64 

 65 /* 芯片选择 */

 66 static void lhy_select_chip(struct mtd_info *mtd,int chipnr)

 67 {

 68     if(chipnr == -1){

 69         /* 取消选中,NFCONT[1]设为0 */

 70         lhy_nand_regs->NFCONT |= (1<<1);

 71     }else{

 72         /* 选中:NFCONT[1]设为1 */

 73     lhy_nand_regs->NFCONT &= ~(1<<1);

 74     }

 75 }

 76 //发送命令,地址,数据

 77 static void lhy_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)

 78 {

 79     if (ctrl & NAND_CLE){

 80         /* 发命令 : NFCMMD=dat*/

 81         lhy_nand_regs->NFCMD = cmd;

 82     }else{

 83         writeb(cmd, host->io_base + (1 << host->board->ale));

 84         lhy_nand_regs->NFADDR = cmd;

 85     }

 86 }

 87 //判断状态

 88 static int lhy_dev_ready(struct mtd_info *mtd)

 89 {

 90     return (lhy_nand_regs->NFSTAT & (1<<0));

 91 }

 92 

 93 static int lhy_nand_init(void){

 94     

 95     /* 1.分配一个nand_chip结构体 */

 96     lhy_nand = kzalloc(sizeof(struct nand_chip), GFP_KERNEL);

 97     

 98     lhy_nand_regs = ioremap(0x4E000000,sizeof(struct lhy_nand_regs)); //映射寄存器

 99     /* 2.设置 */

100     /* 2.1设置nand_chip是给nand_scan函数用的,如果不知道怎么设置,先看nand_scan怎么用

101      *         它应该提供:选中,发命令,发地址,发数据,读数据,判断状态等功能

102      */

103     lhy_nand->select_chip = lhy_select_chip;          //选中,芯片选择函数

[1] [2] [3] [4] [5]
关键字:S3C2440  nand_flash  驱动程序 引用地址:S3C2440 nand_flash驱动程序

上一篇:S3C实现DMA驱动程序编写
下一篇:GNU μC/OS-II 在 S3C2440 上中断的实现

推荐阅读最新更新时间:2026-03-23 08:59

S3C2440 nor_flash驱动程序
和前面的nandflash差不多,我们此处来重新学习一下norflash驱动。 1 /* 2 * 参考 driversmtdmapsPhysmap.c 3 */ 4 5 #include linux/module.h 6 #include linux/types.h 7 #include linux/kernel.h 8 #include linux/init.h 9 #include linux/slab.h 10 #include linux/device.h 11 #include linux/platform_device.h 12 #include linu
[单片机]
S3C2440 字符设备驱动程序之LED驱动程序_操作LED(四)
第12课第2.3节 字符设备驱动程序之LED驱动程序_操作LED(四) 写一个点LED的驱动: 一、框架 二、完善、硬件的操作: a.看原理图、确定引脚; b.看2440手册; c.写代码: 单片机:操作物理地址 驱动:用ioremap函数来映射虚拟地址 ★★★ void *ioremap(unsigned long phys_addr, unsigned long size) phys_addr:要映射的物理地址 size:要映射的长度,单位是字节 ioremap是以页为单位进行映射,你的长度写为4,16,32等等,都会映射到4096字节的空间。 ★★★ 下面的代码中:
[单片机]
<font color='red'>S3C2440</font> 字符设备<font color='red'>驱动程序</font>之LED<font color='red'>驱动程序</font>_操作LED(四)
基于S3C2440的nRF2401的接口电路和驱动程序设计
通信频率为2.4GHz 的ISM 频段,由于其免许可证、波长较短、天线的尺寸小、外围器件少等优点,适合于近距离无线通信。将ARM9 与nRF24E1 结合, 可以缩小设备体积, 降低系统功耗, 减少设备间连线困难等问题。针对ARM9 芯片S3C2440 的特点设计了对nFR24E1 的接口电路和驱动程序。对于在狭小空间中,有设备之间的数据共享要求的系统是一种有效解决途径。 2.4GHz 无线设备的使用,免去了系统之间连线的烦恼。一方面可以降低设备的成本,另一方面就是可以简化设备的安装。 特别是对于一些运动部件的实时测量,借助两个无线传输设备,可以将一部分测量设备做到运动部件上,另一部分安装在附近,就可以将运动部件的
[单片机]
基于<font color='red'>S3C2440</font>的nRF2401的接口电路和<font color='red'>驱动程序</font>设计
s3c2440 地址分配讲解
(一)s3c2440 地址分配讲解 (很难很纠结) mini2440的地址怎么分配。mini2440处理器的地址怎么分配。 S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址(也就是0x0000 0000--0x4000 0000)为外设地址空间,外设地址究竟怎么确定的呢??好烦?? 还有一部分为CPU内部使用的特殊功能寄存器地址空间(地址范围为0x4800 0000--0x5FFF FFFF),其余的地址空间没有使用。 下面用两个表格说明外设地址空间好特殊功能寄存器地址空间 3FF FFFF 共 26根地址线,也就是 2^6=64 2^20=1M 那么就是 64M 内存概念: 内存是代码的
[单片机]
<font color='red'>s3c2440</font> 地址分配讲解
uboot在s3c2440上的移植(6)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 10)u-boot利用tftp服务下载内核和利用nfs服务挂载nfs文件系统。 知识点: tftp服务的安装与配置及测试; nfs服务的安装与配置及测试; u-boot到kernel的参数传递(重点)。 我们知道使用tftp下载内核和使用nfs挂载文件系统的好处是,当我们重新编译内核或文件系统后不用重新把这些镜像文件再烧录到flash上,而是把
[单片机]
uboot在<font color='red'>s3c2440</font>上的移植(6)
uboot在s3c2440上的移植(1)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载(还未实现) 1. 了解u-boot主要的目录结构和启动流程,如下图。 u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成
[单片机]
uboot在<font color='red'>s3c2440</font>上的移植(1)
uboot在s3c2440上的移植(3)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand Flash的支持)。 目前u-boot中还没有对2440上Nand Flash的支持,也就是说要想u-boot从Nand Flash上启动得自己去实现了。 首先,在include/configs/my2440.h头文件中定义Nand要用到的宏和寄存器,如下: #gedit in
[单片机]
uboot在<font color='red'>s3c2440</font>上的移植(3)
s3c2440串口裸板驱动(使用fifo)
1:串口的数据发送的数据量较大时,使用fifo可以大大降低MCU的开销。(有点类似串入并出的cput处理模型,本质上还是串行收发) 2:在某些特殊场合,例如制定较复杂的协议时,可以使用fifo特性来做协议简化,比如一包 数据包含8个字节,(并且fifo设置的长度为8),这样相当于把uart转换为类似CAN/以太网模型, 这样信息可扩展性得到了质的提高,当然,这里需要同步协调。 fifo分析拓展: 1. 如果要用中断来处理接收到的数据,就是说,接收完数据然后产生中断,再于中断里处理接收的数据。如果要实现这个本意,要设置好触发点。 至于超时中断之类,那是另外一回事了。 2. 就UART的中断类型
[单片机]
<font color='red'>s3c2440</font>串口裸板驱动(使用fifo)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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