我在官网下了一个下载应用程序的NandWriter例程,希望能够通过这个程序将目标应用程序写入Nand Flash,我的NAND FLASH为MT29F4G16ABADAH4,和C6748 LCDK的应该一样。按理说应该不需要修改什么就能使用的(DDR2 SDRAM这里先不讨论,只讨论怎么操作FLASH),可是NAND_open函数就没正常运行。
在debug模式下,hNandInfo = NAND_open((Uint32)&NANDStart, DEVICE_BUSWIDTH_16BIT );返回为空,出现问题
进入函数里面观察,发现安装的确实是CS3 ,从地址0x62000000开始的 NAND FLASH,这里没问题
然后发现是NAND_open函数里面的LOCAL_flashGetDetails(hNandInfo)处出现了返回为NULL的值,显然问题出在这里了。
跳进LOCAL_flashGetDetails(hNandInfo)里面观察,从NAND FLASH读取信息
hNandInfo->dataBytesPerPage = (Uint16) (*((Uint32 *) (paramPageData+80))) & 0xFFFF;
hNandInfo->spareBytesPerPage = (Uint16) (*((Uint16 *) (paramPageData+84)));
hNandInfo->pagesPerBlock = (Uint16) (*((Uint32 *) (paramPageData+92))) & 0xFFFF;
hNandInfo->numBlocks = (Uint32) (*((Uint32 *) (paramPageData+96))) * paramPageData[100];
hNandInfo->numColAddrBytes = (Uint8) ((paramPageData[101] >> 4) & 0xF);
hNandInfo->numRowAddrBytes = (Uint8) (paramPageData[101] & 0xF);
这些内容完全与NAND FLASH的实际参数相吻合,这里也没问题
最后程序运行到LOCAL_flashGetDetails(hNandInfo)快要返回时,出现了问题。
已知,hNandInfo指的结构体类型为
LOCAL_flashGetDetails(hNandInfo)中出现问题的语句地方:
// Check to make sure there are enough spare bytes to satisfy our needs
if ((hNandInfo->numOpsPerPage * hNandInfo->spareBytesPerOp) > hNandInfo->spareBytesPerPage)
return E_FAIL;
这里返回为E_FAIL,问题就在这里。后来确定hNandInfo->spareBytesPerOp有问题,在debug下,观察它的值等于hNandInfo->spareBytesPerPage(固定的64BYTES),所以出错了。
而hNandInfo->spareBytesPerOp的值的确定是根据判断条件确定的
而参数 hNandInfo->spareBytesPerOp(需要最终确定的值)、hNandInfo->hPageLayout->spareRegion.bytesPerOp都是不确定的,程序事先都对其没有赋值,虽然程序在刚开始进行了好像进行了初始化的操作,但实际并没有对这些参数赋值
问题1: 这个判断条件的参数hNandInfo->hPageLayout->spareRegion.bytesPerOp断电后再试验的值都是变化的,因为它需要和hNandInfo->spareBytesPerPage(固定值,64BYTES)比较后,才能断定hNandInfo->spareBytesPerOp的值,程序虽然初始化hNandInfo->hPageLayout = &DEVICE_NAND_PAGE_layout;,却没有具体赋值hNandInfo->hPageLayout ,因为DEVICE_NAND_PAGE_layout也只是定义了,没有赋值。按照提示语句
// Use device specific page layout and ECC layout
hNandInfo->hPageLayout = &DEVICE_NAND_PAGE_layout;
hNandInfo->hEccInfo = &DEVICE_NAND_ECC_info;
hNandInfo->hBbInfo = &DEVICE_NAND_BB_info;
hNandInfo->hChipInfo = DEVICE_NAND_CHIP_infoTable;
我是不是应该对DEVICE_NAND_PAGE_layout,DEVICE_NAND_ECC_info,DEVICE_NAND_BB_info,DEVICE_NAND_CHIP_infoTable都先赋值了?如果幅值这些结构体,那么hNandInfo->hPageLayout->spareRegion.bytesPerOp的值不确定问题就自然解决了,但是这些结构体(特别是里面的hPageLayout->spareRegion.bytesPerOp)又应该给什么值呢?跟用的NAND FLASH有关?
问题2: 我的NAND FLASH跟官方的LCDK的一样,在官方的device_nand.h中给了一些具体参数:
其中中间红色这三行,我在NAND FLASH MT29F4G16ABADAH4里也没有找到这类技术指标,这三个参数是怎么定的?还有,问题1的参数hNandInfo->hPageLayout->spareRegion.bytesPerOp是不是在DEVICE_NAND_MIN_SPAREBYTES_PER_OP(10)和DEVICE_NAND_MAX_SPAREBYTES_PER_OP (16)之间,随便选个数就可以了?
Tony Tang:
MT29F4G16ABADAH4是4Gbit即512Mbyte的device,大于128Mbyte.所以要通过device ID的第三者个字节来读取NAND信息。
根据L138 bootloader文档第4字节的解读为下表,则只支持8bit宽的大于128Mbyte的NAND device.
而MT29F4G16ABADAH4的第4字节为:0x56, 为16bit宽的。
所以这个NAND是芯片bootloader不支持的。
baokun hu其中中间红色这三行,我在NAND FLASH MT29F4G16ABADAH4里也没有找到这类技术指标,这三个参数是怎么定的?
这是由L138 NAND接口定义的,NAND接口按512字节计算一次ECC。
但是还是可以用作非boot用途的,这就要用户自己的程序对其进行识别与操作的。
你的nand writer程序是在哪下载的?
baokun hu:
回复 Tony Tang:
Tony Tang
MT29F4G16ABADAH4是符合ONFI standard的(Open NAND Flash Interface (ONFI) 1.0-compliant1),所以bootloader应该先从NAND parameters page读取设备信息,而不是从ID来读信息吧
你说的上面这种情况,不应该是当NAND FLASH不符合ONFI standard标准时,才去查看是否大于128M,以及ID是多少么
如果是你说的这样,那岂不是只要NAND FLASH大于128M,就无法从16bits的NAND FLASH 启动了么
还有,在官方提供的TMS320C6748 LCD Kit (Schematics, BOM , Layout, and Gerber Files) v.A7a 的原理图中,明确使用的就是MT29F4G16ABADAH4,而且还注上:
BOOT DEVICE NAND FLASH
BOOT BITS[4:1] 0111
还请您帮我再确认一下 ,究竟能不能从 MT29F4G16ABADAH4启动?
Tony Tang:
回复 baokun hu:
我在网上找到这个nand flash的手册里的ID是0xCC
不在bootloader支持列表里:
Tony Tang:
回复 baokun hu:
也有可能是table 13 bit 6忘了加1的说明了,这个我确认一下。
Again,你的nand writer是哪下载的?
baokun hu:
回复 Tony Tang:
你找的只是Byte 1,不是Byte 4。
其次在符合ONFI标准下,应该先从NAND parameters page读取设备信息,而不是从ID来读信息吧,当设备不符合ONFI标准时,才有什么128M,查找ID等等之说吧?
NAND WRITER是在https://sourceforge.net/projects/dvflashutils/?source=typ_redirect
下载的,OMAP_L138/CCS/NAND WRITER目录,里面只有一个文件nandwriter.c,然后我又在OMAP_L138/COMMON/include和OMAP_L138/COMMON/src下找了一些源文件和头文件,自己做了一个工程,编译通过