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的加载。
zhonghong zhang,您好,
我现在也在跑一些keystone的例程,同样SPI加载无法成功,不知道您是否有找到问题所在?
我在striker提供的Led点灯例程的基础上,将UART例程的代码搬移进来,但在main程序中并不执行这些代码,依旧只是跑led点灯程序。其他没有做任何变化,包括.cmd文件。no boot加载可以正常执行,但SPI boot不行。查看Magic Address为全0。用工具生成.dat文件时的.map文件如下:
******************************************************************************** TMS320C6x Hex Converter v7.2.1 ******************************************************************************** INPUT FILE NAME: <simple0.out> OUTPUT FORMAT: ASCII-Hex PHYSICAL MEMORY PARAMETERS Default data width : 8 Default memory width : 32 Default output width : 8 BOOT LOADER PARAMETERS Table Address: 0x0880, PAGE 0 Entry Point : 0x10800000 (_c_int00) OUTPUT TRANSLATION MAP -------------------------------------------------------------------------------- 00000880..0200087f Page=0 Memory Width=32 ROM Width=32 "ROM1" -------------------------------------------------------------------------------- OUTPUT FILES: simple0.btbl [b0..b31] CONTENTS: 00000880..0001676f BOOT TABLE .text : btad=00000880 dest=108000c0 size=00013700 .DDRText : btad=00013f8c dest=108147c0 size=000001c0 .const : btad=00014154 dest=80000000 size=00002194 .switch : btad=000162f0 dest=80004ae0 size=0000001c .cinit : btad=00016314 dest=80004b0c size=000003c8 .myboot : btad=000166e4 dest=10800000 size=00000080
不知道该.map文件有没有问题?
striker,
谢谢您的答复。
cmd文件指定地址是用的全局地址。我现在尝试在您提供的Led点灯例程的基础上,将UART例程的代码搬移进来,但在main程序中并不执行这些代码,依旧只是跑led点灯程序。其他没有做任何变化,包括.cmd文件。no boot加载可以正常执行,但SPI boot不行。查看Magic Address为全0。按照之前帖子的内容,有说道可能是.dat文件制作过程出错,但是我在制作过程中没有发现报错,如下图:
如我楼上回帖所述,我爬楼看了下讨论,发现和 zhonghong zhang 之前提到的一个问题类似,
连上调试器看了下PC指在boot rom中的某个地址。不知道您能否帮我解决这个问题。我的qq:578587463.
zhonghong zhang,
我现在是在EVM上进行单核SPI启动。
我将cmd的各段都映射到L2中,现象依旧,magic address为全0,PC指向boot rom中的某个地址。
您之前有过这个尝试,并也有过类似的问题,不知道您后来解决了么?
hi, 多谢您的回复
现在好像找到原因了,我是现在另一篇文档里找到了parameter table的具体说明:
其中第三行,用您的工具生成出来的参数是0x02005140,当我把这行改成0x02055140之后,就成功boot起来了
现在比较奇怪的就是文档里说SPI Boot的时候是不需要配置PLL的,但是这里看来配置错误的话是起不来的
另外我之前在置顶的资源帖里还找到另一个生成镜像的压缩包,里面有一个nysh.spi.map的文件,里面内容如下:
section {
boot_mode = 50
param_index = 0
options = 1
core_freq_mhz = 800
exe_file = "simple.i2c.ccs"
next_dev_addr_ext = 0x0
sw_pll_prediv = 5
sw_pll_mult = 32
sw_pll_postdiv = 2
sw_pll_flags = 1
addr_width = 24
n_pins = 4
csel = 0
mode = 0
c2t_delay = 0
bus_freq_mhz = 0
bus_freq_khz = 500
}
看内容是有对PLL的配置的,这个配置实际有没有意义先不管,但是最后生成的镜像里面,针对PLL参数这一行是0x02002040,第三个字节也是00
按照上面图片里的的公式在最后生成的dat里直接改掉这三个参数(这是经过大小端转换的,和上面图里对应的话需要调转一下)
目前只试了这两个:0x03056240(对应频率是800)和0x02055140(对应频率1000)就能boot起来
试了一次改成了0x03016240就起不来了,我理解的是至少需要保证频率在一个适当的范围内(几百MHz),才能boot起来
现在就是不太明白为什么生成的dat文件里这个第三个字节会是0...或者是PLL的模式设置的不对?
.
多谢多谢~
Anqi liu:
我之前跑起来的是在demo板上的,感觉应该是由于demo板上一直是用i2c boot,在这个过程里面会把pll初始化起来,所以就没有使用dat里的配置
总之现在问题应该是解决了,不知道后期跑我们自己的工程会不会遇到问题,到时候可能还要请教您啦
再次感谢!
Hi striker,
我终究还是没有找到问题所在。我只是在LED点灯程序中将Keystone_common.c/.h文件加入,其他再无变化,依旧不能spi引导成功。去掉就可以成功。
我将我的工程附上,不知道您能否帮我看下是否有问题,告诉我您能否将它SPI引导成功。如果您可以,那应该就不是工程问题,而是.dat文件的制作过程有误或别的原因。不知道您能否帮看下?
Anqi Liu
您好 我现在也遇到了您的问题 我的是6678的芯片 也是改PLL配置参数这一行之后就不能boot了,改成1G 935M这两个值都不行,但是用帖子里面默认的配置 100*19/2 = 950就可以,但是我自己的板卡参考时钟是156.25MHz,这样PLL主时钟经测试为1400M多?
我应该如何修改这个PLL配置参数值啊?
striker striker
您好
我现在也遇到了Anqi liu类似的问题,我的是6678的芯片,也是改PLL配置参数这一行之后就不能boot了,但是用帖子里面默认的配置 100*19 / 2 = 950就可以,但是我自己的板卡参考时钟是156.25MHz,这样PLL主时钟应该为156.25*19 / 2 ,由于板卡有个六分之分频,我利用它可以测得时钟确实是在1400多MHz,这已经超出了芯片的最高时钟,但是板卡能够正常boot,并且运行程序。我修改参数multipiler divider使时钟为1G 935M这两个值都不行,不能boot ?
我应该如何修改这个PLL配置参数值啊?还是有哪些地方没修改正确?
striker ,
谢谢您耐心的回复,我的问题已经找到并解决。
我出错的原因在于没有将需要烧写的.dat文件放到指定的目录下,因此烧写过程有误,引导不成功。
仔细看了你的指导说明才发现这个问题。
striker,
EVM单核SPI引导已经成功,涉及到DDR的引导也成功了。
在用自己设计的板子做SPI引导,不涉及DDR的也同样成功,涉及DDR的会失败。
上述问题很明显是DDR cofig table的配置不正确导致,因此我尝试修改AddDdrTable工具的配置。我按照DDR3 Register Calc v4工具,得出sdram config,sdram timing等寄存器值,并修改对应表中内容,生成新的工具并最终得到.dat文件。SPI引导后,BootMagic Address正确,但程序不能执行。
一些疑问:
1、ddrtable中
00 00 00 00 //pll Prediv
00 00 00 1C //pll Mul
00 00 00 02 //pll post div
这里对DDR PLL的配置我是否需要修改?DDR相关工程在线调试是可以的,用的gel文件是6678evm.gel,但是硬件上输入的DDR时钟我修改成50MHz,对应1066速率(66.67MHz的情形对应1333速率,DDR工作不正常,因此才选择降低输入频率)。此外,我通过这些PLL配置值,无法计算出1333/2=666.7的EVM默认时钟速率,不知道公式是什么?
2、ddr calc中的另一个工具DDR3 PHY Calc v10得到的leveling相关寄存器参数并没有在ddrtable中有体现,不知道这些寄存器的配置对DDR正常运行是否必要?我看到gel文件中对这些寄存器是有相关配置的。但EVM做SPI引导没有配置这些寄存器也能成功,又貌似说明不需要对它们进行配置。
3、我目前就修改了sd ram config, sdram timing 1, sdram timing 2, sdram timing 3, sdram fresh cntrl 这5个配置,不知道是否还有其他需要配置的地方?
kloud
----------
另板子可以通过Memory_test,DDR工作在1066速率。DDR型号与EVM一致。
您好 我现在在做自己设计的板卡加载时,6678的八个核都能跑起来程序,但是重新上电复位之后,可能某些核,如core3 core4 core5没有boot起来,或者有时候程序跑着跑着就飞了,再次上电可能又能8核全部boot运行。不知道是什么原因啊?
你好,请问一下DDR的时钟是BTLB文件中的第四个数据吗?我的这个数据是 0C 1A 92 A0 00 00 00 70 00 87 35 00 02 42 80 F5 00 00 00 00 00 00 00 1C但是DDR初始化有问题,使用GEL文件可以正常初始化,我把gel文件初始化后的值全根据文档修改了,DDR的时钟没有找到修改的地方,请问下是不是这个数据?
这个说明文档有没有呢?
您好!
我想问一下这个启动代码是指RBL吗?另外,为什么IBL二级启动可以直接将.out文件重命名为.bin文件就可以启动,但是SPI启动却需要将.out文件经过一系列工具转换为.dat文件才可以启动?
期待您的回复,谢谢!
你好striker
我们的代码中有4个核共用了代码区,数据区使用的是相对地址0x00800000,用JTAG下载可以正常运行
但是制作spiboot文件后下载进去发现只有第一个核正常运行,其他的核都没有正常运行。
在第一个核启动之后,我将0x10800000 复制到 0x11800000 0x12800000 0x13800000 中,发现仍然无法正常启动,
请问我在boot的时候还应该注意什么?
谢谢
striker
您好,
请问我们使用的H264的压缩程序,用4个核来运行该程序,代码段是共用的,数据段用的是0x00800000相对地址,
用仿真器下载运行没有问题,但是在制作SPI启动的时候发现只有一个任务管理的核起来了,压缩的4个核代码运行异常
在下载之前填充每个核的L2SRAM,下载之后又读出来发现仿真器下载的时候并没有操作L2SRAM的内存空间。
请问你有没有遇到过这种问题?
你好striker:
非常感谢你的帖,我可以成功在C6657EVM上分别完成了单核,双核心和带BIOS双核的SPI BOOT了,在此提醒一下用这帖做C6657 SPI BOOT 的朋友,有一个细节要特别注意,不然照搬这帖的方法,在C6657上是实现不了双核BOOT 的, 要将MulticoreBoot.c 中的 pBootMagicAddCore0 = (int*)0x1087FFFC; 改成 pBootMagicAddCore0 = (int*)0x108FFFFC;
另外我有两个问题想请教一下striker:
1、我用了RTSC工具定义了Menory,每定rebluid .cmd 文件都会根据.cfg文件和RTSC工具重新生成一个.cmd,这时候
.myboot
{
boot.ae66< boot.oe66>(.text)
} > BOOT_CORE0
这一小段定义就被删除了,所以每一次编译我都要手动添加这一小段定义,感觉方法比较落后,想问问striker有什么方法可以让它自动在.cmd文件里生成这一小段定义?
2、第二个问题比较头疼,虽然我可以做到双核SPI BOOT了,可是我将帖里的.cmd文件中定义的
.cio > DDR3
.bss > DDR3
.const > DDR3
.far > DDR3
.fardata > DDR3
.neardata > DDR3
.switch > DDR3
.sysmem > DDR3
platform_lib > DDR3
.cinit > DDR3
改成了
.cio > L2
.bss > L2
.const > L2
.far > L2
.fardata > L2
.neardata > L2
.switch > L2
.sysmem > L2
platform_lib > L2
.cinit > L2
才可以成功的,用原来的指向DDR3 无法正常启动,这是因为DDR3没有初始化的原因吗?
搜索
复制
Jimmy,
很高兴你能boot 成功,6657 应该是 1M 的 L2SRAM,所以bootmagic address 是 1M 差一个字节。
1. 首先确认一下.myboot段为什么会被删除? 如果你有一个自定义的cmd文件,理论上该cmd文件是可以和.cfg 及RTSC工具自动生成的cmd文件共存
2. 应该原因就是没有初始化DDR,检查下DDR boottable,如果你使用的是带DDR boottable的工具链脚本,那就有可能是初始化失败造成的;否则就是没有初始化DDR。如果对DDR table不太了解但是有兴趣可以看下附件里面的文档,参照下6670的部分,应该可以帮助到您。
striker
le wang,
你的boot 流程很奇怪,可否参照下附件的boot 流程和案例。多核Boot 过程有点繁琐,可能需要你自己看完文档后再深入了解下。另外直接复制L2SRAM不是一个好的多核boot的方法。附件中提供的方法应该可以解决你的需求。
striker
你好striker :
感谢您的回复
我由于我的工程是由CCS例子中的IPC工程创建的,我发再.cmd文件都是build后自动生成的,生成在Debug==>configPkg目录下,根据你的提示,我尝试过将.cmd文件复制出来,再重新rebluid,编译会报错。
搜索
复制
striker
感谢你的回复,原因已经找到了,是因为cfg文件中cache的问题,关闭cache,并将L2SRAM中的初始值放在共享代码区就好了!
wangle
zhonghong zhang ,您好,我看到您跟我遇见相同的问题了,重新生成DDR table的exe应用程序,但是用C++软件打开后,debug不成功,生成不了正确的exe,,请问您是怎么解决的呢?我卡了好久。。。。
Dan Jia,
生成ddr table的代码很简单,就是将一段固定的二进制数据插入到镜像文件中。如果大小不够修改max_line_size 宏定义。fopen 错了是不是你在debug时没有指定正确的input 文件路径?
如果实在不符合实际应用要求你可以重写此工具。
striker
striker大神:
您好,首先感谢您之前给予的帮助!我最近在做毕设,需要在vxworks5.5下使用rtl8111e网卡进行通信,但苦于没有参考代码,只能用8139网卡的代码进行移植,几周了进展不大,请问您是否熟悉这方面呢?谢谢!
Michael,
我没有在vxworks下做过。我只是最近有移植过keystone2 系列 arago linux 的phy,kernel用的是88e1512,我使用的是88e1543。说是移植但是改动并不大。改了mdio read的一些代码后就ok了。
不知道你遇到了什么样的问题。
striker
striker你好:
现在自己用的板子使用RBL SPI NOR FLASH启动,但是由于工程中除了.text和.stack都需要放在DDR3,所以一直跑不起来。
之前一直在开发板上进行实验,直接用你提供的提供的工具链,可以成功运行。现在在自己的板子上无法使用了,应该是DDR初始化失败了。
按照帖子里提供的DDR table 计算常用工具:8713.ddr_cal_tool.zip开发板上的芯片是K4B2G1646C (1333),自己板子上应该是K4B1G1646G (1333),你所提供的AddDDrTable工具插入的内容:
#ifdef TMS320C6678
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, 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
};
#endif
因为计算出来只有参数,不明白该如何对应,以及ddrtable[120]中各参数的含义,所以不知道该怎样根据ddr_cal_tool计算结果修改ddrtable[120]中各参数,请问该如何修改或者该参考哪个相应的例程和文档。
GuoFei,
TI 没有提供非常直接的官方文档,sprugy5a 可以参考,不过你也可以尝试参考我附件里的SPI_boot原理.pdf,上面已经标明了一些含义。
striker
striker你好
1.最近接触到flash boot相关的任务,下载了您提供的例程,通过仿真器可以允许,但是烧写4核程序后改为SPIboot后没有任何现象
仅仅烧写单核也无法运行,部分结果如下
2.本人目前刚刚接触DSP,目前任务是要实现pc间tcp传输移植到dsp-pc传输,目前通过仿真器可以实现功能,但是参考的工程基于SYS/BIOS,看到楼层中您提出根据cmd文件修改cfg文件,但依然一点头绪都没有,请问有没有什么参考资料供我学习相关知识
3.看到很多相关的帖子都有提到将ccs文件第九行0x01f40051的51改为00,这个动作有什么意义呢?然而工具链中的bat文件似乎没有涉及这项操作,这是为什么呢?
谢谢指点~
Shihao Li ,
1. 现象看确实没有boot起来,请你确保首先测试不带bios,程序中不使用DDR的单核程序做boot。 如果有6678evm板卡的话,应该能很快成功启动。如果是自己的板卡却依然boot不起来,就需要参考附件中的文档检查boot parameter table 各项是否正确。主要是PLL相关部分。
2. 一个带BIOS 可boot工程和不带bios工程的区别就是:
祝你成功
striker
striker你好
1.我将你的附件里例程 的core0的cmd文件中 DDR3全部改为L2,烧入6678EVM板中仍然不能成功boot,详细的步骤如下
http://www.tudou.com/programs/view/7QNHgCLY23E/
附件中的图是板子各时间的状态
问题还是没有解决,很困惑
另外还有两个问题:
2.板子的no-boot模式SW3-6配置在 牛金海 编著的 《TMS320C66x KEYSTONE 架构多核DSP入门与实例精解》中为1000 0000 0000 0000,与附件中给出的1000 0000 0000 1100不一样...
3.续上贴我第三个问题,对于镜像转换的工具链,附件中提到双击双击spiboot_multi_4cores.bat批处理文件即可实现,但用notepad++打开bat文件发现其中并没有涉及到将51改为00的部分
4.将core0的LED闪烁程序main函数中的multicore_boot()注释掉后单独从仿真器载入,本应闪烁的LED变为常亮,不太清楚为什么
多谢指点
Shihao,
striker你好
这是我把附件里LED core0的cmd文件中DDR3全部改为L2后编译生成的,依然无法成功boot,另外附件中的四核和单核LED例程都无法boot成功(指针指在0x20BCCD2)
最后确认一下顺序:先连接仿真器,修改bootmode,再上电,launch selected configuration,connect target 后再load symbol
多谢指点
Shihao Li,
首先你的镜像没有问题,在我这边可以成功boot :( 我的evm 是Rev 3A
我又仔细看了你操作的视频,没有找出任何问题。
那么这就奇怪了,3A 和 3B 在boot pin 和 boot parameter table 的设置上应该没有什么区别。
我唯一想到的可能就是你的EEPROM 被重新烧写过,因为EVM板卡的boot依赖于上面的镜像去绕过一个PLL bug。
(mcsdk/tools/program_evm/binaries/evm6678l 可以找到eeprom_writer 以及 eeprom51.bin)
striker
striker你好
终于成功了- -,之前确实在尝试i2c boot的时候修改过eeprom
当时用的是C:\ti\mcsdk_2_01_02_06\tools\writer\eeprom\evmc6678l\bin\eepromwriter_evm6678l.out和i2crom_0x51_c6678_le.bin
上面是参考...虽然最后也没有成功
谢谢指点
striker 你好
最近我尝试在NDK helloworld例程的基础上进行修改,遇到了一些问题,看到前面的楼层中您也研究过相关内容,所以想请教一下以下问题
1.工程的目的是在两个核上同时对一台PC进行数据的收发。于是在两个核上建立两个socket,但发现在core0连通后,core1总是无法成功connect
在e2e论坛上发现了(wiki)中写到There is no solution for running simultaneous NDK stacks on multiple cores。意思是多核网络通信是无法实现的么?
2.在例程的helloworld.c中我看到包含了对DDR的初始化,cfg文件中也包含了内存的分配,如果改写为多核程序,是不是只需添加
.myboot段(到.cmd)和boot magic address段和写IPC中断(到.c)即可?
多谢指点