i.MX8DXL DDR3L EVKボード、NOR型フラッシュで使用するのはMT25QU512ABB8ESF-0SITです。
このドキュメントでは、MT25Qフラッシュから起動するためのFlexSPI設定パラメータの基準を、QUADパッドとDDRモードとで示します。
HW: i.MX8DXL DDR3L EVKボード
SW:Linux 5.4.70 BSP
RM 5.9.3.2以降、FlexSPIシリアルのフラッシュブート操作、FlexSPIブートフローは次のようになります。
FlexSPI設定パラメータは、2つのグループに分類できます。FlexSPI コントローラに関するパラメータと、NOR型フラッシュの操作関連パラメータです。
パラメータテーブルの完全チェックについては、i.MX8DXL RM「表5-20.FlexSPI設定ブロック」を参照してください。
MT25Qのデータシートを確認の上で、その機能を見てみましょう。ターゲットはDDRモード(80MHz)とQUADパッドであることに注意してください。
次に、FlexSPI設定パラメータを変更しましょう。
1>readSampleClkSrc を 2 に設定します。これは SCK パッドからループバックします。このフィールドはデフォルトで 0 に設定されており、この設定で起動するとこのユースケースではエラーが発生するため、2 に変更します。
2>deviceModeCfgEnableを1に設定し、deviceModeSeq.seqNumを1に設定し、deviceModeSeq.seqIdを4に設定し、deviceModeArgを0x5f に設定します。
i.MX8DXLからは、MT25QがDDRモードとQUADモードに入るよう、いくつかのコマンドをフラッシュに送信します。そのため、deviceModeCfgEnable = 1です。
seqNum=1、seqId=4の場合、LUTテーブルのインデックス4にこのシーケンスが格納され、LUTエントリが1つ必要であるということです。LUTエントリを変更する方法については後述します。
deviceModeArg=0x5fの場合は、MT25Qデータシートを確認します。その拡張揮発性レジスタを書き込むことで、フラッシュの動作モードを設定できます。
3>controllerMiscOptionを0x40にすると、このパラメータはFlexSPI コントローラ自体にのみ適用され、「外部デバイスはDDRコマンドを使用して動作する」という意味になります。
4>deviceType=1(シリアルNOR)、sflashPadType=4(QUADパッド)、serialClkFreq=4(80MHZ CLK)、これらのパラメータもFlexSPIコントローラ専用です。
5>sflashA1Sizeに実際のサイズをバイト単位で設定します。
6>LUTエントリの変更では、次に示す8DXL RM表5-21を確認します。
つまり、LUTエントリ0は読み取りコマンドのシーケンス、エントリ1は読み取りステータスシーケンス、エントリ3は書き込み有効シーケンス、エントリ15はダミーコマンドシーケンスです。
他のインデックスLUTエントリ(2、4、6、7、8、10、12、13、14など)も、フラッシュデバイスに必要なコマンドのシーケンスを格納するのに使用できます。当社ではMT25Q拡張揮発性レジスタへの書き込みシーケンスをLUTエントリに格納します。
8DXL RM「図15-6.LUTとシーケンスの構造」を確認します。
各LUTエントリ(シーケンス)では16バイトを使用し、1つのシーケンスは最大8つの命令で構成され、各命令では16ビットを使用します。
各命令は、オペコード—num_pads—オペランドの形式で表されます。
サポート対象の命令については、RM 15.2.4.8「プログラマブル・シーケンス・エンジン」を参照してください。
Mt25Q揮発性レジスタを書き込むので、実際にはまず書き込み有効シーケンスが他のシーケンスよりも前に実行されます。その前に、書き込み有効シーケンスが発行される必要があります。
MT25Qデータ・シートで次のことを確認します。
このシーケンスで必要なのは1つの命令、0x0406のみです。現時点ではまだSDRと1パッドモード、つまりオペコード(CMD_SDR)、1パッド(0)、オペランド(6)を使用しています。
LUTエントリ1、読み取りシーケンス、MT25QのREAD STATUS REGISTER(05h)です。データ・シートで次のことを確認します。
次の2つの命令を使用します。
0x0405:オペコード(CMD_SDR)、パッド(1パッド)、オペランド(0x5、READ STATUS REGISTER)
0x2404:オペコード(READ_SDR)、パッド(1パッド)、オペランド(0x4、バイト番号)
LUTエントリ4は、MT25QをDDRモードにし、クワッドパッドにするためのものです。
MT25Qデータ・シートより:
次の2つの命令を使用します。
0x0461:オペコード(CMD_SDR)、1パッド(0)、オペランド(0x61 WRITE ENHANCED VOLATILE CONFIGURATION REGISTER)
0x2001:オペコード(WRITE_SDR 08)、1パッド(0)、オペランド(1バイトデータサイズ)
0x5fはデータとして送信されます。
次に、LUTエントリの読み取りを確認します。この時点で、MT25QはQUADパッドとDDRモードに入っています。
LUTエントリ0、読み取りシーケンス、MT25Qからの高速読み取りデータです。データシートより:
次の4つの命令を使用します。
86ED、オペコード(CMD_DDR)、パッド(4パッド)、オペランド(0xEDh、高速読み取り)
8a18、オペコード(RADDR_DDR)、パッド(4パッド)、オペランド(0x18、3バイトアドレス)
B210、オペコード(DUMMY_ADDR)、パッド(4パッド)、オペランド(0x10、ダミーサイクル)
A604、オペコード(READ_DDR)、パッド(4パッド)、オペランド(0x4、データバイト)
参考情報:
1.i.MX8DXL リファレンス・マニュアル
2. MT25Qデータ・シート
@fushi_peng様、FLEXSPI LUTエントリの構築に関して、このような説明を探し求めておりました。非常に役立つブログ、どうもありがとうございました。