i.MX28 SOC DMAリードNANDフラッシュメモリタイムアウト

i.MX28 SOC DMAリードNANDフラッシュメモリタイムアウト

Freescaleのi.MX28 EVKキットやKaro TX28ボードなど、既存の既存のハードウェアに最新のLinuxカーネルを移植しようとしています。 NAND FLASH(NANDの「userfsパーティション」)でファイルシステムの一部を使用したいと思います。

最初のステップはubiattach /dev/ubi_ctrl -m 6を使用することです。この操作は、いくつかのgpmi_read_page操作を実行してボリュームテーブルを検索し、NANDチップを読み取ろうとします。これにより、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がまだ入力されていません。 (これを知らせるために2番目のチップ起動ラインを使用しており、デバッグ出力も同じことを知らせます。)したがって、タイムアウトが発生します。 GPMI内に「混沌」があるようです。

タイムアウト後も、チップアクティベーションラインのピンマルチプレクサがまだ正しいことを確認しました。デバッグ出力を判断すると、Karo TX 28でも同じことが起こります(ピンの測定がなく、接続できません)。

i.MX23 の問題と GPMI を 2 回(U-boot および Linux カーネル)リセットして、GPMI がハングすることに関する以前の投稿を見たことがあります。今回の修正に変更はありません。この問題は、Linuxカーネル5.0.8と4.20.7で発生します。私が知る限り、NANDはU-Bootで使用するとうまくいきます。 U-Bootが使用するのと同じタイミングを設定しようとしましたが、成功しませんでした。

また、KaroボードにはSamsung NANDを使用し、i.MX28 EVKにはSpansion部品を使用しています。したがって、これは特定のNANDチップとは関係がないようです。また、U-bootのLinuxブートコマンドラインからNANDパーティションを接続しても同じ動作が観察されます。

問題は、根本的な原因と考えられる解決策を見つける方法です。

ベストアンサー1

最初はデバッグをたくさんしましたが、解決策が見つかりませんでした。それから、私は以前のLinuxバージョン(数年前に他の会社によって準備されたバージョン)で作業していることに気づきました。これはハードウェアの問題ではないことを証明します。さらに、2つの異なるハードウェアボードに同じ問題が現れるという事実は、ハードウェアの問題ではないことを意味する。ある時点で、私は既存の作業ソリューションにできるだけ近づくために、以前のLinuxバージョンを試してみることにしました。これは、カーネル3.16.68が独自のビルドを使用して正しく機能していることを示しています。私のバージョン5.1.5および4.20.7では、NANDフラッシュの問題が表示されます。より多くの実験によると、最後に動作するカーネルは4.16.18であり、問​​題は4.17.1以上から現れ始めました。 FreescaleのGPMI周辺機器のNAND FLASHサポートが再構成されているようです。私は、これが最新のプロセッサ/SOCに対応するためにFreescaleによって行われたと思います。古いハードウェアのサポートが中断されたようです。 Freescaleがこれを知っているかどうかはわかりません。 Freescale が以前の 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が正確に何をしているのか、すべてのプロセッサで動作するように呼び出す方法を分析しませんでした。他のハードウェアがないため確認できません。

おすすめ記事