DUALBOOT(双启动) 调试
這里說(shuō)說(shuō)XO3的雙啟動(dòng)。首先你要知道什么是雙啟動(dòng)?為什么要用雙啟動(dòng)?雙啟動(dòng)需要做什么設(shè)置?需要怎么調(diào)試?and so on.
在XO3來(lái)說(shuō),什么是雙啟動(dòng)?雙啟動(dòng)就是內(nèi)部啟動(dòng)(內(nèi)部flash)和外部啟動(dòng)(外部SPI flash),啟動(dòng)順序可以在軟件設(shè)置,如下圖。DUALBOOTGOLDEN設(shè)置為EXTERNAL,指定備份文件為外部SPI Flash,先從內(nèi)部啟動(dòng),設(shè)置為internal,即內(nèi)部是備份,先從外部啟動(dòng)。
?
?
下圖說(shuō)法有誤,其實(shí)是可以設(shè)置的是內(nèi)還是外先啟動(dòng)的,親測(cè)可用。
?
?
?
?
為什么要用雙啟動(dòng)?細(xì)想一下假如沒有雙啟動(dòng),只要內(nèi)部或者外部存儲(chǔ)用戶邏輯,但是用戶邏輯被環(huán)境破壞了呢?怎么辦?是不是沒法用了?特別一些高溫高壓高輻射的特殊環(huán)境。有了雙啟動(dòng),壞了一個(gè)好有一個(gè)作為備胎使用。
????雙啟動(dòng)需要做什么設(shè)置?很簡(jiǎn)單,如下圖。也好好理解,因?yàn)槭峭獠?/span>SPI flsah和內(nèi)部FLASH作為雙啟動(dòng)(而且也僅有這么一種雙啟動(dòng)模式XO3),所有LATTICE是作為主機(jī)去讀取外部SPI FLASH 的數(shù)據(jù),所有自然就要把MASTER_SPI_PORT設(shè)為ENABLE.
?
?
?
?
?
需要怎么調(diào)試?在此,把幫客戶debug的過(guò)程share to us。
?
為了測(cè)試客戶在了兩份程序,一份放到內(nèi)部FLASH,程序中會(huì)添加版本號(hào)叫做V001,一份放到外部SPI FLASH,程序中會(huì)添加版本號(hào)叫做V002,通過(guò)串口讀取版本號(hào)就可以知道雙啟動(dòng)是否成功。
用戶做了如下的軟件設(shè)置
?
?
客戶大體測(cè)試了幾種基本情況,如下
| NO | CPLD內(nèi)部flash | SPI Flash | 加載方式 | 結(jié)果 | 說(shuō)明 |
| A | V001 | 不在位 | 重新上下電 PROGRAMMER REFRESH PROGRAMN觸發(fā) | 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 | 同上 | 未成功加載 | ? |
?
看到上面的測(cè)試結(jié)果了吧,AB是成功的,符合雙啟動(dòng)預(yù)期,其他的都掛了。解釋一下:
用戶設(shè)置為EXTERNAL,指定備份文件為外部SPI Flash,即先從內(nèi)部啟動(dòng),A的時(shí)候是內(nèi)部flash放了程序,外部spi flash把他扣下來(lái)(不在位),這樣自然就是讀到版本號(hào)V001了,B類同。C的測(cè)試結(jié)果就有問(wèn)題,既然內(nèi)外都放了程序,而且是內(nèi)部先啟動(dòng)(內(nèi)部啟動(dòng)失敗就會(huì)外部啟動(dòng),這個(gè)lattice芯片會(huì)通過(guò)CRC校驗(yàn)告知,不用為人干預(yù)),怎么讀出來(lái)的版本號(hào)是V002,V002可是外部SPI flash的啊,正常應(yīng)該是V001才對(duì)啊。
軟件設(shè)置,硬件電路查了一個(gè)遍,沒有問(wèn)題。看現(xiàn)象感覺很像是C的JED被破壞了,所以沒法啟動(dòng),所以就啟動(dòng)到外部的,所以就得到V002,沒辦法只能讀取C是的JED,對(duì)比A的JED,發(fā)現(xiàn)完全一樣---說(shuō)明C的JED沒有被破壞----呵呵了。被人家RD鄙視一把,說(shuō)你們LATTICE的東西真尼瑪爛---人家大公司,我也不好說(shuō)什么---只能繼續(xù)查找問(wèn)題--查啊查,中午都不得睡覺。
沒地方懷疑了,就問(wèn)他,你程序是通過(guò)夾具下載到SPI flash的還是通過(guò)我diamond放進(jìn)去的的---他說(shuō)夾具試了幾把沒成功,是通過(guò)diamond搞進(jìn)去的。好請(qǐng)操作一般給我看看。我把關(guān)鍵部分截出來(lái)給大家審視一下。
?
看到他這一步操作,我就放心了,思路明就了了。懂的人都知道,這步驟應(yīng)該是沒辦法加載外部SPI ?FLASH的。思路明了了:貌似是外部SPI FLASH沒有加載進(jìn)去,就是空的一顆flsah,他那個(gè)步驟貌似只是重新加載了內(nèi)部的flash。這樣的猜想出來(lái)之后,他測(cè)試的結(jié)果都可以解釋通了。首先解釋他的C,因?yàn)樗牟襟E是重新加載了內(nèi)部的flash,相當(dāng)于之前的V001是被V002覆蓋了,所以讀出來(lái)版本號(hào)是V002。在看D,內(nèi)部FLASH被他擦空,外部SPI FLASH有沒有程序,所以啟動(dòng)失敗正常,EF也是一樣的道理。哈哈,畢竟只是猜想,而且感覺他們RD應(yīng)該也不會(huì)傻到自己的外部FLASH是否有程序都不知道。那么做個(gè)測(cè)試驗(yàn)證一下,我想的到底對(duì)不對(duì)就知道了。
?
對(duì)癥下藥,既然懷疑外部flash是空的,讀到的V002是被覆蓋的結(jié)果,那么做第一個(gè)測(cè)試就可以驗(yàn)證了
1.針對(duì)C,我直接把外部FLASH取下來(lái),假如還是讀到V002,那么肯定說(shuō)明就不是外部SPI FLASH讀出來(lái)的,二是內(nèi)部flash被覆蓋的結(jié)果---測(cè)試結(jié)果,你猜猜,他們真的有這么傻,取下來(lái)之后,我還是讀到V002,很顯然說(shuō)明是內(nèi)部flash本覆蓋了。加入不是被覆蓋,外部spi flash被取下來(lái)了,應(yīng)該讀到V001才對(duì)----第一個(gè)驗(yàn)證,還不是很放心。
2.第二個(gè)測(cè)試,測(cè)試條件,內(nèi)部flash擦空,外部flash按照他說(shuō)的放V002的程序。然后讀版本號(hào)----讀出來(lái)了,結(jié)果腳毛都沒有一根,顯然驗(yàn)證了我的猜想,外部flash確實(shí)是空的。
3.經(jīng)過(guò)兩個(gè)測(cè)試可以確定是,他們RD沒有把程序放到外部FLASH導(dǎo)致的,死活還不讓我走。說(shuō)一定要把上述情況驗(yàn)證通過(guò)之后才讓我走。接下來(lái)的事情就簡(jiǎn)單了,僅僅是如何通過(guò)diamond把程序放到外部spi flash而已,截圖給你們,如下圖。要點(diǎn):選擇Bit,起始地址改為0x00010000
?
?
?
??
依據(jù)如下
?
?
做一個(gè)測(cè)試,看看剛才的操作是否將程序下載到了外部flsah中
1.測(cè)試條件,內(nèi)部flsah擦空,外部flash放版本號(hào)為V001的程序---讀取結(jié)果,本版好果然是V001,
2.不放心再來(lái)一個(gè)測(cè)試,內(nèi)部flash擦空,外部flash放本版好為V003的程序------讀取結(jié)果,本版好果然是V003,,
3,還不放心,那就極端點(diǎn),外部flash擦空,外部直接卸下來(lái)--讀取結(jié)果,毛都沒有,這個(gè)說(shuō)明剛才的操作確實(shí)是把程序加載到外部flash中了
?
然后各種教程測(cè)試一一驗(yàn)證,沒有不通過(guò)的。
找問(wèn)題花了好多時(shí)間,調(diào)試就是這樣,問(wèn)題的根源并不高深,高深的是找問(wèn)題的過(guò)程,如何去發(fā)現(xiàn)問(wèn)題,如何去猜想,如何去驗(yàn)證,等等。
?
附上
sysConfig配置說(shuō)明(diamond3.8):
SDM_PORT=PROGRAMN,設(shè)置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:加載程序位于內(nèi)部Flash(不用UFM)
MY_ASSP=OFF:用于LatticeXP2
ONE_TIME_PROGRAM=OFF:允許內(nèi)部Flash重復(fù)擦除和燒寫
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,禁止加載完成后、進(jìn)行重新加載
?如有疑問(wèn)請(qǐng)聯(lián)系QQ:825972925
轉(zhuǎn)載于:https://www.cnblogs.com/xiaozhuge/p/6442069.html
總結(jié)
以上是生活随笔為你收集整理的DUALBOOT(双启动) 调试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: web前端开发文档
- 下一篇: stm32之USART学习