DUALBOOT(双启动) 调试

这里说说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校验告知,不用为人干预),怎么读出来的版本号是V002V002可是外部SPI flash的啊,正常应该是V001才对啊。

软件设置,硬件电路查了一个遍,没有问题。看现象感觉很像是CJED被破坏了,所以没法启动,所以就启动到外部的,所以就得到V002,没办法只能读取C是的JED,对比AJED,发现完全一样---说明CJED没有被破坏----呵呵了。被人家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

posted on 2017-02-25 16:10  小诸葛叶  阅读(4466)  评论(0编辑  收藏  举报