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的加载。
Andy Yin:
您好,
参考SPI加载成功的帖子www.deyisupport.com/…/7411.aspx
,
striker Qian:
您好,我在尝试“SPI成功例子”过程中遇到一些问题,导致boot失败,我操作过程如下:
1. 由于我的应用程序.out 文件是ELF格式,例子里的hex6x工具比较旧,不能使用,因此换了个新的hex6x。由此生成i2crom.ccs 和 spirom_le.dat。(前者是小端,后者是大端 )。并将两者的里的0x0051改为0x0000.
这是我生成的i2crom.ccs文件的parameter table 头:
0x00500000
0x00320000
0x40200002
0x00010018
0x00040000
0x00010000
0x03200000
0x01f 40000
0x04000000
0x00000000
….
2.例子里的烧写flash工程似乎不是ccs5.0.3编译生成,重新建立工程后编译成功,但运行卡在配置PLL函数那里。
3.改用ti自带的nor writer进行烧写,烧写大端spirom_le.dat完毕后,断电重启,拨码开关调为SW3-SW6 1011 0000 0010 1000. 进行SPI boot,加载失败。
是不是该例子不能用ti自带的nor writer进行烧写?我用了nor writer没有成功。是否和烧写地址有关?原先的烧写工程为什么cpu会悬停在PLL函数那里,还有就是为什么要在这个烧写工程里配置PLL呢?
我的操作哪里出现了错误,请不吝赐教。
,
striker Qian:
没有朋友成功用过该例程吗?卡在PLL函数里那个问题已经解决,工程是50M的输入时钟,修改no boot模式下PIN10-PIN12为011即可。现在的状态是用SPI启动后,PC指针在Boot Rom的0x20B0A050那里,然后看0x0087FFFC boot magic address 为0.请问是否还需要自己写应用程序将代码搬到本地RAM?如果在Flash上现场执行又是什么操作步骤呢?
,
striker Qian:
没有朋友成功用过该例程吗?卡在PLL函数里那个问题已经解决,工程是50M的输入时钟,修改no boot模式下PIN10-PIN12为011即可。现在的状态是用SPI启动后,PC指针在Boot Rom的0x20B0A050那里,然后看0x0087FFFC boot magic address 为0.请问是否还需要自己写应用程序将代码搬到本地RAM?如果在Flash上现场执行又是什么操作步骤呢?
,
David Yang:
你好,我用过此例已成功通过SPI启动单核。从你提供的现象看,应该是代码没有成功是烧写进flash,请确认烧写步骤。如果自己不写引导代码,只烧写应用程序,应该是在片上执行吧(XIP)。烧写程序时候pin为SW3-SW6,1000 0000 0000 1100(好像1000 0000 0010 1000也没问题)。SPI boot的时候pin为1011 0000 0010 1000,祝你好运。
,
striker Qian:
嗯,确实如此。我将烧写工程看错了,我以为第一个烧写地址还是0x80000000。。然后烧写对就ok了,现在单核spiboot没什么问题了。
,
Canyu Su:
Andy
您指定的帖子并不能够回答楼主的问题啊,而且现在论坛上通过I2C IBL引导 Nor flash加载大部分已经实现。
但是直接通过SPI加载NorFlash运行的例子并没有很好地总结,论坛上各个楼都有不同的意见,太乱了,不能够很好地理解。希望您能够整理出一个能够实现的SPI NorFlash例程,并给出具体步骤,让大家少走些弯路,相信各位都会非常感激的。
,
Canyu Su:
striker striker :
你好,你说您已经能够实现单核SPI Nor Boot,现在进程怎么样了?可以给予我有关SPI Nor Flash的具体步骤和参考资料吗?最好能够详细些,可以发我邮箱827888732@qq.com,或者在论坛上发表详细的帖子,各位同仁会感激不尽的。谢谢啊!
,
atower geng:
striker striker,你好:
很高兴看到你已经搞定了SPI NOR FLASH的启动,我最近也在学习SPI NOR FLASH的启动,研究了很久,这帖子来回也看了好多遍,自己太笨了,楞是没弄明白,你能详细讲解下SPI NOR FLASH的启动流程吗,或者是提供一份可能正常启动的代码工程,我想参考下,不甚感激!!!
邮箱是:xiaogeng04@126.com
,
yimin dong:
LZ,我用的LED程序可以通过DSP仿真实现。但是现在想通过FLASH烧写,I2C二次引导实现这个程序时,烧写过程一直出错。LZ能把第二和第三步写得详细点吗?
,
striker Qian:
EEPROM 空间太小而且不方便实现多核boot 。我以前有总结SPI 单,多核boot的成功案例,该案例已经被EVM6670和EVM6678 验证过。里面使用的工具部分是被修改过的,可以满足较大二进制文件的转换,同时支持boot启动时初始化DDR。里面还有测试工程和说明文档,希望可以帮助到你。参考附件。
http://www.deyisupport.com/cfs-file.ashx/__key/communityserver-discussions-components-files/53/1423.spi_5F00_boot_5F00_suit_5F00_v2.3.1_5F00_release.zip另外多核不同源码工程boot的例子patch如下,cmd文件里的每个核不应该使用同一块区域:
http://www.deyisupport.com/cfs-file.ashx/__key/communityserver-discussions-components-files/53/6735.spi_5F00_boot_5F00_suit_5F00_v2.3.1_5F00_8corepatch.zipDDR table 计算常用工具:
http://www.deyisupport.com/cfs-file.ashx/__key/communityserver-discussions-components-files/53/8713.ddr_5F00_cal_5F00_tool.zip
,
striker Qian:
补充tools的代码 :
http://www.deyisupport.com/cfs-file.ashx/__key/communityserver-discussions-components-files/53/7573.8004.tools_5F00_prj.rar
,
h l:
striker:
想确认一下spirom_le.dat是不是可以直接用?谢谢!
,
striker Qian:
在evm板上是可以的。
,
h l:
试了下,好像编译工具的版本一致可以用,不一致重新编译,再生成dat文件就ok。
,
chen xie:
您好!
按照您一楼的方法是我在EVM班上没有实现,后面文件包里的方法实现了。
不知道有人用一楼的方法做好的么,为什么和后来的方法在步骤上差距这么大!
谢谢
,
jack liu_first:
一楼是借助IBL实现I2C的二级启动,IBL代码放在L2开始的一段内存,你没成功大概是你的cmd分配内存覆盖了IBL代码区,你可以从
0x820000开始映射你的代码
,
striker Qian:
Hi,chen xie
楼上的描述是正确的,这是nor flash两种不同的启动方式。不明白为什么一定要从I2C二级启动,这种方式限制比较多,首先多核的话需要自己写工具链制作二进制文件,其次并不是每一个用户自定义的板子都有EEPROM。如果坚持要调通,就严格按照步骤检查,尤其是第一步很重要,不能被忽视。
,
Billy smith:
你好,我在用6670开发板尝试,直接采用spi nor 加载,用你的单核的例子试了下,在将程序烧写到flash中去后,重启并修改启动方式为spi nor后,在ccs5中 连上仿真器并在界面上connect后,发现程序没有跑到entry point ,查看magic address已经被修改为entry point的地址,查看一些段,发现已经分配到对应的内存地址上了,我修改pc指针为entry point 对应的地址,我用汇编去跟踪执行,发现到这一步程序执行不下去,没有汇编代码。还请指导下 谢谢了
,
chen xie:
谢谢
,
chen xie:
谢谢您!
麻烦再问一下,我们目前程序还有用bootloader,按照您成功的多核方法,从仿真器下载需要做哪些修改呢?
1)L2的最后需要留空;
2)但是如果我们的程序太大怎么办,当然我还没试验过。我看了一下我们的程序。out文件几乎都是6MB左右 会超出flash的大小么
目前我们在做自己的板子,但没有什么经验
,
striker Qian:
Chen xie:
不太明白你们的程序在用bootloader是什么意思。所有的启动方式都要用到DSP ROM里的RBL,这是真正的引导源程序。即使往EEPROM里写了IBL也只是加了一个二级引导。SPI多核boot没有用到IBL,单靠RBL引导启动。建议你们的工程参考示例工程修改结构,主要关注cmd配置和CORE0唤醒其他核的IPC中断。
1)L2最后需要留空
2)一般SPI flash的空间为16MBytes,这个空间已经很大。你们的.out文件大小虽然是6MB,但是经过工具链处理刨去调试符号应该不会大于1Mbytes。
,
jack liu_first:
hi striker striker,
您好,
一个多核程序boot,是否一定要建立多个工程,分别修改对应的cmd,生成多个.out,再使用工具链进行转换呢
,
striker Qian:
一个多核boot的工程,一定要有多个工程和cmd,但是可以只有一套源文件结构。工程和源文件要区分开,你可以基于一套源文件结构建立多个工程映射,差异部分可以在编译时用宏区分,也可以在运行时用core number区分。每个工程必须有一套自己的cmd,并且是全局地址。
,
h l1:
hi striker:
你给的多核例程的cmd文件中有:
.myboot { *.*<boot.obj>(.text)
} > BOOT_CORE0
不知道.myboot在哪定义的?还有boot.obj也找不到?
谢!
,
striker Qian:
myboot是自己定义的,这里就是定义。boot.obj 在map文件里是能找到的,属于启动代码的obj 文件。启动代码是TI预先写好的,不在我的工程里。这句话的意思是将boot的目标文件的代码段定位到 事先定义的BOOT_CORE0里。这样做的好处是将每个核的_c_int00 入口地址固定成同样的局部地址,核0可以仅仅通过加上0x10000000*CORENUM 得到其他核的入口地址,适用于多核启动。
,
h l1:
谢谢!striker
,
ZHAN LI1:
striker striker你好,麻烦请教几个问题:
1、.rmd文件中org是如何指定的呢?
2. 生成的spirom_le.dat能直接改成成.bin然后利用NAND writer写入flash,然后采用Nand启动么?
,
ZHAN LI1:
Andy Yin1你好
4571.SPI boot例子中 spiboot.dat.bak中的数据是从哪里来的啊?
,
shu jun:
striker striker,您好:
单核***.out的文件大的时候,用您的spiboot_single.bat 最后在执行romparse.exe时会出现错误画面如下:
想知道romparse.c中哪里需要修改?
希望能回复我,感谢!
,
striker Qian:
你用的是6678吧,进入的是不支持较大binary的那个文件夹?参照6670下面的multicore_boot_1cores 里面的脚本,将6678folder下面的multicore_boot_4cores 删减成1 core的,应该很容易就完成。
,
shu jun:
striker striker 您好:
感谢您的回复,C6678已经能够成功从spi启动大程序,但是对生成镜像文件的操作不是很了解,为什么您给的单核的操作不支持大文件的转换?
感谢您的那些论文,操作流程,以及源文件,非常感谢!
,
striker Qian:
不客气。 您的问题是非技术问题。区别在于倒数第二步,romparse 和 qfparse 都是给镜像文件加表头(boot parameter table)。前者输入接口易读但是不支持大文件的读写;后者直接以寄存器的形式加表头,不易读但是支持大文件。前面的工具不是我开发的,所以没法修改,所以索性写了个支持大镜像的小工具。
,
zhonghong zhang:
striker,您好。我最近在做EMIF NAND FLASH 的自加载,现在可以自加载成功,但是多核我一直不知道该怎么办?单核时out是不需要工具转换,直接将文件后缀名改为bin然后烧写到NAND中的,可以自加载,从UART看到打印信息。我试过您的 spi_boot_suit_v2.3.1_release工程里面的四核自加载代码,但是烧写进去之后重启EVM板,并且调到NAND boot模式,只是出现不停得打印boot from nand的信息。请问,您的这个工程可以在NAND的自加载使用吗?需要有什么修改的地方?
,
striker Qian:
sorry,本例程只用于SPI-NOR flash的单多核加载。我的理解是,对于nand flash,有些东西是共通的,比如多核文件用工具转化后的级联,比如多核IPC 中断的唤醒。但是boot parameter table 肯定不一样。这些您只能自己去发现解决了,问问TI的专家吧。
,
zhonghong zhang:
谢谢,但是我现在将程序烧写到NOR FLASH中也不能成功 我的NOR FLASH 是开发板EVM的,这个也是不适用的是吗?
,
zhonghong zhang:
您好,我现在在6678开发板上做SPI的NOR flash自加载,感觉您提供的这个代码是可以符合我的需求的,但是我烧写进去之后,没有现象,是不是,烧写步骤不对呢?我按照单核的NOR FLASH烧写步骤,首先烧写IBL到E2PROM,然后烧写NOR。最后自加载。
,
striker Qian:
EVM6678 ,EVM6670完全没问题,这个工具链已经被数不清的案例验证过。请你严格按照步骤检查一下,最好先用示例亮灯程序做一次boot。然后再看自己代码的cmd文件是否使用了全局地址。
,
zhonghong zhang:
您好,终于自加载可以跑起来了,LED灯按照设置的闪灭。但是有个问题,您说的no-boot 模式下,拨码开关对应 SW3~SW6 1000 0000 0000 1100 ,spi-boot模式,SW3~SW6:1011 0000 0010 1000。我有一个疑问,必须这样子设置吗SW3 1011 SGMII(PA driven from core clk)不是所谓的SPI模式呀?后面配置锁相环之类的跟这里有关系吗?
,
zhonghong zhang:
sorry 我看错了 SW3是配置成SPI启动模式,但是SW4 SW5 SW6 这些的配置跟PLL有关吗,一定要配置一致吗
,
xxx lll:
LZ,请教一个问题,现在在弄6678的bootloader,板子是自己做的,目前生成了dat文件,,截图是生成dat文件的参数头,想问下第一行是什么东西,需要烧进flash里面吗?
,
striker Qian:
CCS IDE自己的数据头,指示数据的大小,读取地址等。不用管这个,load memory进DDR的时候会自动给你滤掉。
,
striker Qian:
后面的我觉得没什么太重要的,一些参数会被boot parameter table里的覆盖掉
,
zhonghong zhang:
您好,striker。我用您给的点灯程序在开发板上完成了SPI NOR FLASH的自加载功能。您里面的MuticoreBoot.c函数里面给其他core1-core7的Magic Addr都是由core0推导得到的。现在的问题是,如果我八个核的工程程序都不一样,代码不同,那么这个地址应该也不同,这个应该怎么样确定?我现在需要实现八核不同功能的烧写,如果每个核的工程代码都是Switch 判断core号,这样会增加代码量。。期待得到您的解答,谢谢啦~
,
zhonghong zhang:
striker,还有一个问题请教您,现在的多核SPI NOR FLASH自加载是基于6678EVM开发板的,如果是自己的板卡,这些转换工具还可以使用吗?有没有特别需要修改的地方呢?谢谢
,
striker Qian:
第一个问题: 不同工程的boot magic address 如果没有特别指定,当然很可能会不在相同位置,推算也毫无意义。但是注意到led工程的cmd文件里的
.myboot { *.*<boot.obj>(.text)
} > BOOT_CORE0
专门将boot.obj 放置到了用户自己定义的固定位置,也就是固定了boot magic address,这样不管工程千差万别,boot magic address始终在同一位置。
第二个问题:当然可以,而且也被交流验证成功了很多次。唯一需要修改的是DDR table。对照suite里的说明和文档,应该很容易修改。
,
wj xz:
你好, striker striker 大神,十分感谢提供的的程序和小论文,看过之后疑问比较多,能不能留个QQ,方便交流一下,我的是QQ 1024924794。万分感谢!
,
zhonghong zhang:
您好,striker,我现在在尝试将不同的八个核工程完成自加载,按照您所说的,boot magic address应该是不变的,那么我将core 0保留MulticoreBoot函数,其他core不调用该函数,且把八个核的所有Switch语句删掉,只保留操作灯的那些代码,但是自加载后,没有任何现象显示,不知道我是哪个地方做的不正确?
,
striker Qian:
查看一下是不是误删了MulticoreBoot里对其他核进行platform init的代码。对于任何一个核没有初始化主pll,LED灯不会正常闪亮
,
zhonghong zhang:
hi striker,您好,我仔细研读了一些资料,有几个不太懂的地方想向您请教。
1.
我看到关于DDR3的文档,如果需要修改DDR table 按照DDR3 Memory Controller Registers 来修改。
02 42 80 F5 //config select
00 00 00 00 //pll Prediv
00 00 00 1c //pll post div
请问这些参数不是已经在parameter table 配置了吗?在DDR3 table里面也要体现吗?这些是不是跟硬件系统有关的参数?如果是的话,能否给点修改这些寄存器内容的经验?
2.
当我把DDR3配置表的内容修改后,怎样自行制作产生AddDdrTablele6678 的脚本呢,可以点击bat直接运行的?
3.
boot parameter table 的内容指的就是参数配置文件,含参数表的那些内容吗?这些在那些情况下需要修改呀?
4.
romparse nysh.spi.map指的是将boot parameter table表头加进烧写的数据里面吗?
如果我需要自行产生不同的参数配置文件,如何产生该nysh.spi.map?