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的加载。

  

  • 1. parameter table里写的是主PLL,这里是DDR的PLL,这些跟你自己的板子用的时钟方案相关

    2. 该贴第一页有工具的附件,可以生成DDR table需要的东西,记得更改exe名

    3.可以完全不理会boot parameter table,已经写死了,要改的只是DDR的table

    4.建议使用1coreboot 那一套工具链而不是singecoreboot,romparse工具有大小限制,建议用qfparse。该过程的确是将表头加到数据前面

    希望能帮助到你。

  • 谢谢您的解惑,感谢啊。我现在还在尝试进行八核不同工程的自加载,一直不能成功,我确定MulticoreBoot函数没有写错,一直用的是您给的那个,没有经过任何的修改,但找不出其他的原因。

  • 检查以下:

    1. 确定别的核没有起来还是跑飞了,用仿真器 load symbol 连上去看

    2.核0起来没有

    3.别的核cmd文件是否使用了全局地址

  • hi striker striker

    核0没有跑起来,这怎么查原因呀?我在核0的工程代码中加入了UART的串口输出代码,八个核工程一样时,利用您给的SPI NOR FLASH工程,可以完成自加载,并且串口可以看到输出,但现在每个核的工程代码不一致时,核0 的输出也没有

  • striker 您好

    我利用该贴第一页的工具,想重新生成DDR table的exe应用程序,但是用C++软件打开后,debug不成功,生成不了正确的exe,这里是需要添加一些源文件之类的吗?

  • striker  您好! 现在正在调试6678的spi模式下加载单核boot程序。我是用你提供的工具先将.out文件生成.dat文件。然后用自己写的flash程序烧写进norflash(型号为N25Q128A,和开发板上的一样),然后bootmode调为spi模式(pin[0..15] = 1011  0000  0010   1000),关电重启。但是程序没有加载成功。我想是不是我烧写的.dat文件格式不对,于是再把板子改为 no boot模式,用仿真器再烧写一次dat文件,可是程序中我初始化SPI口寄存器的时候,寄存器值为全0,写不进去。请教一下,是怎么回事,不甚感激!

  • 您好,Canyu Su
    我最近刚刚开始在做I2C IBL引导 Nor flash DSP6678多核加载,感觉没有太多的思路。您能方便提供一些论坛资料或者例程吗?

  • hi 我今天跑了一整天的程序,八个核的自加载确实不能成功启动,问题在于核0也没有正确启动,我观察了核0的MAGIC ADDRESS  不是全局地址,是0x00800000,但是八个核工程代码完全一致的自加载能成功,并且核0-核7的MAGIC ADDRESS  都是全局地址,是0x1x800000,这是为什么呢?

  • 请问你 八个核代码相同的核0 代码以及cmd文件 与 八个核不同代码的核0代码以及cmd文件有什么区别? 如果cmd里填写的是全局地址,这种现象的确不应该出现。

  • 您想说的是boot不起来还是无法烧写.dat? 如果是第一个问题可以试试工具包里面自带的.dat 能不能启动起来(如果非EVM板可以仿照示例自己写一个简单的工程,注意cmd文件)。后一个问题跟你是什么boot模式没有关系,是不是从来没有烧写成功过任何东西到flash?跑通过flash的自测吗?如果这样的话,检查一下的上电时序,是不是供电或DSP复位等待的时间不够长?

  • 您好,八个核代码相同的核0 cmd文件 与 八个核不同代码的核0 cmd文件是一样的,但是八个核代码相同的核0 代码 与 八个核不同代码的核0 代码不一样,不过我只删掉了Switch case语句里面关于其他核的点灯或者UART串口输出的代码,其他的都一样。

  • 方便的话贴代码原型吗

  • 您好 我刚刚把每个核的MuticoreBoot 函数都加上了,这样试的话就没有问题了 可能是那个函数里面有些东西涉及到硬件系统的初始化吧 现在可以了 谢谢啊

  • 你好 striker striker

       我最近在研究6678的boot问题 我开发平台是在EVM6678 软件为CCS5.2.1  按照你的方法对单核进行boot   每一步骤都会在console出现successfully 所以我估计我boot进去了 但为什么我断点重启之后 不是我要的现象啊(我把点灯程序改成流水灯了) 我用的是mcsdk_2_01_02_06   请问是什么原因? 另外no boot mode 拨码开关 pdf写的是 sw3-sw6 :1000 0000 0000 0000 与你写的不一致 到底是多少? 而自启动拨码开关是多少?  

    还有个问题 我看别的帖子 说mcsdk_2_01_02_06这个版本nor或者nand flash时的起始地址可以写成0x0C000000 不用写成0x80000000  这个可行吗?

    麻烦你了 谢谢

  • 您好  striker striker

    这段时间麻烦你了 帮我找各种bug 谢谢~

    我现在也在做ibl NAND FLASH的 自加载。现在单核IBL nand boot可以成功了,就是不知道该如何做多核的程序自加载呢?

    不知道您是否有过相关方面的开发经验,如果方便能提供一些例程吗?不胜感激


  • Hi,Xinggen

    既然是EVM板,应该很容易就能实现boot,请你按照以下步骤尝试以下:

    1.使用随工具自带的.dat 文件实现单核boot

    2.自己制作一个.dat文件,可以不是亮灯程序,但是要参考亮灯程序的cmd文件,尝试单核boot。修改完boot pin 启动后,用仿真器连接上板子,不要自动load程序,选择自己被烧写工程的.out 进行load symbol , 看看PC指针是否指向代码而不是0x20B00000(boot rom),这样就可以知道是否boot起来

    3.使用工具自带dat文件实现多核boot

    4.自己写多核程序实现多核boot。

    拨码pin按照我们的来没有问题,load地址不用修改,区别只是数据在待烧写的时候是放置在共享内存还是DDR而已,跟flash没有关系,祝你好运。

  • Hi,zhonghong

    我也没有nand 多核 boot的直接经验,以上的工具链如果要能在nand上boot,得严格对照boot rom 源码 修改boot parameter table。

    但是我知道借助IBL使用MAD确实是一个可行的方式,在你NAND单核boot成功的前提下,仿照mcsdk_2_xxxx\tools\boot_loader\examples\mad 里的示例应该能够生成一个可以被IBL识别的多核boot镜像,这样就能实现NAND Multicore boot 了。

    祝好

  • hi  striker

    不好意思,才看到您的回复。谢谢呀,我先尝试一下MAD工具

  • 你好  striker  首先感谢你的回答

    “使用随工具自带的.dat文件实现单核boot”  这句话是什么意思 能具体些吗?

    我用的是CCS5.2.1  我怎么没有找到直接连接硬件的设置啊? 能具体说明下吗? PC指针应该怎么看? 

  • striker striker 说:

    【6678/6670 SPI Nor flash  多核boot原理总结和demo 请参考后面帖子的附件���

    Hi Striker,

    Just leave a message here to say many thanks to you.

    Thanks for your hard work and documents, it did work and provide a great guideline for understanding the boot flow and fundamental of ROM file format.

    Thank you.

    Henry

  • Hi, Henry

    Very Glad to hear it that my work helps . Hope this boot test suite could save more people from a mass of docs and specs. Also I'm looking forward to all your feedbacks.

    Thanks,

    Striker

  • ,你好!你的论文、代码帮了我大忙,非常感谢您的分享精神!

    关于工程代码我想问个问题,映像是怎么从FLASH搬移到内存中的呢?我在代码中没有发现相关的搬移代码,另外boot magic操作原理还不是特别清楚,麻烦请您指教一下。

    另外,运行您提供的项目,在过程中通过core0对core4做local reset操作,向core4发送IPC中断,然后deassert local reset core4,但core4没有再次运行起来,请问如何才能让core4再次从头运行,谢谢!!!

  • Michael 你好,

    • 映像从flash搬移到内存是有bootrom 完成的,其作为“rom boot loaeder”(RBL) 是固化在dsp ROM里,源码可参考http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/6352.aspx
    • 我们外围工具所做的是按照源码和文档约定的格式向其送入镜像数据和表头,因此boot的原理也分为两部分,如果是搬移和解析的过程请参考源码,而镜像制作的过程就可以参照我的帖子里面的附件,如果还有疑问,访问这里http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/5394.aspx
    • 按照@Zhang Xiang 的说法,只有POR,RESETFULL,hard reset会重新执行bootloader,core0会从Boot Magic Address(固定存放c入口地址的地址)里找到启动地址后启动,然后唤醒别的核。如果只是local reset会直接从根据寄存器PWRSTATECTL寄存器的值来确定从哪里开始执行,可以是LL2的起始地址,也可以是MSMC起始地址,也可以是DDR3的起始地址,或者进入到idle状态。你希望的应该是写上你自己的_c_int00_ 入口地址。

    Striker

  • Striker 你好,

        现在已经解决了local reset后的重新运行问题,再次感谢您及时及细致的回复,谢谢!祝您身体健康,工作顺利!

  • Striker 您好:

        不好意思还要麻烦问您几个问题:

    我想在您给出的工程基础上实现8核各自独立代码的加载启动(已经实现了8核共用一份源码启动)。我将main.c和MulticoreBoot.c文件复制到8个项目各自的文件夹中,并删除了与当前核无关的代码,8个项目都保留MulticoreBoot()接口、cmd文件也没有改动,但实际运行结果是core0都没能跑起来,请问我少做了哪些东西?

    您在您的论文中说“但是如果各核编译各自独立工程,各变量内存映射关系不再相同,那么就无法从core0的Boot Magic地址里的值去推算其他核相应地址。这个时候只能事先记录下各核的Magic地址,然后写死在核0的用户初始化代码上。各核的Magic的地址是否由cmd文件决定?如果在cmd文件没有变化的情况下内存映射关系与之前共用一份源码相比会有变化吗?

    我对这块板子的内存管理映射等问题还认识很模糊,麻烦您能给我指点一二,如有打扰还请见谅,谢谢!!

  • 你好,我看到您已经实现了8核各自独立源码的引导,我现在的情况和您当初一样core0都没有跑起来,麻烦您能不能指点下应该如何做,谢谢。

  • Michael,

    core0 启动不起来似乎与别的核没有关系,请单独烧写核0再做测试以保证核0正确。

    对于后一个问题,首先我们要知道为什么8核公用一份源码启动BootMagic Address 只需要经过简单的加核间偏移量就ok:因为代码相同,编译时各代码段数据段在RAM,MSMCSRAM或者DDR上的映射完全一致,以至于存放cint00 的boot.obj在核内RAM的位置完全一致,所以假如我知道核0的入口地址是0x108xxxxx,核1的入口地址一定是0x118xxxxx. 所以代码不一致,上面的推算就不适用了。但是毕竟编译每个核后记录地址再写死这种方法太过麻烦,于是我们有一个workaround,在每个核的cmd文件里将入口地址写死,任你代码变化我的启动地址始终一致。这样就达到和公用同一份源码一样的效果,参照led灯示例程序里的cmd文件,以下代码便是实现该功能:

    Memory

    BOOT_CORE0   : o = 0x10800000,   l = 0x000000c0

    Section

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

    } > BOOT_CORE0

    按照你的描述你保留了以上cmd文件和MulticoreBoot接口,方法上没有问题,所以还是检查core0 boot 失败的原因。

  • striker :

        您好,再次感谢您的细致解答。我还在解决8个core各自独立源码的问题,现在现象如下,将完全一样的main.c和MulticoreBoot.c文件(包含0~7号核全部代码)复制到8个项目各自的文件夹中编译并通过工具链生成.dat文件,固化到开发板可正常运行;将某个core工程,比如core7工程中与其无关的代码删除,再次制作出的.dat文件就不能运行,core0都没有启动,感觉似乎RBL搬移映像就没有完成。这是否是工具链生成.dat文件过程中有问题?我是否需要修改工具链中的i2crom.ccs、.rmd文件或是要修改您提供的工具?多有打扰,谢谢!

  • Michael,

    你好,首先不好意思,是我的疏忽将所有核的cmd文件部分section 指向DDR同一个位置,因此出现overlap。当每个核工程相同时还能共用,一旦不一致就会发生异常。现已修改好请参见12L 附件patch。工具链不需要修改。

    striker

  • striker:

        您认真的态度和乐于奉献的精神让人尊敬,再次感谢您!

        另外想问一个关于cmd文件的问题:

    Section

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

    } > BOOT_CORE0

    boot.obj是由哪个文件编译生成的呢?为什么工程里找不到boot.obj呢?

    我在项目里增加了RTSC的cfg文件,编译时会提示"*.*<boot.obj>(.text)"这一句

    Description Resource Path Location Type
    #10068-D no matching section simple.cmd /simple0 line 31 C/C++ Problem

    而不增加cfg文件的工程就没有这个问题。

     

  • Michael Fassbender,

    基于RTSC的工程无法用cmd文件来实现Memory 段的定义。而是由RTSC platform configs 来指定。

    • 选择自己的platform config 在 自己项目的property-Gerneral-RTSC-Platform里选择,ccs会自动搜索你上面指定的路径找到合适的configuration file,默认的话你使用的是ti.platforms.evm6678
    • 你可以创建一个新的config也可以修改ti.platforms.evm6678, 点击屏幕右上角进入进入CCS debug perspective,选择tools-RTSC tools-platform-edit/view,默认的package都在C:\ti\xdctools_3_23_03_53\packages 下,找到你使用的ti.platform.evm6678 然后仿照cmd文件虫建你自己的映射吧,记得要用全局地址
    增加了BOOT_CORE0 之后no matching section name 的错误就会消失
    Striker
  • striker:

        您好!请问基于RTSC的工程无法用cmd文件来实现Memory 段的定义,但能否用cmd文件实现section的定义呢?

    如果不能的话.myboot 段(已经在cfg文件中增加了BOOT_CORE0和L2段的定义

    .myboot

    {

        *.*<boot.obj>(.text)

    } > BOOT_CORE0

    应该如何通过cfg文件来定义呢?

    现在我在cfg文件中定义Memory 段,用cmd文件定义section段,编译时依然报“*.*<boot.obj>(.text)”这一行“warning #10068-D: no matching section”。

    麻烦您了,谢谢~

  • Michael,

    section段可以在cmd中指定,也可以在cfg中定义。如果想使用cfg文件,语法得参照相关SYSBIOS6 文档

    striker

  • striker:

        您好!我已经在cfg中定义好了memory段,看linker.cmd文件已正常定义,如下图:

    CMD文件如下图:

    编译时依然提示

    郁闷到了……

  • Michael

    查看MAP文件并搜索_c_int00 会发现RTSC 工程的boot段变成了 boot.ae66 : boot.oe66 (.text:_c_int00)

    于是应该改写为:

    .myboot
    {
    boot.ae66< boot.oe66>(.text)
    } > BOOT_CORE

    Striker

  • striker:

    您好!根据您的提示,我将cmd文件改为了:

     

    可以通过编译。但是,在使用工具链生成dat文件时会有问题:

    以core0的工程为例对比以前能正常引导的工程的SPIBOOT0.map文件如下:

     

    请问这是我连接配置不正确的问题还是工具链需要修改?我将我的core0工程上传到了附件中。

    不好意思总是给您添麻烦,谢谢!

    ======================================================================================================

    我删除了cmd文件中多余的段定义,就可以正常生产dat文件,并且能正常引导运行了,感谢您的悉心指导!

  • 请问您在CFG文件中怎么定义BOOT_CORE段,能不能把相关语句贴出来看看

  • striker在本页的有这个问题的描述,进入RTSC的配置页面后按下图设置即可:

  • 谢谢您的回复,这个图是创建platform时的界面,你在CFG里面是怎么描述 .myboot      {         *.*<boot.obj>(.text) }的 ,还是直接在编译生成的cmd文件中添加的

  • 我保留了自己写的cmd文件,并在该cmd文件中按照striker的提示定义.myboot:

    .myboot
    {
        boot.ae66<boot.oe66>(.text)
    } > BOOT_CORE

  • 你好 striker

    我开始在自己做的板子上跑boot代码,之前用您的例程完成过6678开发板的SPI boot,非常感谢您的慷慨分享以及对我的帮助。

    我现在需要修改DDR table参数值,在boot之前完成DDR的初始化。因为现在的数据量很大,会用到DDR空间。我看过DDR table的定义,有很多的寄存器,您说的对照suite里的说明和文档,具体应该修改哪些呢?可以提供一些应用板卡开发的工程经验吗?

  • Hi,zhonghong

    参考13L的DDR table 计算工具附件,论坛上分享并经常使用的。

    对照表格填写DDR器件性能参数会自动生成寄存器值。

    striker

  • 您好,striker 

    我下载了8713.ddr_cal_tool压缩包,打开之后只有两个EXCEL的表格,里面并没有看到您说的 计算工具?

  • 您好!看了您的帖子获益良多!

    我现在在6678evm板子上用nor writer烧写nor flash显示如下

    请问这是表示烧写成功了么?

    我再掉电后再上电,修改boot方式,通过查看什么可以知道boot成功了呢?

    麻烦啦~

  • zhonghong你好!我的开发板是6657ls,目前也在考虑nor nand启动的问题。有一些问题不太明白,您可以帮助我们吗?可以给我留个您的qq或者邮箱吗?我的qq是:453 968 863 期待您能联系我,有些问题方便向您请教。十分感谢!

  • Striker

        您好!不好意思又来麻烦您,是这样的,我在bios_start()后对core进行local reset发现core不能再次运行,对此TI的工作人员解释如下“触发reset后代码会找到reset对应中断程序入口地址,然后跳转到那个地方,而使用软件或者watch dog等方式触发reset,应该不需要软件指向reset 入口,硬件会自动根据之前配置的中断矢量表跳转到reset对应的入口地址,一般是c_int00.”,请问中断矢量表在哪里可以进行配置?如何修改local reset才能在bios_start()后将core local Reset?谢谢您!!

  • 你好,我现在也是可以通过编译。但是,在使用工具链生成dat文件时会有问题.你说“删除了cmd文件中多余的段定义,就可以正常生产dat文件,并且能正常引导运行了”,请问具体是什么操作。能不能留个联系方式

  • striker大神您好!

        谢谢您的乐于助人和无私奉献!

        我使用的是我们自己做的6657的板子,现在还在参照您的例程尝试使用我们自己做的板子进行spi单核boot。

        我们使用的是6657,挂的flash是at25dl081没有ddr,所以使用的是我们自己写的烧写工程,测试工程是使用GPIO点灯的程序。

        将*.dat文件烧入FLASH的0x0地址,重新上电后,没有点灯现象发生,期间使用示波器测量发现, DSP 一直给 SPI 发送命令,而SPI 从未给 DSP 发送数据。

        还望您和论坛里的各位大神不吝赐教!

        谢谢!

  • hi wj,

        我的理解是他在第一步的时候报告了很多warning,参照warning删除了未用到过的多余的段定义。

        你在使用工具链生成dat文件时出现了什么问题?