我們的某位客戶,在使用K9仿真器燒寫cavium的CNW5602芯片外接的NorFlash時出現因燒寫非法代碼導致仿真器無法停止內核的問題。所用的Flash器件為一塊普通的并行NorFlash器件。問題現像描述如下:
一塊空板子(flash是空的)是可以通過K9正常讀寫flash的,但當flash中已經寫入程序后,在測試過程中很容易出現不能通過K9重新燒寫flash。
我做了一下實驗,在一塊可以正常讀寫的板子上向flash中正常啟動地址寫入一個文本文件,讓板子不能正常啟動,這時候再用K9擦除flash時會報“無法停止目標板上的器件”,在設置中選用“特殊停止”可以清除“無法停止目標板器件”的錯誤,但K9會一直停在“初始化flash"狀態,嘗試K9各種配置組合都不能再繼續下去了。再焊一片空flash到板子上,K9又可以繼續燒寫flash。我做了幾次這樣的試驗,可以確定當flash非空而程序又不正確時,會重現上述過程。
這位客戶其實發現了問題的原因,并且給出了解決方法:換塊空的Flash。呵呵,不過這種方法太麻煩,而且搞不好會弄壞板子。那是否有更好的辦法?
分析上述現像,不難發現是因為向片內燒寫了非法的代碼,導致芯片上電運行后異常,影響仿真器連接。問題的根本是無法停止內核,如果能停止內核,那一切都好辦的多。通常情況下,CNW5602這種比較高性能ARM芯片支持比較多的啟動模式。于是我建議這位客戶切換芯片的啟動模式,不過這位用戶告訴我,板上只設計了從NorFlash啟動;并且由于是BGA的片子,也沒法設置跳線。沒有什么別的好辦法,難道說必須再次把Flash芯片取下然后換塊空的?
后面實在沒什么辦法,他把板寄給了我,要我幫忙弄。
既然無法切換啟動模式,那是否可以從源頭解決問題,讓NorFlash中數據不能被芯片讀取出來?
于是就有了如下的方法:
我這邊又試了下,之前發的方式有些時候不行。下面是比較穩定的操作方法:
- 加載附件中的初始化宏。這個文件我有改動,在最開始加了個5秒的延時,最后加了擦除整個Flash的命令序列。
- 短接Flash的RESET引腳到地,重新上電;
- 進入仿真器自檢界面,點擊自檢,在彈出第一個延時5秒時,斷開RESET接地設置,然后進行后續的自檢。執行初始化宏的最后操作時,會執行擦除Flash的命令。(如果能出現第1個5秒的延時,說明器件已經停下來了)。
- 執行完成后,重新上電,基本就能正常連接了。
可能在第3步操作時,成功的次數比較小,多試幾次。我這邊燒了這個隨機數文件,出現無法停止的問題。最后是用此方法解決的。
正常燒時,請用原來的初始化文件。
上述方法其實有點復雜,并不需要在初始化宏中插入擦除序列。可以直接點擊擦除按鈕,要在第1個5秒延時,斷開RESET引腳即可,因為此時芯片已經停下,后續就可以調用算法擦除芯片。
第一個5秒延時的作用是預留時間斷開NorFlash的RESET引腳,恢復Flash正常工作。這樣仿真器才能正常的執行后續的初始化序列和擦除算法。
這個方法的原理是先讓Flash芯片一直處于復位狀態,芯片不能讀取代碼,自然就不能從NorFlash啟動。待芯片啟動完成后,仿真器再去連接,此時就可以連接并停止內核,可以執行各種讀取Memory的操作。在停止內核后,可以讓Flash恢復正常工作,此時仿真器再去擦除Flash。
用戶在調試其它芯片時遇到類似問題,也可以照類似的方法解決:1、切換啟動模式;2、啟動時禁用Flash(NorFlash/NandFlash/SPI Flash),等停止內核后再擦除。
最近這位用戶沒再反饋這方面的問題,應該是這方法有效。另一方面也可能是因為他不敢再往里面任意寫數據了:)