1. はじめに
SoC FPGA の Quad SPI Flash Controller では、Preloader の段階でキャリブレーションを行い、その際に最もデータの取りやすいタイミングを決定します。
上記の通り Preloader もしくは U-Boot を使用した QSPI へのアクセスにおいては、キャリブレーションの結果が反映されていますのでユーザーでの設定は不要ですが、後段のユーザーアプリケーションや、 ドライバーをユーザーで実装するタイプの RTOS にて QSPI へアクセスをする場合においては、基本的にユーザーにて同様の仕組み、または Preloader のキャリブレーション結果を用いて実装する必要があることにご注意ください。
この資料では そのタイミングの決定の仕方と、その結果の確認方法について解説します。
2. Preloader で行う QSPI のキャリブレーションの仕組み
まずはじめに、QSPI デバイスに供給するシリアルクロックを十分に遅いクロックに設定し、Device ID を読み出します。
このときの Device ID の値を、を読み出し成功時の値として利用します。
続いて、ターゲットの動作周波数に切り替え、Read Data Capture Delay レジスターの設定値を 0 からインクリメントしながら、QSPI デバイスに対して Device ID を読み出します。
成功時の値と比較し、一致していれば読み出し成功と判断し、そのときの Read Data Capture Delay レジスターの値をしきい値の下限として採用します。
その後も Read Data Capture Delay をインクリメントし比較を継続して行き、成功時の値と不一致となった直前の Read Data Capture Delay 値をしきい値の上限値として設定します。
そして、下限と上限の中間の値を取ることで最も余裕のある値を設定します。
参考:
Read Data Capture Delay レジスターについては下記資料をご参照ください。
Cyclone® V HPS Memory Map
3. Read Data Capture Delay の値を決定しているコード紹介
先に述べたように、Read Data Capture Delay の値を決定することにより、最もデータの取りやすいタイミングを決定しています。
この章では Read Data Capture Delay の値が決定されるコードを以下に紹介します。
ファイルパス: uboot-socfpga\drivers\spi\cadence_qspi.c
【図 1】 Read Data Capture Delay を設定しているコード
4. ログ上で確認する Read Data Capture Delay の値
Preloader では Read Data Capture Delay の値をログ上に表示します。
以下が実際のログの抜粋です。
【図 2】 Prealoder ログ抜粋
上記ログの場合、しきい値の下限/上限、Read Data Capture Delay の値は下記のように設定されています。
- しきい値下限: 0
- しきい値上限: 7
- Read Data Capture Delay の値: 3
このように、ログ上からでも Read Data Capture Delay の値を確認することができるので、もし機会があれば確認してみてください。
注記:
【図2】は Preloader v2013.01(Cyclone® V / Arria® V)、 v2014.10(Arria® 10)以前のバージョンでの画像になります。Quartus® Prime ver21.1_Std や ver21.3_Pro など最新の Preloader の場合は、バージョンによってログが異なりますので、表示されない場合は、Rdelay(rddatacap)レジスタの値を Read して確認ください。