LCD实验学习笔记(七):NAND FLASH

s3c2440 CPU内置NAND FLASH控制器。相关寄存大器起始地址为0x4e000000。

通过设置NFCONF寄存器,设置NAND FLASH 时序。

通过设置NFCONT寄存器,使能NAND FLASH、初始化ECC等。

代码:



#define GSTATUS1 (*(volatile unsigned int *)0x560000B0) //读此寄存器可以知道CPU芯片型号
#define BUSY 1

#define NAND_SECTOR_SIZE_LP 2048 //大页每页2048字节
#define NAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1) //大页掩码???

typedef unsigned int S3C24X0_REG32;

//s3c2440 NAND FLASH相关寄存器
typedef struct {
  S3C24X0_REG32 NFCONF;
  S3C24X0_REG32 NFCONT;
  S3C24X0_REG32 NFCMD;
  S3C24X0_REG32 NFADDR;
  S3C24X0_REG32 NFDATA;
  S3C24X0_REG32 NFMECCD0;
  S3C24X0_REG32 NFMECCD1;
  S3C24X0_REG32 NFSECCD;
  S3C24X0_REG32 NFSTAT;
  S3C24X0_REG32 NFESTAT0;
  S3C24X0_REG32 NFESTAT1;
  S3C24X0_REG32 NFMECC0;
  S3C24X0_REG32 NFMECC1;
  S3C24X0_REG32 NFSECC;
  S3C24X0_REG32 NFSBLK;
  S3C24X0_REG32 NFEBLK;
} S3C2440_NAND;

static S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;//s3c2440 Nand flash 相关寄存器起始地址

//供外部调用的函数声明
void nand_init(void); //初始化
void nand_read(unsigned char *buf, unsigned long start_addr, int size);//读取数据到缓冲区

/* S3C2440的NAND Flash处理函数 */
static void s3c2440_nand_reset(void);
static void s3c2440_wait_idle(void);
static void s3c2440_nand_select_chip(void);
static void s3c2440_nand_deselect_chip(void);
static void s3c2440_write_cmd(int cmd);
static void s3c2440_write_addr_lp(unsigned int addr);
static unsigned char s3c2440_read_data(void);

//复位
static void s3c2440_nand_reset(void)
{
  s3c2440_nand_select_chip();//选片选
  s3c2440_write_cmd(0xff); //复位命令
  s3c2440_wait_idle(); //等待就绪
  s3c2440_nand_deselect_chip(); //取消片选
}

//等待就绪信号
static void s3c2440_wait_idle(void)
{
  int i;
  volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFSTAT;
  //最后一位为1表示忙,忙就一直等
  while (!(*p & BUSY))
  for (i = 0; i < 10; i++);
}

//片选
static void s3c2440_nand_select_chip()
{
  s3c2440nand->NFCONT &= ~(1 << 1); //NFCONT寄存器[1]位Reg_nCE置0
  int i ;
  for (i = 0; i < 10; i++); //等待片选?
}

//取消片选
static void s3c2440_nand_deselect_chip()
{
  s3c2440nand->NFCONT |=(1<<1); //NFCONT寄存器[1]位Reg_nCE置1
}

//发送命令
static void s3c2440_write_cmd(int cmd)
{
  volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFCMD; //p指向NFCMD寄存器
  *p = cmd; //命令写入命令寄存器
}

//发送地址
static void s3c2440_write_addr_lp(unsigned int addr)
{
  int i;
  volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
  int col, page;
  col = addr & NAND_BLOCK_MASK_LP; //得到页内地址。 每页2K,页内地址为bit[0-10]
  page = addr / NAND_SECTOR_SIZE_LP; //得到页号。256M为2的28次方,地址总位数为27,即bit[11-27]为页号,共17位
  *p = col & 0xff; //地址后8位 ,A0-A7;
  for (i = 0; i < 10; i++);
  *p = (col >> 8) & 0x0f; //A8-A10
  for (i = 0; i < 10; i++);
  *p = page & 0xff; //页号后后位 A11-A18
  for (i = 0; i < 10; i++);
  *p = (page >> 8) & 0xff;//A19-A26
  for (i = 0; i < 10; i++);
  *p = (page >> 16) & 0x1; //A27
  for (i = 0; i < 10; i++);}

//读数据
static unsigned char s3c2440_read_data(void)
{
  volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFDATA;
  return *p;
}

//初始化Nand Flash
void nand_init(void)
{
  //设置时序
  //这里假设cpu频率100MHz,即一个时钟周期为10ns
  #define TACLS 0
  #define TWRPH0 3 //nand flash手册 twp最低要求12ns,即2个时钟周期以上,所以这里可以取1的,3可以保证400MHz时可用
  #define TWRPH1 0 //nand flash手册 tCLH最低要求5ns,取值0要求CPU频200Mhz以下
  s3c2440nand->NFCONF = (TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4);
  //使能Nand Flash,禁止片选,初始化ECC
  s3c2440nand->NFCONT = (1 << 4) | (1 << 1) | (1 << 0);
  s3c2440_nand_reset(); //复位
}

//读数据
void nand_read(unsigned char *buf, unsigned long start_addr, int size)
{
  //Nand Flash的读取单位最小是page,长度必须是page的整数倍。所以必须对齐
  if ((start_addr & NAND_BLOCK_MASK_LP)||(size & NAND_BLOCK_MASK_LP))
  {
    return;
  }
  s3c2440_nand_select_chip();//发出片选信号

  int i, j;
  for (i = start_addr; i < (start_addr+size);)
  {
    s3c2440_write_cmd(0); //发出READ0命令
    s3c2440_write_addr_lp(i);
    s3c2440_write_cmd(0x30);
    s3c2440_wait_idle();
    //读取页数据
    for ( j = 0; j <NAND_SECTOR_SIZE_LP;j++,i++)
    {
      *buf = s3c2440_read_data();
      buf++;
    }

  }

  s3c2440_nand_deselect_chip();//取消片选
}



LCD实验学习笔记(七):NAND FLASH

时间: 2024-12-23 02:31:33

LCD实验学习笔记(七):NAND FLASH的相关文章

LCD实验学习笔记(八):中断控制器

s3c2440有60个中断源(其中15个为子中断源). 程序状态寄存器(PSR)的F位设为1,禁用快速中断(FRQ). 程序状态寄存器(PSR)的I位设为1,禁用普通中断(IRQ). 相反,PSR寄存器F位为0开FRQ中断,I位为0开IRQ中断. s3c2440中断控制器中有五个控制寄存器:中断源等待寄存器(SRCPND),中断模式寄存器(INTMOD),屏蔽寄存器(INTMSK),优先级寄存器(PRIORITY),中断等待寄存器(INTPND). SRCPND寄存器各位对应不同的中断,其中外部

TQ2440 学习笔记—— 7、NOR Flash 和 NAND Flash

非易失闪速存储器Flash 具有速度快.成本低.密度大的特点. Flash 存储器主要有 NOR Flash 和 NAND Flash两种类型,总的来说, NOR 型比较适合存储程序代码,NAND 型则可用做大容量数据存储. 1.NOR 型 Flash 存储器 NOR Flash 技术是由Intel 公司于1988年首先开发,它的出现彻底改变了原先由EPROM和EEPROM一统天下的局面. NOR 的特点是芯片内执行(XIP,eXecute In Place),这样应用程序就可以直接在Flash

Nand Flash原理(二)

K9F2G08U0B的存储阵列 图 2-1 K9F2G08U0B的存储阵列 由图2-1,我们可以知道:K9F2G08U0B的一页为(2K+64)字节(2K 表示的是 main 区容量,64表示的是 spare 区容量),它的一块为 64 页,而整个设备包括了2048个块.这样算下来一共有 2112M 位容量,如果只算 main 区容量则有256M 字节(即 256M×8 位). 要实现用 8 个 IO 口来要访问这么大的容量,如图 2-1 所示:K9F2G08U0A 规定了用 5 个周期来实现.

nand Flash原理

6.1.3) Block 块 一个 Nand Flash (的 chip,芯片) 由很多个块(Block)组成,块的大小一般是 128KB, 256KB, 512KB,此处是 128KB.其他的小于 128KB 的,比如 64KB,一般都是下面将要介绍到的small block的Nand Flash. 块 Block,是Nand Flash的擦除操作的基本/最小单位. 6.1.4) Page 页 每个块里面又包含了很多页(page) .每个页的大小,对于现在常见的Nand Flash多数是2KB

硬件初始化,nand flash固化操作,系统启动简单流程

2015.3.27星期五 晴 链接脚本定义代码的排放顺序 硬件系统初始化:一:arm核初始化:(里面有指令)初始化ARM核的时候需要看arm核的手册指令:1.异常向量(最起码有个复位异常,初始化模式-svc) ldr r0, =_start mcr p15, 0, r0, c12, c0, 0 2.处理器模式-SVC3.关闭中断 mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 @1101 0011 //关闭irq,fiq和设置SVC msr cp

u-boot-2014.10移植第25天----nand flash启动(三)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 在实现u-boot从nand flash启动之前,我们将前面asm_led程序放在nand flash第一个块的前4Kbit之中,因为asm_led没有系统初始化功能,所以还需要将bootstrap程序,放在nand flash的0地址处.bootstrap初始化完2440后,跳转到asm_led程序去执行.这对于掌握从n

(三)NAND flash和NOR flash的区别详解

我们使用的智能手机除了有一个可用的空间(如苹果8G.16G等),还有一个RAM容量,很多人都不是很清楚,为什么需要二个这样的芯片做存储呢,这就是我们下面要讲到的.这二种存储设备我们都统称为“FLASH”,FLASH是一种存储芯片,全名叫Flash EEPROM Memory,通地过程序可以修改数据,即平时所说的“闪存”.Flash又分为NAND flash和NOR flash二种.U盘和MP3里用的就是这种存储器. 相“flash存储器”经常可以与相“NOR存储器”互换使用.许多业内人士也搞不清

nor flash和nand flash的区别

NOR和NAND是现在市场上两种主要的非易失闪存技术.Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面.紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级.一.存储数据的原理两种闪存都是用三端器件作为存储单元,分别为源极.漏极和栅极,与场效应管的工作原理相同,主要是利用电场的效应来控制源极与漏极之间的通断,栅极的电流消耗极小,不同的是场效应管为单栅极结构,而

【详解】如何编写Linux下Nand Flash驱动

From: http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 版本:v2.2 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开始介绍Linux下面和Nand Flash相关的软件架构MTD的相关知识,最后介绍了