« EZ-USB FX3の動作テストを再開 | トップページ | MITOUJTAGにALTERAのバウンダリスキャン定義をいろいろ追加 »

2012.11.25

EZ-USB FX3の転送速度が91MB/secまで行った

以前、当ブログによせられたコメントを参考にして、ファームウェアを書き換えてみました。

いただいたコメントというのは、

DMA Channel のバッファがいっぱいになると、次のバッファに切り替える必要があります。この切り替えにかかる時間が、転送速度が高くなると無視できません。
切り替え時間が見えなくなるようにするには、バッファのサイズをパケットの数倍に大きくしてやります。また、 bulk burst の数を同じく数倍にしてやることで、パケットがまとめて送信されるようになります。

というものなのですが、10回くらい読んでようやく何をすれば良いかがわかってきました。DMAのバッファがいっぱいにならないように増やしてやればよいのです。

で、そのやり方ですが、試行錯誤の末、ファームウェアのcyfxslfifosync.cと、cyfxslfifosync.hをそれぞれ1箇所ずつ書き換えます。

まず、ヘッダファイルのほう。CY_FX_SLFIFO_DMA_BUF_COUNTが(2)になっています。これを(4)にします。

Fx3_4

次に.cのほう。dmaCfg.size = size;となっているところを、dmaCfg.size = size * 16;にします。

Fx3_5

これで、DMAバッファの数が増えて、なおかつバッファの深さも増えるのではないかと思われます。

実際にやってみると、

CY_FX_SLFIFO_DMA_BUF_COUNT = 2の場合
・size*1  16MB/s
・size*2  16MB/s
・size*4  41MB/s
・size*8  53MB/s
・size*16 64MB/s

CY_FX_SLFIFO_DMA_BUF_COUNT = 4の場合
・size*1  21MB/s
・size*2  41MB/s
・size*4  66MB/s
・size*8  92MB/s
・size*16 92MB/s

となりました。デフォルトはCY_FX_SLFIFO_DMA_BUF_COUNT = 2、バッファは*1なので16MB/secしか出ませんでしたが、いろいろ増やすと92MB/secまではいくようになったというわけです。

Fx3_6

この方法で確かに高速にはなりました。USB2.0 HighSpeedをようやく超えられるようにもなりました。しかし、問題が1つあって、パケットがある程度溜まらないと送ってくれないんですね。1024バイトのパケットをXferData()で送ろうとしても16個分溜まらないと送ってくれません。まあこういう問題は簡単に解決できるのでしょうけど・・

さらに高速度を目指すにはどうすればよいのかは全くわかりませんが、この路線でもうちょっと頑張ってみようと思います。

【PR】 特電FX3評価ボードの入手方法はこちら
https://shop.tokudenkairo.co.jp/shopping/detail.php?shpdi=TKDNFX3

|

« EZ-USB FX3の動作テストを再開 | トップページ | MITOUJTAGにALTERAのバウンダリスキャン定義をいろいろ追加 »

コメント

SuperSpeed限定でepCfg.burstLenを15に設定
(HS/FS時に↑設定するとドライバが正常に動作しない模様)
SS endpoint companion descriptorの"Max no. of packets in a burst"を0x0fに設定したところ、
手元の環境では、それなりに速度出ました。

参考になれば幸いです。

投稿: | 2012.12.03 14:44

日頃、なひたふ JTAG日記を読ませて頂いております。
大変参考になり、ありがたいです。

既にご存じかも知れませんが、下記が参考になるかと思います。

AN65974 - Designing with the EZ-USB® FX3 Slave FIFO Interface
バージョン:*F

サイプレスの Web よりダウンロード可能です。
AN65974.zip のソースコードが参考になるかと思います。

なふたひさんが行った変更が記述されています。

他には

※#define CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT (0)
    ↓
 #define CY_FX_SLFIFO_GPIF_16_32BIT_CONF_SELECT (1)

等もあります。

私も現在、FX3 を習得(勉強)中です。

投稿: 岡 | 2012.12.05 14:05

こんにちは、特電SP6、特電FX3といつもお世話になりっぱなしです。
NECなUSB3.0 I/F + 上記組み合わせで、上り下りともに 280MB/secオーバーで安定通信できています。

幾つかポイントが有りましたが、本文中の修正に加えて

* cyusbを捨てる。
* DMA でブン回す、極力 ARM9 が転送に関わらないように。

等幾つかありました。
やや癖は強いものの、なかなか可愛いです、FX3。

なにかの参考になれば。

投稿: 海猫 | 2012.12.12 22:56

ちょうどいま、FX3の検証をしていました。
バースト長を15にしてみても、やはり92MB/secまでしかいきません。
AN65974を試してみると、あら不思議。あっさりと200MB/sec出ました。何が違うのかと考えてみると、データバスが32bitということです。

データバスが16bitでも、200MB/secいくんじゃないかとおもったのですが、そうではないようですね。

投稿: なひたふ | 2012.12.12 23:14

コメントを書く



(ウェブ上には掲載しません)




« EZ-USB FX3の動作テストを再開 | トップページ | MITOUJTAGにALTERAのバウンダリスキャン定義をいろいろ追加 »