[ZLG-ARM] s3c2410/s3c2440对nandflash的读写操作

[复制链接]
2928|1
 楼主| xamic 发表于 2009-6-3 13:40 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;折腾了两三天终于搞定了s3c2440对nandflash的读写操作,s3c2410对nandflash的读写操作资料比较多而s3c2440的资料比较少,两款芯片在nandflash寄存器上有较大的变化,不能通用,需对照datasheet修改。&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面讲一下实验过程:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;试验目的:使nandflash开始4k代码完成将4k以后代码copy到sdram内运行的功能。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;试验内容:采用朗成AT2440EVB-I型开发板,nandflash启动跳线1,3,4在on位置,将head.s和init.c(主要完成初始化,nandflash读写,从nandflash到sdram的代码copy)写入nandflash起始地址(启动地址0x0000),将main.c(完成点亮LED的功能)存放到nandflash的4096地址,但使其在0x30000000(就是sdram的首地址)运行,这就需要nandflash启动后4k的代码将4096起始的代码copy到0x30000000运行。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;过程:本来是有源代码的,但那是用在s3c2410上的,将其直接用到AT2440EVB-I型开发板上,失败。将2410和2440datasheet对照一看才知道寄存器有了很大变化,直接用是肯定不行的。查资料才知道2440的nandflash操作资料很少(好像2440的资料都很少,2410比较多),最后查到两个,一个是u-boot在2440上的移植,其中有从nandflash启动的读写函数(copy自vivi),另一个就是AT2440EVB-I型开发板自带的ATBOOT中nand_read.c,对照看了一下差不多,根据这两个资料改写init.c之后还是失败。只好又找资料将“nandflash读写操作”的原理搞清楚了(之前一直没搞清楚代码,只是拿过来用)。再看2410上的代码,发现2440上的少了nandflash的初始化函数,对照datasheet改写寄存器后,led终于亮了。^_^&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3c2410对nandflash读写操作寄存器配置的流程:&nbsp;<br /><br />1.初始化<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NFCONF=(1&lt&lt15)|(1&lt&lt14)|(1&lt&lt13)|(1&lt&lt12)|(1&lt&lt11)|(TACLS&lt&lt8)|(TWRPH0&lt&lt4)|(TWRPH1&lt&lt0);或NFCONF&nbsp;=&nbsp;0xf830;&nbsp;<br /><br />(1)enable&nbsp;NAND&nbsp;flash&nbsp;controller(15位)<br /><br />(2)initialize&nbsp;ECC(12位)<br /><br />(3)chip&nbsp;disable(11位),使用时再chip&nbsp;enable&nbsp;<br /><br />(4)设置TACLS=0、TWRPH0=3、TWRPH1=0&nbsp;//2440采用默认值即可<br /><br />2.复位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />(1)NFCONF&nbsp;&=&nbsp;~0x800;//chip&nbsp;enable<br /><br />(2)NFCMD&nbsp;=&nbsp;0xff;&nbsp;//reset&nbsp;command<br /><br />(3)while(!(NFSTAT&nbsp;&&nbsp;BUSY))等待NAND&nbsp;flash&nbsp;memory&nbsp;ready&nbsp;to&nbsp;operate&nbsp;<br /><br />3.读写函数<br /><br />(1)NFCONF&nbsp;&=&nbsp;~0x800;/*&nbsp;chip&nbsp;Enable&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />(2)NFCMD&nbsp;=&nbsp;0;//read0<br /><br />(3)NFADDR&nbsp;=&nbsp;i&nbsp;&&nbsp;0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NFADDR&nbsp;=&nbsp;(i&nbsp;&gt&gt&nbsp;9)&nbsp;&&nbsp;0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NFADDR&nbsp;=&nbsp;(i&nbsp;&gt&gt&nbsp;17)&nbsp;&&nbsp;0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NFADDR&nbsp;=&nbsp;(i&nbsp;&gt&gt&nbsp;25)&nbsp;&&nbsp;0xff;/*&nbsp;Write&nbsp;Address&nbsp;*/<br /><br />(4)while(!(NFSTAT&nbsp;&&nbsp;BUSY))等待NAND&nbsp;flash&nbsp;memory&nbsp;ready&nbsp;to&nbsp;operate&nbsp;<br /><br />(5)*buf&nbsp;=&nbsp;(NFDATA&nbsp;&&nbsp;0xff);//读数据线<br /><br />(6)NFCONF&nbsp;|=&nbsp;0x800;&nbsp;/*&nbsp;chip&nbsp;disable&nbsp;*/<br /><br />s3c2440对nandflash读写操作寄存器配置的流程:<br /><br />1.初始化<br /><br />(1)NFCONT&nbsp;=&nbsp;(1&lt&lt0)&nbsp;//enable&nbsp;NAND&nbsp;flash&nbsp;controller<br /><br />(2)NFCONT&nbsp;|=&nbsp;(1&lt&lt1)/*&nbsp;chip&nbsp;disable&nbsp;*/<br /><br />2.复位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />(1)NFCONT&nbsp;&=&nbsp;~(1&lt&lt1)&nbsp;/*&nbsp;chip&nbsp;enable&nbsp;*/<br /><br />(2)NFCMD&nbsp;=&nbsp;0xff;&nbsp;//reset&nbsp;command<br /><br />(3)while(!(NFSTAT&nbsp;&&nbsp;BUSY))等待NAND&nbsp;flash&nbsp;memory&nbsp;ready&nbsp;to&nbsp;operate<br /><br />3.读写函数<br /><br />(1)NFCONT&nbsp;&=&nbsp;~(1&lt&lt1)&nbsp;/*&nbsp;chip&nbsp;enable&nbsp;*/<br /><br />(2)NFSTAT&nbsp;|=&nbsp;(1&lt&lt2)&nbsp;//NAND_CLEAR_RB&nbsp;,RnB&nbsp;transition&nbsp;is&nbsp;detected<br /><br />(3)NFCMD&nbsp;=&nbsp;0;&nbsp;//READ0,读上半叶<br /><br />(4)&nbsp;/*&nbsp;Write&nbsp;Address&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NFADDR&nbsp;=&nbsp;i&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NFADDR&nbsp;=&nbsp;(i&nbsp;&gt&gt&nbsp;9)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NFADDR&nbsp;=&nbsp;(i&nbsp;&gt&gt&nbsp;17)&nbsp;&&nbsp;0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NFADDR&nbsp;=&nbsp;(i&nbsp;&gt&gt&nbsp;25)&nbsp;&&nbsp;0xff;<br /><br />(5)while(!&nbsp;(NFSTAT&(1&lt&lt0))&nbsp;);&nbsp;&nbsp;&nbsp;/*NAND_DETECT_RB,等待NAND&nbsp;flash&nbsp;memory&nbsp;ready&nbsp;to&nbsp;operate*/<br /><br />(6)*buf&nbsp;=&nbsp;(NFDATA&nbsp;&&nbsp;0xff);&nbsp;&nbsp;//读数据线<br /><br />(7)NFCONT&nbsp;|=&nbsp;(1&lt&lt1)/*&nbsp;chip&nbsp;disable&nbsp;*/<br /><br />s3c2440对nandflash读写操作部分源码(仅供学习使用):<br /><br /><br />代码:<br />/*&nbsp;NAND&nbsp;Flash&nbsp;registers&nbsp;2440*/#define&nbsp;NFCONF&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;int&nbsp;*)0x4e000000)#define&nbsp;NFCONT&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;int&nbsp;*)0x4e000004)#define&nbsp;NFCMD&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;char&nbsp;*)0x4e000008)#define&nbsp;NFADDR&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;char&nbsp;*)0x4e00000c)#define&nbsp;NFDATA&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;char&nbsp;*)0x4e000010)#define&nbsp;NFSTAT&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;char&nbsp;*)0x4e000020)#define&nbsp;NAND_CHIP_ENABLE&nbsp;(NFCONT&nbsp;&=&nbsp;~(1&lt&lt1))#define&nbsp;NAND_CHIP_DISABLE&nbsp;(NFCONT&nbsp;|=&nbsp;(1&lt&lt1))#define&nbsp;NAND_CLEAR_RB&nbsp;(NFSTAT&nbsp;|=&nbsp;(1&lt&lt2))#define&nbsp;NAND_DETECT_RB&nbsp;{&nbsp;while(!&nbsp;(NFSTAT&(1&lt&lt0))&nbsp;);}/*&nbsp;在第一次实用NAND&nbsp;Flash前,复位一下NAND&nbsp;Flash&nbsp;*/void&nbsp;reset_nand(){&nbsp;int&nbsp;i=0;//&nbsp;NFCONF&nbsp;&=&nbsp;~0x800;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(;&nbsp;i&lt10;&nbsp;i++);&nbsp;NAND_CHIP_ENABLE;&nbsp;&nbsp;NFCMD&nbsp;=&nbsp;0xff;&nbsp;//reset&nbsp;command&nbsp;wait_idle();}/*&nbsp;初始化NAND&nbsp;Flash&nbsp;*/void&nbsp;init_nand(){//&nbsp;NFCONF&nbsp;=&nbsp;0xf830;&nbsp;NFCONT&nbsp;=&nbsp;(1&lt&lt0);&nbsp;NAND_CHIP_DISABLE;&nbsp;<br />
lpczcy 发表于 2009-6-3 14:05 | 显示全部楼层

精辟

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

38

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部