WINCE6.0 spansion flash(S34ML08G100TFI000)调试记录
平台:WINCE6.0+S3C2451
先来看Read ID的时序及ID数值:
图1
由图1可知8Gb的,one CE#和two CE#的ID的第2nd对应的数据不同,分别是D3h和DCh。为了确认这个值,在ReadFlashID函数中增加读取第3到第5个字节的数据:
<span style="font-size:14px;">NF_nFCE_L(); //Deselect the flash chip. NF_CMD(CMD_READID); // Send flash IDread command. NF_ADDR(0); // Send Address 0. for (i=0;i<10;i++); Mfg =NF_RDDATA_BYTE(); //Read 1 byte from NFDATA == Maker code Dev =NF_RDDATA_BYTE(); //Read 1 byte from NFDATA == Device code n3rdID =NF_RDDATA_BYTE(); //Read 1 byte from NFDATA == Device code n4rdID =NF_RDDATA_BYTE(); n5rdID =NF_RDDATA_BYTE(); NF_nFCE_H(); </span>
串口输出的值如下:
ManufacturerID=0x1,device code =0xd3,n3rdID=0xd1,n4rdID=0x95,n5rdID=0x58
说明这是one CE#的芯片,根据这ID的值可以动态判断所采用的flash具体类型,这样,一个BSP包就可以同时支持多种flash。
One CE#和two CE#的方块图如下:
图2
接下来看S34ML08G1有效块数量:
图3
再来看手册上page大小等参数的描述:
图4
根据这些信息,我们需要在cfnand.h文件的全局数组astNandSpec增加对S34ML08G1的支持,如下图所示:
图5
做了上面这些修改后,从SD卡启动把系统镜像文件烧录到flash后,重启,没有看到任何的串口输出信息,系统无法启动,为什么呢?是因为在从flash启动时,stepldr\main.c文件中读取ID的ReadFlashID因为还没有增加对S34ML08G1的支持,所以读取的ID并不在条件判断的范围内,直接就返回FLASE了,这样导致stepldr没有拷贝eboot的数据,从而无法启动,增加了下面内容后就OK了:
<span style="font-size:14px;">DWORDReadFlashID(void) { BYTE Mfg, Dev, i; volatile int ReadID; UINT32 nRet; bLARGEBLOCK = FALSE; nRet = TRUE; NF_nFCE_L(); NF_CMD(0x90); // Send flash ID read command. NF_ADDR(0); for (i=0; i<10; i++); Mfg =NF_RDDATA8(); // Maker code Dev =NF_RDDATA8(); // Devide code(K9S1208V:0x76),(K9K2G16U0M:0xca) NF_nFCE_H(); if (Mfg == (UINT8)0xEC) { if (Dev >= (UINT8)0xA0) bLARGEBLOCK = TRUE; } else if (Mfg == (UINT8)0x98) { } else if (Mfg ==(UINT8)0x01)//S34ML08G1----kandi add at 2014.06.05 { bLARGEBLOCK = TRUE;//becauseS34ML01G1/02G1/04G1/08G1 page size=2048+64,no include small page size(512+16) } else { nRet = FALSE; } ReadID = (DWORD)((Mfg<<8)+Dev); // Uart_SendString("FlashID :"); // Uart_SendDWORD(ReadID,1); // return ((DWORD)(Mfg<<8)+Dev); return nRet; }</span>
由于Spansion的S34ML01G1/02G1/04G1/08G1系列的flash页大小都是2048+64,没有小页(512+16),所以有bLARGEBLOCK = TRUE。
接下来来看S34ML08G1对NOP的要求,如下图:
图6
也就是说1个相同页最多只允许4次的编程周期,这可以从FAL+FMD模型的flash驱动的FAL层可以看出来,此源代码在WINCE600\PRIVATE\WINCEOS\DRIVERS\MSFLASH,比如可从fal.cpp的FileSysFal::InternalWriteToMedia函数下面看出来,对每页的调用3次FMD层的写函数FMD_WriteSector,第1次写spare数据,第2次写main和spare数据,第3次写spare数据,如果超过了所限定的4次就很有可能导致无法完全进入WINCE系统,这个问题在三星的K9K8G08U0E上就出现过,详细见链接:
http://blog.csdn.net/loongembedded/article/details/25906781