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.

关于NAND flash启动,程序无法正常运行的问题

Other Parts Discussed in Thread: SYSBIOS

你好,我用的是C6678的板子,现在碰到一个问题: 我通过IBL二级启动NAND FLASH加载mcsdk例子helloworld时(c:\ti\mcsdk_2_01_01_04\examples\ndk\helloWorld),通过串口打印的消息可以看到IBL是正常运行了的,但是程序加载完成后,helloworld程序没有执行(串口没有打印相应的状态信息,主机端也没有检测到C6678的网络状态),现在是不清楚程序是否已经加载到DDR3中了,还是加载成功但是没有正常执行。我试着用仿真器去连接C6678去观察寄存器,无法连接,报下面的这个错误:

请问问题出在哪里?是不是IBL的有些参数我没有设置正确?

PS:IBL二级启动NAND FLASH的流程我用文件夹c:\ti\mcsdk_2_01_01_04\tools\boot_loader\examples\i2c\nand下的例子是测试过了的,可以正常启动并通过串口打印例子中的信息。

  • Zhang,

              您用的是TI的EVM板还是自己做的单板? 有没有用memory测试程序测过DDR3的读写?

  • 你好,Jane。我用的是自己做的单板。测试过DDR3的读写时正常的。并且helloworld程序,我用仿真器加载运行过,可以正常运行,可以确定不是DDR3的问题。现在我通过串口打印出了IBL加载NAND FLASH完成后程序执行的入口地址entry,跟用仿真器加载程序后程序的入口地址_c_int00的地址是一样的。现在还不确定是程序加载过程中错误还是执行过程中跑飞了?

  • 你好,Jane. 我用了另一个不涉及DDR3的基于sysbios的测试程序又做了一个实验,烧写到NAND FLASH中还是不能执行。这个程序我用仿真器加载运行是正常的。由于我手头上没有开发板,无法做对比。你能否用开发板测试一下NAND FLASH加载helloworld程序或者其他类似的基于sysbios的程序。谢谢!

  • Gang,

             EVM板上NAND FLASH的启动方式是可以成功的。 您可以参考一下附件的信息。

    通过IBL扩展Keystone I DSP启动模式.pdf
  • 你用MCSDK里面IBL 到NAND启动的例子是OK的吗?

    那么应该能够正常运行你自己的代码,你按照IBL的步骤把自己编译出来的文件烧写进去试试,注意需要是elf的文件格式;

    另外你使用的NAND是否和EVM上一样?如果不一样,要看你的BLOCK size是不是16384,如果不是应该做相应的修改。

  • 你好,Allen,谢谢你的回复。

    Allen Yin 说:

    你用MCSDK里面IBL 到NAND启动的例子是OK的吗?

    是的,可以正常启动。

    那么应该能够正常运行你自己的代码,你按照IBL的步骤把自己编译出来��文件烧写进去试试,注意需要是elf的文件格式;

    另外你使用的NAND是否和EVM上一样?如果不一样,要看你的BLOCK size是不是16384,如果不是应该做相应的修改。

    我烧写的是ELF格式的.out文件。我使用的NAND FLASH 和 EVM上是同一型号。

  • 你把你用的启动成功和不成功的app.bin发上来给我看看

  • 你好, Allen。我现在初步找到了错误的原因:在烧写nand flash的时候和ibl读nand flash的时候,二者对bad block标志的读取是不一致的,导致在烧写nand flash时被认为是好的block可能在读取时被认为是坏块。

    在nand_writer_evmc6678程序中对bad block进行判断是通过读第0页的spare area第6个字节是否为FF来判断的(具体可以看pdk目录下文件c66x_nand.c中产生的spare area的地址),

    但是在ibl中,其对bad block进行判断是通过读取第1页的spare area第6个字节是否为FF来判断的(通过/src/hw/emif/nand_emif25.c中在读spare area时产生的地址)。

    因此,二者对bad block的判断不一致导致了在加载时有些block没有被加载,或者加载了bad block。

  • 谢谢你的回复,我感到奇怪的是为什么你的nand会出现这么多的坏的block,是不是在某个代码里错误的改写了它们;

    也就是它们到底是硬的坏块还是软的坏块。

  • 你好, Allen。我的nand里的坏块我没有去改写他们。一开始我只是改写了ibl中对PLL和DDR3的配置。当加载比较小的测试程序时,从nand flash启动是可以正常运行的,但是当我加载我自己的程序时(大概有7M左右),就不能够正常启动。后来经过对nand flash中的存储内容通过串口打印出来分析,猜测问题可能出在nand_writer和ibl对坏块的标记上。然后我把nand_writer和ibl中产生的寻址坏块的地址通过串口打印出来,发现nand_writer判断坏块是读的每个block的第0页的第6个字节,而ibl读的是第1页的第6个字节。显然,ibl对坏块的判断是错误的。然后,我查找了nand_writer和Ibl中产生寻址spare area的源代码,发现ibl中addr的产生是有问题的。