This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: OMAP-L138

我在官网下了一个下载应用程序的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)之间,随便选个数就可以了?

  •  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程序是在哪下载的?

  • 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启动?

                             

  • 我在网上找到这个nand flash的手册里的ID是0xCC

    不在bootloader支持列表里:

  • 也有可能是table 13 bit 6忘了加1的说明了,这个我确认一下。

    Again,你的nand writer是哪下载的?

  • 你找的只是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下找了一些源文件和头文件,自己做了一个工程,编译通过

     

  • 其实就是在OMAP-L138_FlashAndBootUtils_2_40文件夹的NANDWriter下找了个nandwriter文件,加上几个.c和.h组合成的一个烧写工程。

    http://www.deyisupport.com/cfs-file.ashx/__key/telligent-evolution-components-attachments/00-32-00-00-00-05-18-96/6478nandw.rar这里也有一个工程,好像跟我组合的这个工程差不多,具体怎么连接到的这里的,我也忘了,应该都差不多吧

    刚才我分析了一下,好像我的问题(不能把数据写入nand flash)好像是需要把下面这些结构体先初始化一遍。

    // 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;

    至于MT29F4G16ABADAH4,应该可以当成启动吧,官方给的原理图好像也是这么设计的?

  • baokun hu 说:
    至于MT29F4G16ABADAH4,应该可以当成启动吧,官方给的原理图好像也是这么设计的?

    经确认,文档有疏漏。这个NAND是可以支持的。

    http://e2e.ti.com/support/dsp/omap_applications_processors/f/42/t/566285