TI中文支持网
TI专业的中文技术问题搜集分享网站

关于C6748的NandWriter程序,程序里面的几个疑问?

我在官网下了一个下载应用程序的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下找了一些源文件和头文件,自己做了一个工程,编译通过

 

赞(0)
未经允许不得转载:TI中文支持网 » 关于C6748的NandWriter程序,程序里面的几个疑问?
分享到: 更多 (0)