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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM