之前我自己設計了一個板子,用的spi-flash的型號是w25q128,后面為了驗證一個問題,買了一塊方案驗證板子,上面flash的型號是xt25f128b,于是,我將之前編譯好的韌體直接燒錄進去就出現了問題,終端列印的錯誤資訊如下:
unrecognized JEDEC id bytes: 0b, 40, 18
具體如下圖所示:

根據報錯資訊,我開始漫漫除錯之旅,首先在U-boot的原始碼下進行查找列印日志的位置,發現在spi_flash.c的919行,有相應的輸出,具體如下圖所示;

這里打開spi_flash.c可以看到;

從代碼中可以看出,這段程式試圖在 spi_flash_ids 這個陣列中查找是否有和板載 flash 對應的 id
于是我就嘗試找到這個陣列;

可以看到,在spi_flash_ids.c的46行,出現了 spi_flash_ids 這個陣列的定義,打開這個檔案;

找到了定義相應falsh型號,id,容量等資訊,只需要將板子上的flash相應資訊填入到這個陣列就行了,
看了一下INFO這個宏定義:
/* Used when the "_ext_id" is two bytes at most */
#define INFO(_jedec_id, _ext_id, _sector_size, _n_sectors, _flags) \
.id = { \
...
.id_len = (!(_jedec_id) ? 0 : (3 + ((_ext_id) ? 2 : 0))), \
.sector_size = (_sector_size), \
.n_sectors = (_n_sectors), \
.page_size = 256, \
.flags = (_flags),
重新回頭看一下前面的報錯資訊,提示是JEDEC id無法識別,那下面簡單看一下什么是JEDEC id?

什么是JEDEC?
JEDEC是針對Nor flash的一種標準,另外一種標準是CFI,
JEDEC:全稱是Joint Electron Device Engineering Council 即電子元件工業聯合會,
JEDEC是由生產廠商們制定的國際性協議,主要為記憶體制定;
用來幫助程式讀取Flash的制造商ID和設備ID,以確定Flash的大小和演算法,如果芯片不支持CFI,就需使用JEDEC了,
工業標準的記憶體通常指的是符合JEDEC標準的一組記憶體,
板子上的flash型號是xt25f128b,在datasheet中找到flash的id,確實也是 0x0b4018;

因為這個flash和w25q128fw相似,因此我直接復制,然后修改了id,具體如下圖所示;

重新編譯了u-boot,將韌體燒錄到flash中,這次成功啟動,并且能識別到相應的spi-flash;具體如下圖所示;

不過這個時候,還沒有修改kernel里的設備樹設定:

參考:
https://zhuanlan.zhihu.com/p/76221655
https://github.com/thirtythreeforty/businesscard-linux/issues/11
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286828.html
標籤:其他
下一篇:日常學習筆記
