zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    提交订单的时候,实现拦截,登录成功后跳转回之前的页面;使用redis生成指定起始位置的id
    iOS Outlets Referencing Outlets
    iOS 常用控件 参数
    iOS UIImageView设置为圆形
    iOS Xcode个人常用插件
    iOS Xcode注释的几种使用方法
    MFC MSBDutyTable下载地址
    MFC HTTP访问URL
    MFC 程序以管理员权限运行
    MFC 打开文件夹选择框并获取文件夹路径
  • 原文地址:https://www.cnblogs.com/xiaozhuge/p/6442069.html
Copyright © 2011-2022 走看看