这里说说XO3的双启动。首先你要知道什么是双启动?为什么要用双启动?双启动需要做什么设置?需要怎么调试?and so on.
在XO3来说,什么是双启动?双启动就是内部启动(内部flash)和外部启动(外部SPI flash),启动顺序可以在软件设置,如下图。DUALBOOTGOLDEN设置为EXTERNAL,指定备份文件为外部SPI Flash,先从内部启动,设置为internal,即内部是备份,先从外部启动。
下图说法有误,其实是可以设置的是内还是外先启动的,亲测可用。
为什么要用双启动?细想一下假如没有双启动,只要内部或者外部存储用户逻辑,但是用户逻辑被环境破坏了呢?怎么办?是不是没法用了?特别一些高温高压高辐射的特殊环境。有了双启动,坏了一个好有一个作为备胎使用。
双启动需要做什么设置?很简单,如下图。也好好理解,因为是外部SPI flsah和内部FLASH作为双启动(而且也仅有这么一种双启动模式XO3),所有LATTICE是作为主机去读取外部SPI FLASH 的数据,所有自然就要把MASTER_SPI_PORT设为ENABLE.
需要怎么调试?在此,把帮客户debug的过程share to us。
为了测试客户在了两份程序,一份放到内部FLASH,程序中会添加版本号叫做V001,一份放到外部SPI FLASH,程序中会添加版本号叫做V002,通过串口读取版本号就可以知道双启动是否成功。
用户做了如下的软件设置
客户大体测试了几种基本情况,如下
NO |
CPLD内部flash |
SPI Flash |
加载方式 |
结果 |
说明 |
A |
V001 |
不在位 |
重新上下电 PROGRAMMER REFRESH PROGRAMN触发 |
V001 |
|
B |
V001 |
在位但为BLANK |
同上 |
V001 |
|
C |
V001 |
V002 |
同上 |
V002 |
|
D |
FLASH ERASE ONLY |
V002 |
同上 |
未成功加载 |
|
E |
FLASH ERASE CFG ONLY |
V002 |
同上 |
未成功加载 |
|
F |
FLASH ERASE CFG AND UFM ONLY |
V002 |
同上 |
未成功加载 |
看到上面的测试结果了吧,AB是成功的,符合双启动预期,其他的都挂了。解释一下:
用户设置为EXTERNAL,指定备份文件为外部SPI Flash,即先从内部启动,A的时候是内部flash放了程序,外部spi flash把他扣下来(不在位),这样自然就是读到版本号V001了,B类同。C的测试结果就有问题,既然内外都放了程序,而且是内部先启动(内部启动失败就会外部启动,这个lattice芯片会通过CRC校验告知,不用为人干预),怎么读出来的版本号是V002,V002可是外部SPI flash的啊,正常应该是V001才对啊。
软件设置,硬件电路查了一个遍,没有问题。看现象感觉很像是C的JED被破坏了,所以没法启动,所以就启动到外部的,所以就得到V002,没办法只能读取C是的JED,对比A的JED,发现完全一样---说明C的JED没有被破坏----呵呵了。被人家RD鄙视一把,说你们LATTICE的东西真尼玛烂---人家大公司,我也不好说什么---只能继续查找问题--查啊查,中午都不得睡觉。
没地方怀疑了,就问他,你程序是通过夹具下载到SPI flash的还是通过我diamond放进去的的---他说夹具试了几把没成功,是通过diamond搞进去的。好请操作一般给我看看。我把关键部分截出来给大家审视一下。
看到他这一步操作,我就放心了,思路明就了了。懂的人都知道,这步骤应该是没办法加载外部SPI FLASH的。思路明了了:貌似是外部SPI FLASH没有加载进去,就是空的一颗flsah,他那个步骤貌似只是重新加载了内部的flash。这样的猜想出来之后,他测试的结果都可以解释通了。首先解释他的C,因为他的步骤是重新加载了内部的flash,相当于之前的V001是被V002覆盖了,所以读出来版本号是V002。在看D,内部FLASH被他擦空,外部SPI FLASH有没有程序,所以启动失败正常,EF也是一样的道理。哈哈,毕竟只是猜想,而且感觉他们RD应该也不会傻到自己的外部FLASH是否有程序都不知道。那么做个测试验证一下,我想的到底对不对就知道了。
对症下药,既然怀疑外部flash是空的,读到的V002是被覆盖的结果,那么做第一个测试就可以验证了
1.针对C,我直接把外部FLASH取下来,假如还是读到V002,那么肯定说明就不是外部SPI FLASH读出来的,二是内部flash被覆盖的结果---测试结果,你猜猜,他们真的有这么傻,取下来之后,我还是读到V002,很显然说明是内部flash本覆盖了。加入不是被覆盖,外部spi flash被取下来了,应该读到V001才对----第一个验证,还不是很放心。
2.第二个测试,测试条件,内部flash擦空,外部flash按照他说的放V002的程序。然后读版本号----读出来了,结果脚毛都没有一根,显然验证了我的猜想,外部flash确实是空的。
3.经过两个测试可以确定是,他们RD没有把程序放到外部FLASH导致的,死活还不让我走。说一定要把上述情况验证通过之后才让我走。接下来的事情就简单了,仅仅是如何通过diamond把程序放到外部spi flash而已,截图给你们,如下图。要点:选择Bit,起始地址改为0x00010000
依据如下
做一个测试,看看刚才的操作是否将程序下载到了外部flsah中
1.测试条件,内部flsah擦空,外部flash放版本号为V001的程序---读取结果,本版好果然是V001,
2.不放心再来一个测试,内部flash擦空,外部flash放本版好为V003的程序------读取结果,本版好果然是V003,,
3,还不放心,那就极端点,外部flash擦空,外部直接卸下来--读取结果,毛都没有,这个说明刚才的操作确实是把程序加载到外部flash中了
然后各种教程测试一一验证,没有不通过的。
找问题花了好多时间,调试就是这样,问题的根源并不高深,高深的是找问题的过程,如何去发现问题,如何去猜想,如何去验证,等等。
附上
sysConfig配置说明(diamond3.8):
SDM_PORT=PROGRAMN,设置PROGRAMN管脚为专用SDM功能,以便控制器可以REFRESH CPLD。
SLAVE_SPI_PORT=DISABLE,禁用SSPI加载功能
I2C_PORT=DISABLE,禁用I2C加载功能
MASTER_SPI_PORT=ENABLE,允许从外部SPI Flash加载
COMPRESS_CONFIG=ON:加载BITSTREAM采用压缩方式
CONFIGURATION=CFG:加载程序位于内部Flash(不用UFM)
MY_ASSP=OFF:用于LatticeXP2
ONE_TIME_PROGRAM=OFF:允许内部Flash重复擦除和烧写
CONFIG_SECURE=OFF:用于LatticeECP2
MCCLK_FREQ=2.08
JTAG_PORT=ENABLE,JTAG专用
ENABLE_TRANSFER=DISABLE,禁用TRANSFER功能
SHAREDEBRINIT=DISABLE,共享EBR初始化文件
MUX_CONFIGURATION_PORTS=DISABLE,用于MachXO2
DUALBOOTGOLDEN=EXTERNAL,指定备份文件为外部SPI Flash
BACKGROUND_RECONFIG=OFF,禁止加载完成后、进行重新加载
如有疑问请联系QQ:825972925