Armadilloフォーラム

USBのアイパターン取得方法

tetsuya.ooka

2014年5月13日 11時08分

いつも大変お世話になっております。ロームの大岡です。

Armadillo-410に搭載されているUSBホストコントローラのアイパターンを測定したいと思うのですが、
Armadillo側からテストパケットを送信する方法がわからなくて困っています。

カーネルコンフィグの以下のあたりを有効にすればいいのかなとは思うのですが、
そこから先がよくわかっていません。どなたかご教授願えないでしょうか。
Device Drivers --->
[*] USB Support --->
< > USB testing driver
< > USB Gadget Support

それでは、よろしくお願いします。

コメント

forks_yas

2014年5月14日 12時36分

FORKS 寺島と申します。

i.MX25xでテストパケットを送信するためには、カーネルコンフィグではなく、drivers/usb/host/ehci-arc.c のehci_testmode_init() を動くようにする必要があります(デフォルトでは#undef EHCI_PROC_PTC によってなにもしない関数が選択されています)。
なお、#undefを削除しただけでは、procのエントリを”ehci-ptc"という1つしか作らず、i.MX25xのように複数EHCIコントローラが存在する場合に対応できないので、pdev-idを使ってコントローラ毎にprocのエントリ(例えば"ehci-ptc.0"と"ehci-ptc.1")を作成するようソースを修正します。

修正したドライバを使うと、/proc/driver/ehci-ptc.0 のようなエントリが出来るので、ここにPORTSCレジスタのPTCフィールド設定値を書き込むとテストモードになります(4でテストパケット送信、i.MX25xのリファレンスマニュアルを参照して下さい)。

以上、ご参考まで。

> いつも大変お世話になっております。ロームの大岡です。
>
> Armadillo-410に搭載されているUSBホストコントローラのアイパターンを測定したいと思うのですが、
> Armadillo側からテストパケットを送信する方法がわからなくて困っています。
>
> カーネルコンフィグの以下のあたりを有効にすればいいのかなとは思うのですが、
> そこから先がよくわかっていません。どなたかご教授願えないでしょうか。
> Device Drivers --->
> [*] USB Support --->
> < > USB testing driver
> < > USB Gadget Support
>
> それでは、よろしくお願いします。

at_ohsawa

2014年5月14日 14時54分

既に寺島様が答えられている方法と同様ですが、

アットマークテクノでもdrivers/usb/host/ehci-arc.c
からテストモードを有効にするレジスタを使用して
コンプライアンステストを行っています。

添付のパッチ(usb_compliance_test.patch)
をカーネルに当てると下記のprocfsができます。

/proc/driver/ehci-ptc-c8802540 (CON5 上段 LS/FS)
/proc/driver/ehci-ptc-c8804140 (CON5 下段 LS/FS/HS)

procfsに0から7までの文字列を書き込む事で、
USBのコンプライアンステスト用の波形を出力できます。

echo 4 > /proc/driver/ehci-ptc-c8804140

テストモードはUSB Specification 2.0 の
7.1.20 Test Mode Support に対応する下記の
8つのモードが使用できます。

0: TEST_MODE_DISABLE
1: J STATE
2: K STATE
3: SE0 (host) / NAK (device)
4: Packet
5: FORCE_ENABLE_HS
6: FORCE_ENABLE_FS
7: FORCE_ENABLE_LS

ファイル ファイルの説明
usb_compliance_test.patch

tetsuya.ooka

2014年5月14日 16時17分

寺島様、大沢様
ありがとうございます。

説明して頂いた方法を試してみます。

追加で質問があるのですが、ホストコントローラにハブを接続している場合、
テストパターンをハブのどのポートから出力させるか指定する事はできますでしょうか?

現在開発中の製品では、HSのUSBにハブを接続して外部周辺機器接続用のポートとして公開しています。
実際にテストしたいのはこのポートから出力される波形です。
ハブがテストパターンを全ポートに分配してくれたりするのでしょうか。
それとも追加の設定が必要になりますか?

forks_yas

2014年5月14日 17時31分

FORKS寺島です。

その場合は、USBハブチップのテストモード(TESTピンをアクティブにする等)を使うのではないでしょうか?
使用するチップのマニュアルを参照して下さい。

forks_yas

2014年5月14日 17時52分

FORKS寺島です。

ソフトウェア的にはハブのport featureをtestmodeにすれば良い筈(USB 2.0 specification 11.24.2.13 Set Port Feature)ですが、ソースをちょっと眺めた感じでは、見落としがあるかも知れませんが、ドライバに手を入れないと出来ないように思います。

tetsuya.ooka

2014年5月19日 19時58分

ロームの大岡です。

寺島様、教えて頂いてありがとうございます。
内容が高度であまり理解できていないのですが、以下のことを全てやる必要があるということでしょうか?

1. usb_compliance_test.patchをあててホストコントローラをテストモードにする
2. USBハブチップをテストモードにする
3. USBハブのドライバを修正してテストモードにする

at_daisuke.sasaki

2014年5月20日 10時39分

佐々木大輔です。

弊社で実際にハブからのTest Packet出力を試しているわけではないですが、、、

ソフトウエア制御により、USBハブのTest Packetを出すために必要な制御は
「3. USBハブのドライバを修正してテストモードにする」のみです。

USBハブはUSBホストコントローラから送信するリクエストにより、テストモードに遷移する事ができます。
(USB規格により規定されています)
このリクエストが寺島様がおっしゃられている「USB 2.0 specification 11.24.2.13Set PortFeature」に記載されているものです。

従い、USBホストコントローラはテストモードではなく通常モードである必要があります。
つまり、
> 1. usb_compliance_test.patchをあててホストコントローラをテストモードにする
については行ってはいけません。

USBホストとしては、この状態で「USB 2.0 specification 11.24.2.13Set PortFeature」に記載されている
PORT_TESTのシーケンスに従う事でテストモードに遷移する事が可能です。

詳細は確認できていないのですが、カーネル(linux-2.6.26-at)のdrivers/usb/hub.cに
Set PortFeatureを送るための関数があるようなので、これを活用する事でUSBハブにリクエストを送る事ができそうです。

もしも、ご使用のチップに、外部端子の制御によるテストモードへの遷移機能がある場合は、
> 2. USBハブチップをテストモードにする
によるテストも可能です。
これは、ソフトウエア制御によるテストモード遷移とは全く別のもので、
どちらかの手段でUSBハブをテストモードに遷移させる事ができればよいです。

tetsuya.ooka

2014年5月20日 20時04分

ロームの大岡です。

佐々木様、説明して頂いてありがとうございます。
もう少しだけ質問させてください。

> 1. usb_compliance_test.patchをあててホストコントローラをテストモードにする
> 2. USBハブチップをテストモードにする
> 3. USBハブのドライバを修正してテストモードにする
上記手順で1.はホストをテストする手順、
2.と3.はハブのみをテストする手順という事でしょうか?

最終的にやりたいことは、ハブにアイパターン計測用機器をセットして
ホストのアイパターンを取得することなのですが、

ホストからテストパターンを出力して、
ホストに接続しているハブにそのテストパターンを分配させ、
ハブからの出力を計測してホストのアイパターンを見るという事は不可能なのでしょうか?

at_daisuke.sasaki

2014年5月20日 20時45分

佐々木大輔です。

> 上記手順で1.はホストをテストする手順、
> 2.と3.はハブのみをテストする手順という事でしょうか?

はい。正しいです。

> 最終的にやりたいことは、ハブにアイパターン計測用機器をセットして
> ホストのアイパターンを取得することなのですが、

HS(High Speed)のEye Patternを計測する場合ですが、
USBハブは、HSの転送をする際、USBハブ内部の物理層で、
USBホストからの信号の切り直しを行っています。
(切り直しを実施しなければ波形品質を保てないためです)

そのため、クロスポイント、オーバーシュート、アンダーシュートやジッタなど
Eye Patternに影響する要素は、USBハブの回路に依存すると言えます。
この仕様により、USBハブが多段構成になることで、末端のUSBハブの波形品質が悪くなる。
という事はありません。

つまり、USBハブのEye Patternを測定しておけば、装置としての波形品質は保てるはずです。

> ホストからテストパターンを出力して、
> ホストに接続しているハブにそのテストパターンを分配させ、
> ハブからの出力を計測してホストのアイパターンを見るという事は不可能なのでしょうか?

USBハブはアップポート(USBホスト側のポート)からの信号を、
有効なダウンポート(USBデバイス側のポート)にブロードキャスト転送する仕様です。
ダウンポートを有効にする事ができれば、自然とUSBホストからのパケットはダウンポートに流れます。

ただし、私の理解では、Eye Patternの試験ではUSBデバイスを挿さずに解放状態で試験するため、
ダウンポートが有効になりません。
Set PortFeatureでC_PORT_ENABLEに設定する事で、ポートを強制的に有効にできるかもしれませんが、
通常このような試験は行われないと思いますので、実現可能かも含めわかりません。