前回の論理的な速度の考察を踏まえて、実際にFX3のファームウェアの改造にとりかかります。
とはいえ、現在弊社のSVI-06ボードで使用しているファームウェアは「slfifosync」サンプルをベースとしており改造ポイントは多くありません。
(アプリケーションノートAN86947でも速度上のポイントとして挙げられています。)
改造のポイントをご紹介します。
<エンドポイントの作成>
エンドポイントの作成時にバースト長を適切なサイズに設定します。
slfifosyncサンプルでは1になっていますがこの数字を大きくします。最大値は16になります。
アプリケーションノートに記載されている通り速度に影響があります。
epCfg.burstLen=16
併せて、「cyfxslfifousbdscr.c」ファイルの「Super speed endpoint companion descriptor」のバースト長設定値に(epCfg.burstLenで設定した値-1)を設定します。(epCfg.burstLen=16であれば、15を設定)
<DMAバッファの作成>
DMAバッファの作成で速度に影響があるのは、DMAのサイズとバッファ数になります。
1点注意としては、SUPER SPEEDの時だけ有効な設定になります。
USB2.0モードに書き設定を行うと不具合が発生する可能性がありますのでご注意ください。
slfifosyncでは1024(SUPER SPEEDの時)となっていますが、この値を大きくします。
この値を大きくしすぎるとFX3が起動しなくなりますので、転送レートを見ながら最適な値に調整します。
dmaCfg.size = 4096~16,384;
次にDMAのバッファ数を設定します。slfifosyncでは2が設定してありますが、この値を大きくします。
dmaCfg.count = 4;
併せてDMAのタイプをMANUALからAUTOに変更します。
apiRetStatus = CyU3PDmaChannelCreate (&glChHandleSlFifoUtoP, CY_U3P_DMA_TYPE_AUTO, &dmaCfg);
このような修正を行うことにより、FX3を高速に駆動させることができるようになります。
<参考ソースコード>
参考となるソースコードですが、GitHub上に noritanさんが公開をしているソースコードSlaveFifoSyncNtan011があります。
こちらがとても参考になると思います。
(この記事を作成するときにも参考にさせていただきました。noritanさんありがとうございます。)
<パラメータによる転送レートの違い>
次に転送レートの違いについて結果のみ簡単にお知らせいたします。
上記のパラメータを変更した場合の転送レートの計測結果が下記となります。
(SVI-06ボードを使用して、PCの構成などは1回目に報告した最速の構成を使用して計測しています。)
この結果を見ていただくとわかるのですが、バースト長を変更しても速度に影響をさほど受けていない結果となっています。
弊社としてもバースト長の設定が誤っているのではないかなどの検証の疑義があり、別途USBパケットキャプチャーを行い通信の様子を確認しました。
確かにバースト長を長くするとバーストはしているのですが、ホストPCの性能が良いのかわかりませんが、バーストしなくても高速に取り込めていることがわかりました。
そのため、バースト長1でほぼバーストしなくてもよい状態となっておりました。そのため今回はこのような結果となっていおり、今回はこのまま公開することといたしました。
この点は今後継続して調査を進める必要があると考えています。当然ホストPCが変わればこのバースト長がより機能して転送レートに対するインパクトがあると思います。
FX3ファームウェアでの対応は今回で終了です。
それほどやれることは多くありませんね。
次回からはPC側での検証にうつっていきます。