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的效果吗?
以下的这些代码可以在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的效果吗?
以下的这些代码可以在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的效果吗?