關於ONFI讀取數據相關問題解決

問題描述:

在本週的工作中,遇到一個問題,有一片板子Load current OS image failure。通過波形測試發現,是系統在讀flash ONFI data(第80個byte)時發現有1bit error後,就停止了運行。

 

思考:

根據flash datasheet可知,flash芯片兼容ONFI 1.0標準

而根據ONFI 1.0標準,在Read Parameter Page Defination 中,我們得知在ONFI  Parameter data 不僅會存在前255bytes,還會在冗餘區域(256-511 bytes,512-767 bytes)做兩個數據備份;可分爲:區域1(0-255bytes),區域2(256-511bytes),區域3(512-767bytes)。

若讀到區域1與區域2數據有問題,系統需要再讀取區域3數據進行再次確認纔行,而非停止運行。

而出錯板子在讀取第80個byte出錯後就停止了運行,很明顯,其對於冗餘區域(256-511 bytes,512-767 bytes)沒有進行讀取和判斷。

於是,推斷在BSP的這段讀取ONFI數據的代碼中應該有問題,它可能只對前255bytes進行了讀取,而對冗餘區域沒有進行任何操作。

 

PS:ONFI 對於目標初始化的定義

目標初始化

ONFI_1.0 標準規定在發現flash器件連接的CE#之後,應該對每個目標做初始化,包括進行Read Parameter Page命令(0xec)。此命令返回容量、特性、參數等設備信息。

主機應該檢查這些數據的CRC。如果第一個參數頁的CRC不正確,則主機應該讀取冗餘參數頁。

主機可以通過以下方式確定是否存在額外的冗餘參數頁(768+字節以上區域):檢查前四個字節是否包含參數頁簽名的至少兩個字節。

成功獲取參數頁之後,主機就可以和目標進行通信了。

關於ONFI 1.0標準,詳見官網(http://www.onfi.org/)。

關於ONFI 1.0中一些重要知識點的中文翻譯: http://blog.sina.com.cn/s/blog_7cedb56d0102vvrg.html

 

解決方案:

最終,在BSP定位到了ipq_nand_get_info_onfi()這段代碼,在實際代碼中其只對一個255bytes大小的結構進行了讀取,而對冗餘區域(256-511 bytes,512-767 bytes)沒有任何讀取判斷的操作。並且也沒有對前255bytes大小的數據進行CRC校驗。

正是代碼中的這段缺陷,導致當前255bytes出錯後,程序無其他備份數據參考,就停止了運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章