nand flash裸板驱动的基本流程(s3c2440)
发布时间:2020-12-15 06:42:55 所属栏目:百科 来源:网络整理
导读:?********************************************************* nand flash裸板驱动的基本流程(s3c2440) ********************************************************* NAND FLASH的工作模式 ①自动启动模式 ②NAND FLASH 模式(软件) 一、自动启动模式:(
?*********************************************************
nand flash裸板驱动的基本流程(s3c2440) ********************************************************* NAND FLASH的工作模式 ①自动启动模式 ②NAND FLASH 模式(软件) 一、自动启动模式:(auto boot) 1、H/W set 硬件配置 2、复位之后,NAND FLASH的最先4KB的,代码被复制到stepping stone中。stepping stone为内部SRAM(4Kbytes) 3、stepping stone 被映射为Bank0(nGS0),且CPU在此4KB内部SRAM中开始执行启动代码(Bootloader) 【注】启动之后 stepping stone 可用于其他用途。 由于NAND FLASH的特殊结构和寻址方式(串行),使得无法在NAND FLASH上执行代码。因此,在程序开始时,需将 NAND FLASH上的代码复制到SDRAM中,之后程序在SDRAM中执行。复制的任务是在stepping stone中完成的,也就 是NAND FLASH 中的最开始4KB程序的任务 另外,2440A的Memory Map中,只有BANK6/7可以映射SDRAM,最大容量为128M*2=256MB 当main代码总量超过这个值时(256MB),就不能采用NAND FLASH启动模式。只能使用Nor FLASH启动【OM[1:0]=01,10】 同样与硬件的使用情况有关。 二、NAND FLASH(软件)模式: ========================================================================? ?? ?? ?? ?? ?? ?? ?? ? NAND FLASH初始化======================================================================== 1.NFCONF[0x4E000000] TACLS? ?? ?? ?? ?? ?[14:12]? ?CLE&ALE duration = HCLK*TACLS? ? TWRPH0? ?? ?? ?? ???[10:8]? ? TWRPH0 duration = HCLK*(TWRPH0+1) TWRPH1? ?? ?? ?? ???[6:4]? ???TWRPH1 duration = HCLK*(TWRPH1+1) AdvFlash(R)? ?? ?? ?[3]? ?? ? Advanced NAND,0:256/512,1:1024/2048 PageSize(R)? ?? ?? ?[2]? ?NAND memory page size ? ?? ?? ?? ?? ?? ?? ?? ?? ?when [3]==0,0:256,1:512 bytes/page. ? ?? ?? ?? ?? ?? ?? ?? ?? ?when [3]==1,0:1024,1:2048 bytes/page. AddrCycle(R)? ?? ???[1]? ? NAND flash addr size ? ?? ?? ?? ?? ?? ?? ?? ?? ?when [3]==0,0:3-addr,1:4-addr. ? ?? ?? ?? ?? ?? ?? ?? ?? ?when [3]==1,0:4-addr,1:5-addr. BusWidth(R/W)? ?? ? [0]? ?NAND bus width. 0:8-bit,1:16-bit. 2.NFCONT[0x4E000004] Lock-tight? ?? ?? ? [13]??0:Disable lock,1:Enable lock. Soft Lock? ?? ?? ???[12] 0:Disable lock,1:Enable lock. EnablillegalAcINT? ?[10] Illegal access interupt control. 0:Disable,1:Enable ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???当soft lock 或者lock-tight置一时, ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? NAND FLASH可用区域被锁定 ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?其范围为NFSBLK[0x4E000038]和NFEBLK[0x4E00003C]-1指定的区域 ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?凡是对可用区域以外的访问都是illegal access EnbRnBINT? ?? ?? ???[9]??RnB interrupt. 0:Disable,1:Enable RnB_TrandMode? ?? ? [8]??RnB transition detection config. 0:Low to High,1:High to Low SpareECCLock? ?? ???[6]??0:Unlock,1:Lock MainECCLock? ?? ?? ?[5]??0:Unlock,1:Lock InitECC(W)? ?? ?? ? [4]??1:Init ECC decoder/encoder. Reg_nCE? ?? ?? ?? ? [1]??0:nFCE=0,1:nFCE=1. NANDC Enable? ?? ???[0]??operating mode. 0:Disable,1:Enable. ===================================================================== ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???读取NAND FLASH ID ===================================================================== 1.NFChipEn();? ?? ?? ?? ?? ???//使能NAND FLASH 2.WrNFCmd(RdIDCMD);? ?? ?? ???//读取ID指令RdIDCMD=0x90 3.WrNFAddr(0);? ?? ?? ?? ?? ? //写入地址,必须是00h 4.While(NFIsBusy());? ?? ?? ? //等待NFSTAT:0=0 5.id=RdNFDat()>8);? ?? ? //写入A17~A24 ? ?if(NandAddr)? ?? ?? ?//如果NAND FLASH容量>32M NandAddr=1否则NandAddr=0 ? ???WrNFAddr(addr>>16);//NAND FLASH>32MB,写入A25 ? ?? ?? ?? ?? ?? ?? ?? ?//当NAND FLASH32MB时,page地址线有17根(A9~A25) 5.WrNFCmd(ERASECMD1);? ?//块擦除指令EARSECMD1=0xd0【2nd cycle】 6.NFChipDs();? ?? ?? ???//NAND FLASH除能 ======================================================================== ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?NAND FLASH页读取 ======================================================================== 1.NFChipEn();? ?? ?? ?? ???//NAND FLASH使能 2.WrNFCmd(READCMD0)? ?? ???//读取指令READCMD0=0x0 3.WrNFAddr(0);? ?? ?? ?? ? //由于读页,所以地址页对准,A0~A7=00H ??WrNFAddr(addr);? ?? ?? ? //写入地址A9~A16 ??WrNFAddr(addr>>8);? ?? ? //写入地址A17~A24 ??if(NandAddr) ? ?? ?WrNFAddr(addr>>16);??//NAND FLASH>32MB,写入地址A25 4 InitEcc();? ?? ???//reset Ecc:rNFCONT|=(1>8);? ???//写入地址A17~A24 ? ?if(NandAddr) ? ?? ?WrNFAddr(addr>>16); //NAND FLASH>32MB时,写入A25 4.InitEcc();? ?? ?? ?? ???//reset ECC 5.MEccUnlock();? ?? ?? ???//MEccUnlock: rNFCONT&=~(1>8)&0xff; ??tmp2=(mecc>>16)&0xff; ??tmp3=(mecc>>24)&0xff; ??tmp5=0xff;? ?? ?? ?? ???//0xff将作为good block标识,储存在spare area 9.SEccUnlock();? ?? ?? ???//SEccUnlock:rNFCONT&=~(1>8);? ?? ? //写入地址A17~A24 ? ?if(NandAddr) ? ?? ? WrNFAddr(addr>>16);??//NAND FLASH>32MB,写入A25 5.NFWaitBusy();? ?? ?? ?? ? //延时+等待NFSTAT:0=0 ? ?? ?? ?? ?? ?? ?? ?? ?? ? //也可以通过NAND状态读取来查询状态 ? ?? ?? ?? ?? ?? ?? ?? ???//【注意】等待的子程序中不能有READCMD0等指令写入, ? ?? ?? ?? ?? ?? ?? ?? ?? ? //否则pointer指向A块 6.data=RdNFDat();? ?? ?? ???//读取data=NFDATA[0x4E000010] 7.WrNFCmd(READCMD0); //读取指令READCMD0=0x0,pointer指向A块(1st main area) 8.NFChipDs();? ?? ?? ?? ?? ?//NAND FLASH除能 若data!=0xff,则当前块(addr)为坏块。 ======================================================================== 本文来自ChinaUnix博客,如果查看原文请点: http://blog.chinaunix.net/u3/96362/showart_2113251.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |