i.MX28 SOC DMA 讀取 NAND 快閃記憶體逾時

i.MX28 SOC DMA 讀取 NAND 快閃記憶體逾時

我正在將最新的 Linux 核心移植到較舊的現有硬件,例如 Freescale 的 i.MX28 EVK 套件和 Karo TX28 板。我想使用NAND FLASH中檔案系統的一部分(NAND中的“userfs分區”)。

第一步是使用 ubiattach /dev/ubi_ctrl -m 6。這會導致 start_dma_without_bch_irq (gpmi-nand.c) 中的 DMA 逾時。奇怪的是,第一個 read_page 操作成功了。然後暫停。

第一印像是時間問題。改變 NAND 時序並沒有改變觀察到的行為。大量調試,主要集中在 GPMI、GPIO 和中斷收集器寄存器中的值,沒有透露任何資訊。

我設法在 i.MX28 EVK 板中的 NAND 晶片的控制線上建立了一些測量連接。使用 Saleae(仿)邏輯分析儀,我可以看到許多正確的事務(在 20、40 等範圍內)。然後設定讀取,NAND 訊號準備好正確,要求 GPMI 讀取數據,並且 GPMI 確實將數據從 NAND 輸出,但是失敗設定晶片使能線(低電位有效)。看起來 GPMI 內部不再正常運作。現在,用於發出讀取操作結束訊號的 ISR 尚未輸入(我使用第二個晶片啟用線來發出訊號,偵錯輸出講述了相同的故事)。因此超時。看來GPMI內部「混亂」了。

我確實檢查了晶片使能線的引腳多路復用器在超時後仍然正確。判斷調試輸出時,Karo TX 28 上也會發生相同的情況(引腳上沒有測量,我無法連接)。

我看過與 i.MX23 問題相關的舊郵件,並重置 GPMI 兩次(U-boot 和 Linux 核心),導致 GPMI 掛起。使用該修復程序並沒有改變。在 Linux 核心 5.0.8 和 4.20.7 上觀察到此問題。據我判斷,從 U-Boot 使用時 NAND 工作正常。我嘗試了與 U-Boot 使用的相同的計時設置,但沒有成功。

另請注意,Karo 板上使用了三星 NAND,i.MX28 EVK 上使用了 Spansion 的零件。所以這似乎與特定的NAND晶片無關。另請注意,當從 U-boot 中的 Linux 引導命令列附加 NAND 分割區時,也會觀察到相同的情況。

問題是如何找到根本原因以及可能的解決方案。

答案1

首先我進行了大量的調試,沒有找到解決方案。然後我意識到我在舊的 Linux 版本上可以工作(它是由另一家公司在幾年前準備的)。這證明不是硬體問題。此外,兩個不同的硬體板顯示相同的問題這一事實表明不是硬體問題。在某個時候,我決定嘗試舊的 Linux 版本,盡可能接近舊的工作解決方案。這表明內核 3.16.68 使用自己的建置工作正常。我的 5.1.5 和 4.20.7 版本顯示了 NAND 快閃記憶體問題。更多實驗表明,最後一個工作內核是 4.16.18,從 4.17.1 及更高版本開始出現該問題。看來,飛思卡爾 GPMI 週邊的 NAND FLASH 支援已經被重組。我認為這是由飛思卡爾完成的,以適應更新的處理器/SOC。看起來對舊硬體的支援已被破壞。我不知道飛思卡爾是否知道這一點。有跡象表明飛思卡爾不再支援舊的 i.MX28。不管怎樣,現在是時候分析差異了。關鍵的差異在於新增的用於調整 GPMI 外設時脈頻率的函數呼叫。無論出於何種原因,在註解掉這一單一呼叫後,GPMI 週邊似乎可以與 NAND 快閃記憶體一起正常運作。此程式碼駐留在檔案「drivers/mtd/nand/raw/gpminand/gpmi-lib.c」中,函數「gpmi_nfc_ap​​ply_timings」。只需註解掉對“clk_set_rate”的呼叫即可。至少對我來說這有效。後來我意識到,最好只在處理器是 i.MX28 時避免調用,以允許它為以後的晶片工作。

我沒有分析 clk_set_rate 到底做了什麼,以及如何呼叫它來為所有處理器工作。我沒有其他硬件,所以無法檢查。

相關內容