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.

EVM6678LE I2C-Nor flash boot 与 SPI flash boot 的具体操作问题

SPI NOR boot

【6678/6670 SPI Nor flash  多核boot原理总结和demo 请参考12L 13L帖子的附件】

示例包括:

  • 单多核6670/6678 SPI boot 示例
  • cmd/cfg 部署在DDR的boot示例
  • 多核相同/不同 代码的boot 示例
  • 制作多核镜像工具及部分工具链源码
  • LED测试示例工程
  • C66x SPI Boot原理的文档和说明

----------------------------------------------------------------------------------------------------------------------------------------------------

I2C-SPI IBL 二级  BOOT

     1.  将IBL烧入EEPROM中(如果事先已经烧写过,可以不用做)

       1、将i2crom_0x51_c6678_le.bin文件从"mcsdk_2_00_05_17\tools\boot_loader\ibl\src\make\bin"拷贝到"mcsdk_2_00_04_16\tools\writer\eeprom\evmc6678l\bin"

       2、使用mcsdk_2_00_04_16\tools\writer\eeprom\evmc6678l\bin\eepromwriter_evm6678l.out进行烧写

        其中eepromwriter_input.txt的内容为:

        file_name  =  i2crom_0x51_c6678_le.bin
        bus_addr   = 0x51
        start_addr = 0
        swap_data  = 0

     2. 应用程序生成ELF 的 app.out,直接更名为app.bin.

       使用mcsdk_2_00_05_17\tools\writer\nor\evmc6678l\bin\norwriter_evm6678l.out 对app.bin进行烧写

       其中nor_writer_input.txt文件的内容为

       file_name  = app.bin

       start_addr = 0x80000000

 

       烧写步骤工程readme.txt有介绍

     3. 配置IBL

      1、运行程序mcsdk_2_00_05_17\tools\boot_loader\ibl\src\make\bin\i2cparam_0x51_c6678_le_0x500.out

      2、加载文件 i2cConfig.gel然后在CCS的DEBUG界面上点击,Srcipts->EVM c6678 IBL -> setConfig_c6678_main 

      3、几秒钟以后,在console界面上敲击回车键.

     1 2 3步骤时候的启动模式

      (pin1, pin2, pin3, pin4) 
      SW3(off, on, on, on), 
      SW4(on, on, on, on), 
      SW5(on, on, on, off),
      SW6(on, on, on, on)

      步骤3完成之后断电重启的启动模式

      (pin1, pin2, pin3, pin4) 
      SW3(off, off, on, off), 
      SW4(on, on, on, on), 
      SW5(on, on, on, off),
      SW6(on, on, on, on)

      此时实现核0的加载。

  

  • Shihao,

    • 好像目前TI确实只支持core0 做NDK statck。
    • 多核boot 确就是合理的内存分配,core0写boot magic address 以及 触发IPCGR.
    striker
  • striker 你好

    目前我在多核boot上仍有一些问题没有解决的思路...

    如图是platform的配置和仿真结果,我把c_int00分别放在BOOT_CORE0和BOOT_CORE1中,仿真能正确运行

    然而在烧写后通过SPI BOOT,核0能正确走到我设置的死循环(main第一行),而核1走到了0x018xxxxx,把PC指针调回0x0x150000后核1可正常运行

    写boot_magic_address的代码和结果如下

            if (pform_status == Platform_EOK)
            {
               int *pBootMagicAddCore0;
               int *IpcGr0;

               pBootMagicAddCore0 = (int*)0x1087FFFC;

               //(*pBootMagicAddCore0)+= 0x10000000;
               //*(pBootMagicAddCore0+ (0x01000000)/4 ) = (*pBootMagicAddCore0) + 0x01000000;
               *pBootMagicAddCore0 = 0x0c000000 - 0x00800000;
               *(pBootMagicAddCore0+ (0x01000000)/4 ) = 0x0c150000 - 0x00800000;

               IpcGr0  = (int*)0x02620240;
               for(i = 1;i < CORE_NUM_6678;i++)//core0 sent ipc interrupt to
               {
                  *(IpcGr0+i) = (*(IpcGr0+i)) | 0x00000001;
               }
            }

    之后我又尝试了把c_int00放在1x800000,只更改了platform和上面的代码(改为注释部分)

    这次核0工作依然正常,核1指针指在0x20BXXXXX,0x1087FFFC处的值为1C000000(不应该是10000000么),0x1087FFFC处的值为00000000,改变PC指针仍能运行

    现在有点想不通到底是哪里出的问题

    谢谢指点

  • Shihao,

    L2SRAM 应该使用全局地址。另外还是建议使用demo里的 memory 分配方案,最好不把c_int00 地址 放在 共享内存里。 

    striker

  • striker你好

    你的意思是在(0x10800000-)放置BOOT_CORE0和L2SRAM0,在(0x11800000-)放置BOOT_CORE1和L2SRAM1么?

    不太理解为什么这两者不能放在共享内存里

  • shihao,

    可以放,我只是推荐放在本地L2SRAM。这样逻辑比较清楚。

    这些都不是问题,问题在于我在你的platform文件里看到L2SRAM没有使用全局地址。这样肯定是不对的。

    striker

  • striker你好,

    更改了L2SRAM为全局地址后,boot后core0,core1都成功走到了c_int00和main()里设置的死循环

    程序中两个核首先会进行ipc的连接,仿真的时候可以成功,但是spi boot时核0直接就 abort 了,这里也没法通过CCS查看错误信息...

    请问有什么解决方法么?

    谢谢指点~

  • Shihao,

    我觉得原因可能是核0启动的时候,核1 的程序尚未加载,从而导致attach 失败。

    解决办法是在ipc_attach 之前增加一个自定义同步函数。

    函数逻辑很简单,大致如下,注意包含必要cache头文件

    typedef  boot_syncer

    {

        uint8_t      flag;

        uint8_t      dummy[127];/*fill up to cache-line size*/

    }stru_boot_syncer;

    #pragma DATA_SECTION(g_sram_boot_flag,".sram")

    stru_boot_syncer     g_syncer[2] =

    {

       {0,{0}},

       {0,{0}}

    };

    void corepac_boot_sync()

    {

        while(1)

       {

           uint32_t sum = 0;

           uint32_t  i;

            CACHE_invL1d(   &(g_syncer[DNUM]) , sizeof(stru_boot_syncer),CACHE_WAIT );

            g_syncer[DNUM].flag = 1;

           CACHE_wbL1d(   &(g_syncer[DNUM]) , sizeof(stru_boot_syncer),CACHE_WAIT );

           for(i = 0;i < 2; i++)

           {

                 CACHE_invL1d(   &(g_syncer[i]) , sizeof(stru_boot_syncer),CACHE_WAIT );

                 sum += g_syncer[i].flag;

            }

            if( 2 ==  sum)

             {

                   break;

             }

        }

    }

    以上,

    如果多余两个核就可以修改的更通用一些。

    如果纯粹为了多核同步,进入bios后不使用ipc notify等功能 连ipc_attach 都可省去。

    striker

  • striker你好,

    我在两个核的main()第一行都添加了

                    volatile int flag = 1;
                    while(flag){};

    然后仿真时load symbol 修改 flag=0 后同时运行的 两个核

    上面所说的问题是在这种情况下出现的

    应该不是“核0启动的时候,核1 的程序尚未加载”引起的吧

  • Shihao,

    这样的话不是上述问题。此时双核行为应与在线调试一致。

    striker

  • striker 你好

    现在我在程序烧入后再load symbol 可以看到 console 的输出了

    程序是由 mcsdk_2_01_02_06\demos\image_processing 修改加入tcp传输得到的

    下面第一段是仿真器输出结果,后面两段是spi boot时的两种结果

    我一开始以为是heap的问题,然而

    var heapMemParams = new HeapMem.Params();
    heapMemParams.size = 0x8000000;

    SPI boot的时候 从0x0800 0000到0x2000 0000都出错

    仿真器0x0000 F000出错,0x0008 0000就Ok了...

    ---------------------------------------------------------------------------

    [C66xx_0] EVM_init
    current_id= 0
    [C66xx_1] status_slave_last= 0
    slave enter slave_main()
    [C66xx_0] status0_last= 0


    MCSDK IMAGE PROCESSING DEMONSTRATION

    QMSS successfully initialized
    CPPI successfully initialized
    PA successfully initialized
    HeapBufMP_create_Handle=800009a8
    MessageQ_registerHeap success
    calloc=80001248
    MessageQ_alloc=c302c80
    MessageQ_alloc=c302d00

    TCP/IP Stack 'bmp!' Application


    TCP/IP Stack 'bmp!' Application

    PASS successfully initialized
    Ethernet subsystem successfully initialized
    Ethernet eventId : 48 and vectId (Interrupt) : 7
    Registration of the EMAC Successful, waiting for link up ..    
    [C66xx_1] HeapBufMP_open=0
    [C66xx_0] Network Added: If-1:192.168.2.100                    
    receivemessage_all=800351b0                                 
    length=sizeo(saClient)=16                                   
     MessageQ_create_0=8006d9b8                               
    slave_queue_name=core1_queue                                  
    [C66xx_1] HeapBufMP_open=90000988                             
    HeapBufMP_open success
    MessageQ_create1=900009f0
    number=390
    before messageQ_get1
    [C66xx_0] MessageQ_open_0 success                  
    socket_receivemessage=0x80034b40                     
    &length=0x80034540                                       
    ******************************************************仿真器,成功
    [C66xx_0] EVM_init
    current_id= 0
    [C66xx_1] status_slave_last= 0
    slave enter slave_main()
    [C66xx_0] status0_last= 0


    MCSDK IMAGE PROCESSING DEMONSTRATION

    QMSS successfully initialized
    CPPI successfully initialized
    PA successfully initialized
    HeapBufMP_create_Handle=800009a8
    MessageQ_registerHeap success
    calloc=80001248
    MessageQ_alloc=c302c80
    MessageQ_alloc=c302d00

    TCP/IP Stack 'bmp!' Application


    TCP/IP Stack 'bmp!' Application

    PASS successfully initialized
    Ethernet subsystem successfully initialized
    Ethernet eventId : 48 and vectId (Interrupt) : 7
    [C66xx_1] HeapBufMP_open=0
    HeapBufMP_open=90000988
    HeapBufMP_open success
    MessageQ_create1=900009f0
    number=390
    before messageQ_get1
    *******************************************************↑一直running
    [C66xx_1] status_slave_last= 0
    slave enter slave_main()
    [C66xx_0] status0_last= 0


    MCSDK IMAGE PROCESSING DEMONSTRATION

    QMSS successfully initialized
    CPPI successfully initialized
    PA successfully initialized
    HeapBufMP_create_Handle=800009a8
    MessageQ_registerHeap success
    calloc=80001248
    MessageQ_alloc=c302c80
    MessageQ_alloc=c302d00

    TCP/IP Stack 'bmp!' Application


    TCP/IP Stack 'bmp!' Application

    PASS successfully initialized
    Ethernet subsystem successfully initialized
    Ethernet eventId : 48 and vectId (Interrupt) : 7
    ti.sysbios.heaps.HeapMem: line 307: out of memory: handle=0x10818510, size=1536
    Error allocating memory for Rx data buffer
    Error allocating Rx free descriptors
    Rx setup failed
    Error: Unable to register the EMAC
    ti.sysbios.heaps.HeapMem: line 307: out of memory: handle=0x10818510, size=88
    xdc.runtime.Error.raise: terminating execution
    [C66xx_1] HeapBufMP_open=0
    ***********************************************************↑abort()

  • striker:
    你好
    我自作的6657的板子 根据 SPI单核加载OK 通过评估板的evmc6657l.gel初始化我的板子
    在你的附件“SPI_boot_小论文.pdf”中写道“由于通过DDR暂存镜像文件,烧写程序在初始化EVM 板的时候需要选择no-boot 模式,只有在这种模式下gel 文件才会完成DDR3 的初始化操作”。
    “SPI_boot原理.pdf”中写道“ddr configuration table(可以没有,没有的话就不能再boot主代码前初始化ddr)”
    这样的话 DDR的初始化应该通过GEL还是ddr configuration table 有什么区别?

    既然用评估板的evmc6657l.gel初始化我的板子 目前没有问题 准备用你的方法、例程调试双核加载 那还用不用ddr configuration table?

    另外 用你的文件\spi_boot_suit_v2.3\1_utilities\0.6670\multicore_boot_1cores里的spiboot_multi_1cores_noddr.bat试了一下 单核也加载OK!!!

    双核加载 如有问题 还望指点。

  • Striker: 你好 又有问题 还望解答 memset( (void *) &sFlags, 0, sizeof(platform_init_flags)); memset( (void *) &sConfig, 0, sizeof(platform_init_config)); sFlags.pll = 1; /* PLLs for clocking */ sFlags.ddr = 0; /* External memory */ sFlags.tcsl = 1; /* Time stamp counter */ sFlags.phy = 1; /* Ethernet */ sFlags.ecc = 0; /* Memory ECC */ sConfig.pllm = 0; /* Use libraries default clock divisor */ pform_status = platform_init(&sFlags, &sConfig); /* Platform Information - we will read it form the Platform Library */ platform_get_info(&sPlatformInfo); 上面的程序实现什么功能 可不可以不要?? if (pform_status == Platform_EOK) 条件可不可以不判断??为啥要判断? 直接写Boot Magic add IPC中断可以不??? 说明一下 我不使用BIOS
  • Shihao Li,

    ti.sysbios.heaps.HeapMem: line 307: out of memory: handle=0x10818510, size=1536

    你的heapMemParams 的section为何放在了L2SRAM里?

    striker

  • FengYuan,

    • ddr configuration 表强烈建议加上。否则你的cmd 文件将不能映射“初始化段”到DDR。(包括.text .cinit .const 等等)
    • platform init是初始化DSP的代码。因为多核boot的逻辑是核0先完成初始化的工作再kick off 其他核。你可以根据自己需求修改删减。

    striker

     

  • Hi striker

    var heapMemParams = new HeapMem.Params();
    heapMemParams.size = 0x0000F000;
    heapMemParams.sectionName = "systemHeapMaster";

    Program.sectMap["systemHeapMaster"]     = "DDR3";

    这应该是放到DDR3里去的意思吧...

  • Shihao Li,

    并不一定。以你自己在cfg文件里建立的段映射为准。

    看来你的"DDR3" 没有在cfg里映射,那么heapMem默认映射到了L2SRAM

    striker

  • Hi striker,

    我还是不太理解

    Program.sectMap["systemHeapMaster"]     = "DDR3";  不是 .cfg里的段映射么

    我查了下map文件

    0x108x xxxx下只有

    .fardata.2里包含一条

    10818510    00000018     image_processing_evmc6678l_master_pe66.oe66 (.fardata:ti_sysbios_heaps_HeapMem_Object__table__V)

    ...和错误地址是一样的

  • Shihao Li,

    是的,没错。那你那样写是对的。但是不知道你为什么handle会出现在L2上。

    两个核的DDR3 是否映射到了不同的地址上?不要公用同一块DDR地址。

    还有疑问贴上你两个核的cfg文件。

    striker

     


  • striker:
    你好 非常感谢你及时的回复
    1 我程序中section都定义在L2 暂时就不用ddr configuration了 关键是.text .cinit .const等这些定义在DDR 程序执行的效率、速度有没有影响
    2 如果多核 看来platform init是必须的 因为boot room启动核0 核0初始化后再启动其他核 是这个意思吧??

    3
    编译你附件下的main、MulticoreBoot时 报错如下:
    <Linking>

     undefined           first referenced  
      symbol                 in file       
     ---------           ----------------  
     platform_delay      ./main.obj        
     platform_get_coreid ./main.obj        
     platform_get_info   ./MulticoreBoot.obj

    >> Compilation failure
     platform_init       ./MulticoreBoot.obj
     platform_led        ./main.obj 

    添加
    C:\ti\pdk_C6657_1_1_2_6\packages\ti\platform\evmc6657l\platform_lib\lib\debug下的
    ti.platform.evm6657l.ae66
    ti.platform.evm6657l.lite.lib
    编译都能通过
    两个有什么区别
    应该使用哪一个?

    添加
    C:\ti\pdk_C6657_1_1_2_6\packages\ti\platform\evmc6657l\platform_lib\lib\release下的
    ti.platform.evm6657l.ae66
    编译也能通过

    应该选择哪个了?

    4
    MulticoreBoot编译通过 连接评估板 加载之后 直接处于运行状态 而不是main函数的位置 怎么回事?

  • Hi striker
          大神,能不能提供下6657 demo板的DDR _Table表??或者6657的SPI烧写成功实例!万分感谢!!

  • Feng yuan,

    1. DDR 显然要慢很多,但是很少有工程不使用DDR的。

    2. 确实是这个顺序

    3. .ae66 的lib 就可以

    4. 这种情况很有可能是ti.platform.evm6657l.ae66用上了DDR,但是你的DDR未用gel初始化。还有可能是lib里的驱动与你的板卡在某些外设或时钟处不匹配。

    建议先跑通platform6657  test的工程(MCSDK里)。调整并重新编译6657l.ae66

    striker

  • hai cao,

    我自己本身没有6657的demo板卡,所以没法给你参考。

    但是理论上所有c66x 的spiboot 都可以使用该示例。

    SPI boot 应该对应6670的配置即可,楼上Feng yuan 似乎成功了。

    DDR table  也可以参考6670的配置。对应spi boot原理文档检查所有细节即可。

    striker

  • hai cao1:

    你好 我只实现了单核加载

    方法一:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/46608.aspx

    方法二:你也可以参考striker大神附件中这个文件夹下的例程

    \1423.spi_boot_suit_v2.3.1_release\spi_boot_suit_v2.3.1_release\spi_boot_suit_v2.3\1_utilities\0.6670\multicore_boot_1cores

    我总结的 希望有帮助:

    There are three types of tables used by the RBL:
    Boot parameter table
    Boot table
    Boot configuration table

    RMD格式:
    --ascii, -a Output ASCII hex format
    --boot, -boot Select boot mode
    --entrypoint,-e=addr Specify entrypoint address or symbol name
    --order, -order=L,M Specify data ordering (endianness)

    btbl格式:
    32位程序入口地址
    32位段长度
    32位段地址
    段长度对应的有效数据
    0x00000000结束

    i2c格式:
    i2c 文件被分成了不同的块,每块大小为128个字节,但文件中还没有加入启动参数,每个数据块格式为:

    2个字节块长度+2个字节校验+124个字节有效数据

    我板子的SPI参数表 你可以参考修改

    Boot Parameter Table

    SPI Boot Parameter Table:
    0 0050 80 Length
    2 0000 00 Checksum
    4 0032 50 Boot Mode
    6 0000 00 Port Num
    8 4020 PLL config, MSW
    10 0002 02 PLL config, LSW
    12 0001 1 options
    0 Load a boot parameter table from the SPI
    1 Load boot records from the SPI (boot tables)
    2 Load boot config records from the SPI (boot config tables)
    14 0018 24 Address Width
    16 0004 4 NPin
    18 0002 2 Chipsel
    20 0000 0 Mode
    22 0000 0 C2T Delay
    24 03e8 1000 CPU Freq MHz
    26 0000 0 Bus Freq, MHz
    28 01f4 500 Bus Freq, kHz
    30 0051 81 Read Addr MSW 实际改为00
    32 0400 1024 Read Addr LSW

    附件是我两种方法的实现

    桌面.rar
  • striker:

    你好 再次打扰了

    C:\ti\pdk_C6657_1_1_2_6\packages\ti\platform\evmc6657l\platform_lib\lib\debug
    C:\ti\pdk_C6657_1_1_2_6\packages\ti\platform\evmc6657l\platform_lib\lib\release
    下面都有ti.platform.evm6657l.ae66
    应该用哪个文件夹下的?

    platform_test好像在pdk_C6657_1_1_2_6下
    D:\ti\pdk_C6657_1_1_2_6\packages\ti\platform\evmc6657l\platform_test

    按照你最后的意思 ti.platform.evm6657l.ae66是通过platform_test编译生成的???
    是这样吗?感觉怎么越来越复杂了?

    我的QQ43854061 能否加一下你的QQ 方便联系?

  • striker大神 我把CMD中所有段都指定到L2 LOAD之后 进到main函数了 这样可以不?
  • hi, striker~

    很感动您一直坚持解答大家的疑问啊,根据之前的内容我们的spi boot也已经跑起来了

    不过我们现在是打算用pci-e boot,不知道您有没有研究过呢?社区里好像也没有找到相关的资料啊

  • Feng yuan,

    ti\platform\evmc6657l\platform_test 工程只是一个前端测试工程,也是调用ti.platform.evm6657l.ae66 库进行测试,

    而ti.platform.evm6657l.ae66 是由另外一个platform_lib 库工程进行编译的。

    我们一般的做法是把这两个工程先整合成一个完整的平台工程,然后再对应板卡相应修改代码测试。如果你自己有板卡初始化的代码,亦可替代前者。

    初始化板卡特别是初始化用户自制的板子本来就是一个需要调试的过程,复杂但是跟多核启动没有关系。


    cmd中可把.text 段放入L2即可,如果会cmd的一些语法技巧,只要把初始化主PLL的那一段代码放入L2即可,因为好像那块对代码时延有比较严格的要求。


    striker

  • Anqi Liu

    sorry , 没有调试过    :- (

    社区里找不到就试试英文论坛

    http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639

    仿照http://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/p/398823/1410205?keyMatch=pci-e%20boot&tisearch=Search-EN-Everything 发帖

    striker

  • 好的,还是谢谢啦~

    另外还有个问题,其实之前是在6670evm板子上跑通了,但是到了我们自己的板子上又有问题了

    我们现在是用了sysbios,cmd和firmware都是按照前面帖子里的配置的

    在我们自己的板子上的现象就是core0始终在0x20B0CA70这里循环,然后其他核一直停在IDLE

    然后直接看0x108FFFFC的值是0

    ----------------------更新---------------------

    请无视上面的问题吧,在0x20B0CA70这里循环是因为启动模式拨成了i2c boot.....

    现在的问题是core0一起来就跑飞了,怀疑是没有初始化ddr的问题

    (估计是由于demo板上是简化后的程序,没有用到ddr,所以放到自己的板子上也能跑,但是完整的工程用到了ddr,结果就跑飞了)

    关于DDR table的配置,我看到第一页的压缩包里有一个DDR3 Register Calc v4.xlsx的工具,在里面找到了下面第二行的这些参数:

    0x00, 0x00, 0x00, 0x70, 0x00, 0x8F, 0x35, 0x00, 0x02, 0x42, 0x80, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x02,
    0x63, 0x06, 0x2A, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x50, 0x11, 0x13, 0x78, 0x3C, 0x30, 0x71, 0x7F, 0xE3, 0x55, 0x9F, 0x86, 0xAF,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x70, 0x07, 0x32, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05

    我理解的就是根据上面表格工具里第一页的配置生成后面这些参数,然后写到ddr工具源文件的对应位置上

    但是ddr table里还有其他一些参数,不知道这些都是如何确定的呢?

    万分感谢~~

  • striker大神:

    看了你的最新回复 我有些晕了 O(∩_∩)O哈!

    你提到“初始化板卡特别是初始化用户自制的板子本来就是一个需要调试的过程,复杂但是跟多核启动没有关系。”

    既然没有关系 那你说的“初始化板卡”指的是platform_init 还是平常main函数中的 比如KeyStone_main_PLL_init(100, 10, 1);

    我现在是这么做的 建6657的工程 添加你2_ledtestprj\0.6670\src下的main.c MulticoreBoot.c CMD文件中指向DDR的段 全部改到L2 编译通过 LOAD到6657EVM 单步执行

    可以满足: if (pform_status == Platform_EOK)这个条件

    可以设Magic地址 及IPC


    ti\platform\evmc6657l\platform_test 工程只是一个前端测试工程,也是调用ti.platform.evm6657l.ae66 库进行测试,

    而ti.platform.evm6657l.ae66 是由另外一个platform_lib 库工程进行编译的。

    我们一般的做法是把这两个工程先整合成一个完整的平台工程,然后再对应板卡相应修改代码测试。如果你自己有板卡初始化的代码,亦可替代前者。” ----这些没看懂 不好意思


  • Anqi Liu,

    本帖附件的boot原理文档中关于DDR的部分应该对这些寄存器都有描述。

    但是最重要的还是你标出来的这些寄存器。可以参考xlsx文件配置。如果DDR走线严谨,这些参数即使差一点也不会有问题。

    要注意结合DDR时钟配置pllm,plld达到恰当DDR速率。速率可以由低配到高比如400~1333或更高。

    在做所有上述工作前确定你在线调试可以成功配置好DDR。

    striker

  • striker:

    大神,6657的SPI Boot,在你和yuang feng的帖子中,我已将No DDR的工程跑起来了!非常感谢你们。可是现在我只要加DDR,工程就跑不起来,你说加6670的DDR Table,我添加后,还是跑不起来,分析问题可能是DDR Table的起始地址不对,如下图,请大神们能否给出这个地址!!!拜谢!

  • 6657 DDR Configuration table 已解决,双核跑起来了

  • 使用6678evm板,使用spi boot 2.3.1release里的单核dat文件,烧写flash完成后读取和确认一直报错,是怎么回事。我的开发环境为ccs5.5,nor例子拷贝自mcsdk2_01_02_06路径里的nor\evmc6678l
  • lz,你好,我用了你工程中的例子在emv6678le的一块板块上4core自举成功了,因为这块板块上的eeprom没有烧写过ilb。在我的另一块板块上的eeprom烧写ibl,但是我又烧写了一个.dat到eeprom中已将原来烧写的ibl覆盖了,为啥自举还是失败的。我看到你的文档中写道要将eeprom ibl镜像给刷掉,请问你是怎么刷掉eeprom中的镜像的?

  • 你好,请问一下,你修改了那里就成功了。我是在eeprom中烧了ibl,我把她用别的.bin覆盖了,可是还是不行。

  • 您好,想请问您striker大神给的addddrtable的源代码中,

    const unsigned char ddrtable[120]={
    0x00, 0x00, 0x00, 0x70, 0x00, 0x87, 0x35, 0x00, 0x02, 0x42, 0x80, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x02,
    0x63, 0x06, 0x2A,...

    这120个字节分别代表什么,要修改参数,但是不知道怎么修改,还望您指导一二,感激不尽。

  • 你好  我最近在研究C6657的IBL boot,按照您写的流程以及看了官方的例子都没有boot成功,我目前只是做了单核的boot尝试,请问您那有相关的资料可以参考吗或者可以提出一些宝贵的意见吗,这是我的QQ819590597,希望可以得到您的回复,急急急!!!

  • 不建议使用IBL 启动,直接参考附件中SPI 多核boot 的例子更简单。 

    striker

  • 你好 我正在测试6657的spi norflash启动,有两个问题需要请教一下

    1.目前我已经调通了单核没有DDR、以及没有sysbios的简单的闪灯程序的boot,但是放上DDR与系统之后再次烧写进去之后没有boot成功。我想请问一下加上DDR与系统之后需要做哪些修改呢?.cmd文件需要更改吗?

    2.有一点比较奇怪我的.cmd文件把做了这个处理.cinit      >       L2SRAM,为什么我编译后的.map文件里会有NTRY POINT SYMBOL: "_c_int00"  address: 8003c620,这个语句是不是说明我的c程序入口被放到了DDR上了呢??这会不会是我不能正常boot的原因呢??我该怎么更改呢

    非常期待您的及时回复,急急急!!

  • Peishu Yan,

    你好,请你查看一下本帖子的前10页。你的问题在里面有详细的讨论。

    striker

  • striker,你好!我现在在弄C6657的IBL,您能帮我看一下我遇到的问题吗?谢谢!

    我按照论坛及mcsdk下的步骤烧写完IBL程序后,发现IBL没有正常加载,挂载仿真器后pc指针为0x20B0F70,说明没有boot。利用示波器观看DSP读完I2C之后没有去读SPI。同时我发现了两个十分怪异的问题,希望能得到您的回答:

    1.为什么IBL 的I2C以及SPI程序烧写完成后,选择正确的IBL启动方式后通过仿真器连接core0发现devstat的值是0x00000001呢?!这是不是非常的怪异呢。我之前观测过spi的加载方式时,devstat的值是正确锁存的而且我把I2C芯片拆掉后再次挂仿真器观看devstat的值是正确的IBL加载方式。这是什么原因造成的呢???

    2.IBL启动时我通过示波器观看I2C的启动时钟发现并不是程序里配置的100K,而是大致分成了两部分的加载时钟。加载过程中的大概三分之二的时间sclk为200K、但是我看程序里应该默认的是100K,后三分之一的时间过程中频率也就10K的样子。这会是什么原因呢???

  • Striker:

     你好,感谢你提供的众多资料与解答。有以下几个问题请教:

    1 AddDDrTable中关于ddr pll锁相环的配置问题,如下所示系数,对应输入时钟为66.6M hz,输出的DDR数据采样频率为66.6*28/2*2 = 1864.8 Mhz,对吗?

    0x00000000,      // pllPrediv   

    0x0000001C,      // pllMult          

    0x00000002,      // pllPostDiv      

    2 使用你提供的资料已在自制板上成功进行了spi单核与双核引导启动(其中text,const等section都是映射在ddr上),对应的DDR芯片为MT41J256M16-15E(1333M)。现在我们硬件改版后,DDR芯片换成了MT41K256M16-107,用TI提供的DDR参数工具得到配置系数后,仿真器在线模式下DDR能正常读写,但是烧写到spi flash后不正常,我个人怀疑以下几个地方:

     2.1 芯片rom的引导程序没有对DDR进行leveling校正过程,请问是否会造成DDR时序上的异常?论坛内是否有人遇到过因没有leveling校正而导致的DDR读写异常;

    2.2 AddDDrTable中的寄存器,由configSelect来控制具体的配置掩码,当前版本中寄存器0x00000305       // rdWrtExcThresh这个没有在gel或者程序配置过程中找到对应代码位置,请问这个对DDR时序影响大吗?

    0x024280F5,      // configSelect   (need)

     

    0x00000000,      // pllPrediv      (need)    

    0x0000001C,      // pllMult        (need)    

    0x00000002,      // pllPostDiv     (need)     

     

    0x63062A32,      // sdRamConfig    (need)    

    0x00000000,      // sdRamConfig2  

    0x00001450,      // sdRamRefreshCtl(need)     

    0x1113783C,      // sdRamTiming1   (need)    

    0x30717FE3,      // sdRamTiming2   (need)    

    0x559F86AF,      // sdRamTiming3   (need)    

    0x00000000,      // lpDdrNvmTiming

    0x00000000,      // powerManageCtl

    0x00000000,      // iODFTTestLogic

    0x00010000,      // performCountCfg

    0x00000000,      // performCountMstRegSel

    0x00000000,      // readIdleCtl

    0x00000000,      // sysVbusmIntEnSet

    0x70073214,      // sdRamOutImpdedCalCfg (need) 

    0x00000000,      // tempAlterCfg

    0x0010010F,      // ddrPhyCtl1           (need) 

    0x00000000,      // ddrPhyCtl2

    0x00000000,      // priClassSvceMap

    0x00000000,      // mstId2ClsSvce1Map

    0x00000000,      // mstId2ClsSvce2Map

    0x10000000,      // eccCtl               (need)

    0x00000000,      // eccRange1

    0x00000000,      // eccRange2

    0x00000305       // rdWrtExcThresh       (need)

  • LZ

    为什么我用6678EVM开发板测试附件中例程还是DDR初始化失败呢,不应该是针对6678开发板直接可用的吗?

    具体描述和修改为BIOS后的程序:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/138757.aspx

  • 那位大神能分享下c6657+ddr+bios的spi加载例程,感激不尽!!!

  • 您好,我使用sysbios开发后,编译出的.out文件有7M大,使用您工具包中的 singlecore_boot_not_support_large_binary 工具进行转化,转化出的.dat文件只有211K,这可以确定转化是错误的,但转化过程中没有报错,随后按照您工具包中的 multicore_boot_1cores 工具修改了6678 的转化工具,工具转化.out文件转化为1.2M,我想问一下,这个转化的是否正确呢?以及 singlecore_boot_not_support_large_binary 和 multicore_boot_1cores 工具最大能转化的文件大小是多少?
  • strike大神 你好

    我用的是6657 spi nand flash 裸机下的单核 双核都加载成功

    裸机的双核 我是按照网上的教程 在各自CMD文件定义:

    .myboot
    {
    *.*<boot.obj>(.text)
    } > BOOT_CORE0

    BOOT_CORE0: o = 0x10800200, l = 0x000000c0

    .myboot
    {
    *.*<boot.obj>(.text)
    } > BOOT_CORE1

    BOOT_CORE1: o = 0x11800200, l = 0x000000c0

    同时 核0的程序中给核1发IPC中断 写Boot magic address:

    MulticoreBoot()

    {}

    sysbios下的单核加载试过可以

    现在要实现sysbios程序的双核加载 有个疑问:
    如何在sysbios中实现:
    .myboot
    {
    *.*<boot.obj>(.text)
    } > BOOT_CORE0
    .myboot
    {
    *.*<boot.obj>(.text)
    } > BOOT_CORE1

    我尝试修改为:
    .myboot
    {
    *.*<boot.oe66>(.text)
    } > BOOT_CORE0;

    但报语法错误!!

    我现在遇到问题 你们早都遇到解决了 还望回答下!

  • 改为 boot.ae66<boot.oe66>(.text)