位置:51电子网 » 技术资料 » 嵌入式系统

s3c2410的nand flash的驱动分析

发布时间:2008/5/27 0:00:00 访问次数:827

  以前都是把别人写好的代码直接拿过来用,而没有去关心里面到底怎么实现的,昨晚对照着samsung2410和k9f1208的芯片资料把这些代码读了一遍,终于明白了对nandflash的操作一步步是怎么实现的了。

以下的这些代码可以在vivi或者kernel里面找到

对一个nandflash的操作,总体上可以分为这么四步:

一、selectthenanddevice

二、sendcommandtonanddevice

三、operation

四、de-selectthenanddevice

下面是以上四步的实现代码:

一、selectthenanddevice

#definenand_select()this->hwcontrol(nand_ctl_setnce);\


nand_command(mtd,nand_cmd_reset,-1,-1);\


udelay(10);

hwcontrol(nand_ctl_setnce)的作用是设置2410的nandflashconfiguration(nfconf)register的nandflashmemorychipenable位为0,具体请参考samsung2410datasheet。

nandflashmemorychipenable[11]nandflashmemorynfcecontrol

0:nandflashnfce=l(active)

1:nandflashnfce=h(inactive)

(afterauto-boot,nfcewillbeinactive.)

nand_command(mtd,nand_cmd_reset,-1,-1);看字面意思都知道是resetnanddevice,具体实现请看下面。

二、sendcommandtonanddevice

这步又主要有以下几个过程

1、begincommandlatchcycle

实现代码:

this->hwcontrol(nand_ctl_setcle);//setcommandlatchenable

this->hwcontrol(nand_ctl_dat_out);//这个我还不清楚

2、writeoutthecommandtothedevice

实现代码:

this->write_cmd(command);//writethecommandtonandflashcommandset(nfcmd)register

3、setaleandclearcletostartaddresscycle

实现代码:

this->hwcontrol(nand_ctl_clrcle);//clearthecommandlatchenabl

this->hwcontrol(nand_ctl_setale);//settheaddresslatchenable

4、seriallyinputaddress

实现代码:

this->write_addr(address);//writetheaddresstonandflashaddressset(nfaddr)register

5、latchinaddress

实现代码:

this->hwcontrol(nand_ctl_clrale);//cleartheaddresslatchenable


this->hwcontrol(nand_ctl_dat_in);//这个我也不清楚


6、pausefor?us


实现代码:


udelay(?)//延时,总得给nandflash一点反应时间三

//时间视具体nandflash而定


三、operation


主要是往nandflashdata(nfdata)register里面写或者读数据


例如:


staticu_charread_data(void)

{

return(u_char)nfdata;

}




四、de-selectthenanddevice


实现代码:


#definenand_deselect()this->hwcontrol(nand_ctl_clrnce);


跟selectthenanddevice相反,把nandflashconfiguration(nfconf)register的nandflashmemorychipenable位置1


至此,对samsung2410平台上的nandflash一个操作完成。


以上是偶的个人理解,有啥不正确的地方还请大家指出来,感谢。


下面是一个我还没搞明白的问题,希望看到的朋友能指点下:


这段代码来自mizi_linux\drivers\mtd\nand\smc_s3c2410.c


staticvoidsmc_hwcontrol(intcmd)

{

switch(cmd)

{

casenand_ctl_setnce:nfconf&=~nfconf_nfce_high;break;

casenand_ctl_clrnce:nfconf|=nfconf_nfce_high;break;

casenand_ctl_setcle:break;

casenand_ctl_clrcle:break;

casenand_ctl_setale:break;

casenand_ctl_clrale:break;

casenand_ctl_dat_in:break;

casenand_ctl_dat_out:break;

}

}


nand_ctl_setcle、nand_ctl_clrcle、nand_ctl_setale以及后面几个cmd,传进去了啥活都不干喃,这能达到setorclear的效果吗?


  以前都是把别人写好的代码直接拿过来用,而没有去关心里面到底怎么实现的,昨晚对照着samsung2410和k9f1208的芯片资料把这些代码读了一遍,终于明白了对nandflash的操作一步步是怎么实现的了。

以下的这些代码可以在vivi或者kernel里面找到

对一个nandflash的操作,总体上可以分为这么四步:

一、selectthenanddevice

二、sendcommandtonanddevice

三、operation

四、de-selectthenanddevice

下面是以上四步的实现代码:

一、selectthenanddevice

#definenand_select()this->hwcontrol(nand_ctl_setnce);\


nand_command(mtd,nand_cmd_reset,-1,-1);\


udelay(10);

hwcontrol(nand_ctl_setnce)的作用是设置2410的nandflashconfiguration(nfconf)register的nandflashmemorychipenable位为0,具体请参考samsung2410datasheet。

nandflashmemorychipenable[11]nandflashmemorynfcecontrol

0:nandflashnfce=l(active)

1:nandflashnfce=h(inactive)

(afterauto-boot,nfcewillbeinactive.)

nand_command(mtd,nand_cmd_reset,-1,-1);看字面意思都知道是resetnanddevice,具体实现请看下面。

二、sendcommandtonanddevice

这步又主要有以下几个过程

1、begincommandlatchcycle

实现代码:

this->hwcontrol(nand_ctl_setcle);//setcommandlatchenable

this->hwcontrol(nand_ctl_dat_out);//这个我还不清楚

2、writeoutthecommandtothedevice

实现代码:

this->write_cmd(command);//writethecommandtonandflashcommandset(nfcmd)register

3、setaleandclearcletostartaddresscycle

实现代码:

this->hwcontrol(nand_ctl_clrcle);//clearthecommandlatchenabl

this->hwcontrol(nand_ctl_setale);//settheaddresslatchenable

4、seriallyinputaddress

实现代码:

this->write_addr(address);//writetheaddresstonandflashaddressset(nfaddr)register

5、latchinaddress

实现代码:

this->hwcontrol(nand_ctl_clrale);//cleartheaddresslatchenable


this->hwcontrol(nand_ctl_dat_in);//这个我也不清楚


6、pausefor?us


实现代码:


udelay(?)//延时,总得给nandflash一点反应时间三

//时间视具体nandflash而定


三、operation


主要是往nandflashdata(nfdata)register里面写或者读数据


例如:


staticu_charread_data(void)

{

return(u_char)nfdata;

}




四、de-selectthenanddevice


实现代码:


#definenand_deselect()this->hwcontrol(nand_ctl_clrnce);


跟selectthenanddevice相反,把nandflashconfiguration(nfconf)register的nandflashmemorychipenable位置1


至此,对samsung2410平台上的nandflash一个操作完成。


以上是偶的个人理解,有啥不正确的地方还请大家指出来,感谢。


下面是一个我还没搞明白的问题,希望看到的朋友能指点下:


这段代码来自mizi_linux\drivers\mtd\nand\smc_s3c2410.c


staticvoidsmc_hwcontrol(intcmd)

{

switch(cmd)

{

casenand_ctl_setnce:nfconf&=~nfconf_nfce_high;break;

casenand_ctl_clrnce:nfconf|=nfconf_nfce_high;break;

casenand_ctl_setcle:break;

casenand_ctl_clrcle:break;

casenand_ctl_setale:break;

casenand_ctl_clrale:break;

casenand_ctl_dat_in:break;

casenand_ctl_dat_out:break;

}

}


nand_ctl_setcle、nand_ctl_clrcle、nand_ctl_setale以及后面几个cmd,传进去了啥活都不干喃,这能达到setorclear的效果吗?


相关IC型号
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!