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.
SPI NOR boot
【6678/6670 SPI Nor flash 多核boot原理总结和demo 请参考12L 13L帖子的附件】
示例包括:
----------------------------------------------------------------------------------------------------------------------------------------------------
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函数没有写错,一直用的是您给的那个,没有经过任何的修改,但找不出其他的原因。
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,写不进去。请教一下,是怎么回事,不甚感激!
hi 我今天跑了一整天的程序,八个核的自加载确实不能成功启动,问题在于核0也没有正确启动,我观察了核0的MAGIC ADDRESS 不是全局地址,是0x00800000,但是八个核工程代码完全一致的自加载能成功,并且核0-核7的MAGIC ADDRESS 都是全局地址,是0x1x800000,这是为什么呢?
您想说的是boot不起来还是无法烧写.dat? 如果是第一个问题可以试试工具包里面自带的.dat 能不能启动起来(如果非EVM板可以仿照示例自己写一个简单的工程,注意cmd文件)。后一个问题跟你是什么boot模式没有关系,是不是从来没有烧写成功过任何东西到flash?跑通过flash的自测吗?如果这样的话,检查一下的上电时序,是不是供电或DSP复位等待的时间不够长?
您好,八个核代码相同的核0 cmd文件 与 八个核不同代码的核0 cmd文件是一样的,但是八个核代码相同的核0 代码 与 八个核不同代码的核0 代码不一样,不过我只删掉了Switch case语句里面关于其他核的点灯或者UART串口输出的代码,其他的都一样。
你好 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 了。
祝好
你好 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
striker striker,你好!你的论文、代码帮了我大忙,非常感谢您的分享精神!
关于工程代码我想问个问题,映像是怎么从FLASH搬移到内存中的呢?我在代码中没有发现相关的搬移代码,另外boot magic操作原理还不是特别清楚,麻烦请您指教一下。
另外,运行您提供的项目,在过程中通过core0对core4做local reset操作,向core4发送IPC中断,然后deassert local reset core4,但core4没有再次运行起来,请问如何才能让core4再次从头运行,谢谢!!!
Michael 你好,
Striker
Striker 您好:
不好意思还要麻烦问您几个问题:
我想在您给出的工程基础上实现8核各自独立代码的加载启动(已经实现了8核共用一份源码启动)。我将main.c和MulticoreBoot.c文件复制到8个项目各自的文件夹中,并删除了与当前核无关的代码,8个项目都保留MulticoreBoot()接口、cmd文件也没有改动,但实际运行结果是core0都没能跑起来,请问我少做了哪些东西?
您在您的论文中说“但是如果各核编译各自独立工程,各变量内存映射关系不再相同,那么就无法从core0的Boot Magic地址里的值去推算其他核相应地址。这个时候只能事先记录下各核的Magic地址,然后写死在核0的用户初始化代码上。”各核的Magic的地址是否由cmd文件决定?如果在cmd文件没有变化的情况下内存映射关系与之前共用一份源码相比会有变化吗?
我对这块板子的内存管理映射等问题还认识很模糊,麻烦您能给我指点一二,如有打扰还请见谅,谢谢!!
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 来指定。
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
查看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文件,并且能正常引导运行了,感谢您的悉心指导!
谢谢您的回复,这个图是创建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
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文件,并且能正常引导运行了”,请问具体是什么操作。能不能留个联系方式