您的位置:首页 > 其它

s3c2410的nand flash的驱动分析

2007-06-04 14:58 447 查看
以前都是把别人写好的代码直接拿过来用,而没有去关心里面到底怎么实现的,昨晚对照着samsung 2410和k9f1208的芯片资料把这些代码读了一遍,终于明白了对nand flash的操作一步步是怎么实现的了。
以下的这些代码可以在vivi或者kernel里面找到
对一个nand flash的操作,总体上可以分为这么四步:
一、Select the NAND device
二、Send command to NAND device
三、Operation
四、De-select the NAND device
下面是以上四步的实现代码:
一、Select the NAND device
#define nand_select() this->hwcontrol(NAND_CTL_SETNCE); /
nand_command(mtd, NAND_CMD_RESET, -1, -1); /
udelay (10);
[align=left]hwcontrol(NAND_CTL_SETNCE)的作用是设置2410的NAND FLASH CONFIGURATION (NFCONF) REGISTER的NAND Flash Memory chip enable位为0,具体请参考samsung 2410 datasheet。[/align]
[align=left]NAND Flash Memory chip enable [11] NAND flash memory nFCE control[/align]
[align=left]0 : NAND flash nFCE = L (active)[/align]
[align=left]1 : NAND flash nFCE = H (inactive)[/align]
[align=left](After auto-boot, nFCE will be inactive.)[/align]
[align=left]nand_command(mtd, NAND_CMD_RESET, -1, -1);看字面意思都知道是reset nand device,具体实现请看下面。[/align]
[align=left]二、Send command to NAND device[/align]
[align=left]这步又主要有以下几个过程[/align]
[align=left]1、 Begin command latch cycle[/align]
[align=left]实现代码:[/align]
this->hwcontrol(NAND_CTL_SETCLE); // set command latch enable
this->hwcontrol(NAND_CTL_DAT_OUT); // 这个我还不清楚
2、 Write out the command to the device
实现代码:
[align=left]this->write_cmd (command); // write the command to NAND FLASH COMMAND SET (NFCMD) REGISTER[/align]
3、 Set ALE and clear CLE to start address cycle
实现代码:
[align=left]this->hwcontrol(NAND_CTL_CLRCLE); // clear the command latch enable[/align]
[align=left] this->hwcontrol(NAND_CTL_SETALE); // set the address latch enable[/align]
4、 Serially input address
实现代码:
[align=left]this->write_addr (address); // write the address to NAND FLASH ADDRESS SET (NFADDR) REGISTER[/align]
具体请参考所使用的Nand Flash datasheet以及Nand Flash的寻址方式[http://sniper167.bokee.com/5494041.html]
5、 Latch in address
实现代码:
this->hwcontrol(NAND_CTL_CLRALE); // clear the address latch enable
this->hwcontrol(NAND_CTL_DAT_IN); // 这个我也不清楚
6、 Pause for ?us
实现代码:
udelay (?) // 延时,总得给Nand Flash一点反应时间三
// 时间视具体Nand Flash而定
三、Operation
[align=left]主要是往NAND FLASH DATA (NFDATA) REGISTER里面写或者读数据[/align]
[align=left]例如:[/align]
[align=left]static u_char read_data(void) [/align]
[align=left]{[/align]
[align=left] return (u_char)NFDATA;[/align]
[align=left]}[/align]
四、De-select the NAND device
实现代码:
#define nand_deselect() this->hwcontrol(NAND_CTL_CLRNCE);
[align=left]跟select the NAND device相反,把NAND FLASH CONFIGURATION (NFCONF) REGISTER的NAND Flash Memory chip enable位置1[/align]
至此,对samsung 2410平台上的Nand Flash一个操作完成。
以上是偶的个人理解,有啥不正确的地方还请大家指出来,感谢。
下面是一个我还没搞明白的问题,希望看到的朋友能指点下:
这段代码来自mizi_linux/drivers/mtd/nand/smc_s3c2410.c
static void smc_hwcontrol(int cmd)
{
switch (cmd)
{
case NAND_CTL_SETNCE: NFCONF &= ~NFCONF_nFCE_HIGH; break;
case NAND_CTL_CLRNCE: NFCONF |= NFCONF_nFCE_HIGH; break;
case NAND_CTL_SETCLE: break;
case NAND_CTL_CLRCLE: break;
case NAND_CTL_SETALE: break;
case NAND_CTL_CLRALE: break;
case NAND_CTL_DAT_IN: break;
case NAND_CTL_DAT_OUT: break;
}
}
NAND_CTL_SETCLE、NAND_CTL_CLRCLE、NAND_CTL_SETALE以及后面几个cmd,传进去了啥活都不干喃,这能达到set or clear的效果吗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: