這里說說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