ZYNQでUSBを使うにはULPIというインタフェースICを使う必要があります。
ULPIってなんじゃ?LinuxのカーネルをコンパイルしていてもULPI,ULPIって「うるぴー」って言いたくなります。
ULPIとはUTMI+ Low Pin Interfaceの略で、UTMI+はUSB2.0 Transceiver Macrocell Interfaceの略です。つまり、USB2.0 Transceiver Macrocell InterfaceのLow Pin Interface版がULPIということのようです。
これだと何が何だかわからないので、まずUTMI+ですが、UTMI+の仕様書はIntelが出しています。
https://www.intel.co.jp/content/www/jp/ja/products/docs/io/universal-serial-bus/usb2-transceiver-macrocell-interface-specification.html
で読むことができます。USBの通信をパラレルで送信するための規格がUTMI+で、それを少ないピンで実現するバージョンがULPIです。UTML+が54本の信号なのに対してULPIは12本で済みます。EtherにおけるMIIとRMIIのような関係と言えます。
ZYNQのMIOにULPIをつなぐ際にULPI用のトランシーバとしてMicrochip社のUSB3320を使うのが定番になっています。
DATA[7:0]のほか、STP、NXT、DIRという信号があり、ULPIのインタフェースICからFPGAに対してCLKが送られます。
さて、ZYNQで使えるULPIといえばUSB3320が定番だったのですが、USB3320は品薄で、現時点で注文しても来年の3月まで入荷することができません。そこでUSB3320の代わりになるデバイスを探す必要が出てきました。
Digikeyで「ULPI」や「USB Transceiver」をキーワードに検索してみると、
- STULPI01BTBR (ST)
- USB3311 (Microchip Technology)
- USB3314 (Microchip Technology)
- USB3315 (Microchip Technology)
- USB3316 (Microchip Technology)
- USB3317 (Microchip Technology)
- USB3318-CP (Microchip Technology)
- USB3319 (Microchip Technology)
- USB3320 (Microchip Technology)
- USB3340 (Microchip Technology)
- USB3343 (Microchip Technology)
- CY7C68003 (Cypress)
- TUSB1210 (Texas Instruments)
- STULPI01A (ST)
- FUSB2805 (Onsemi)
- ISP1504 (NXP)
と、いくつかの候補が出てきます。MicrochipにはUSB3320以外にもいろいろ候補があるようですね。
この中のどれが実際に使えるのかというと、Linuxでどれがサポートされているかというのを知る必要があります。Linuxのソースを読んでみると、https://github.com/Xilinx/linux-xlnx/blob/master/drivers/usb/phy/phy-ulpi.c に定義されています。
/* ULPI hardcoded IDs, used for probing */
static struct ulpi_info ulpi_ids[] = {
ULPI_INFO(ULPI_ID(0x04cc, 0x1504), "NXP ISP1504"),
ULPI_INFO(ULPI_ID(0x0424, 0x0006), "SMSC USB331x"),
ULPI_INFO(ULPI_ID(0x0424, 0x0007), "SMSC USB3320"),
ULPI_INFO(ULPI_ID(0x0424, 0x0009), "SMSC USB334x"),
ULPI_INFO(ULPI_ID(0x0451, 0x1507), "TI TUSB1210"),
};
なんと、NXP1504、USB331x、USB3320、USB334x、TUSB1210しかサポートされていないようです。(上のファイルに定義を追加すればどれでも認識されるとは思うが、冒険する気にはならない)
ISP1504はDigikeyで扱っていないので×。TUSB1210はDigikeyには在庫はないのですがメーカー在庫はありそうですが即納はできなさそう。
そうするとUSB3318あたりが候補になってくるのかなという感触です。
では、Microchip社のUSB PHYはどこがどうちがうのかというと、データシートを見比べれて差異を読み取ってみました。
まず、いずれの製品も
- USB 2.0 HighSpeed
- ULPI 1.1
- On-The-Go Supplyment 2.0
- FS preampleはUTMI+ level3 (?)
という仕様のようで、USB PHYの基本機能としてはどれも同じように使えるようです。
USB3340はBattery Charging 1.2 Specificationに対応していてバッテリが関わって来る場合に選択肢になるのでしょう。
USB331xは2008年ごろにまだSMSC社だったころの製品で、USB3320はMicrochip社になってからの新しい製品であるようです。USB3320は様々な周波数のリファレンスクロックが選べます。
USB331x内での相違点は、
- USB3310 1.8V I/O, Switchなし, 24QFN, クロックは13, 19.2, 24 or 26MHz
- USB3311 1.8V I/O, Switchなし, 24QFN, 26MHz
- USB3315 1.8V-3.3V I/O, Switchなし, 24QFN, 24MHz
- USB3316 1.8V I/O, Switchあり, 24QFN/25BGA, 19.2MHz
- USB3317 1.8V-3.3V, Switchなし, 24QFN/25BGA, 26MHz
- USB3318 1.8V-3.3V, Switchなし, 24QFN, 13MHz
- USB3319 1.8V I/O , Switchあり, 24QFN/25BGA, 13MHz
つまり、USB331xシリーズの中の違いは、I/O電圧と、USB Switchの有無、外部クロックの周波数にあるようです。SMSC/Microchip社のUSB PHY特徴としてはCarkit(UARTモードやオーディオモードになる)というのがあるようですが、詳しくはわかりません。
結論を言うと、ド定番のUSB3320は来年まで入手できないので、USB3318などの他のICを使うしかなさそうです。型番が違ってもおまけ機能的な違いであって、USB PHYとしては機能するように見えます。
再掲になりまsが、Linuxのカーネルがデフォルトで対応しているのは、
- NXP ISP1504
- SMSC USB331x
- SMSC USB3320
- SMSC USB334x
- TI TUSB1210
です。
選択肢はいろいろあるように見えますが、TIのTUSB1210も半導体不足のため来年まで入手できません。ISP1504はDigikeyでもMouserでも扱っていないようなので、結局はSMSCのUSB331xを使うしか他に選択肢はなさそうです。
このICの在庫が尽きなければZYNQでウルピーを使う回路がまだ作れそうです。
最近のコメント