マイコン工作実験日記

Microcontroller を用いての工作、実験記録

DualSense Input Demo

2022-10-31 12:09:35 | Weblog
DualSenseの動作を確認するために、LVGLを使ってボタンやセンサーの動きを表示する簡単なデモを作ってみました。



ボタン機能については、押された時に該当する位置に赤丸を表示。アナログスティックは、動きに応じて青線を表示しています。トリガーは、引き方に応じて赤マルサイズを変更。最後に、DualSense全体を前後、左右に傾けて、DualSenseの姿勢状態を右側の円形表示部分を変化させています。

Linuxのドライバーコードでは、アダプティブトリガの機能については、サポートされていないのでトリガがスカスカのままだったのですが、このサイトの情報を見つけて、USB経由でトリガの強さもHIDのOutput Reportで変更できることがわかりました。やはり、ちょっと手応えが無いとダメですね。

このデモを動かしている程度では、ほとんどUSBのエラーは発生しません。複数のボタンを同時に操作しながら全体を動かしたりして、画面変化量を増やすと時折TXERR が発生するようです。どうも、SDRAMへの書き込みが頻繁に発生するとエラーが発生しやすくなるような気がします。


USBの動作を調べる

2022-10-12 13:07:28 | DoomPlayer

DualSenseをつないで動かすとUSBエラーが多発する問題に悩まされているので、まずはUSBの動作タイミングをロジアナを使って確認してみました。具体的には、SOFで割り込みがかかった時に、GPIOのピンを反転させることで、SOF割り込みのタイミングを検出。その後、AudioクラスでのISOCフレームの送信開始処理並びに終了検出ができた時点で、別のピンを上げ下げします。HIDクラスでも同様に別のピンを上げ下げすることで、処理が間に合っているかどうかを確認してみました。

High speedでつなげているので、SOFは125μsec周期で発生します。AUDIOクラスでのIsoc転送並びにHIDクラスのInterrupt転送は1ms周期で発生しています。拡大してみると。。。

125μsecの間に、Isoc転送とInterrupt転送が完了していることがわかります。HIDの転送は2つの部分に分かれていますが、これは送信と受信の両方を行なっているためです。また、Isoc転送とInttertup転送の最初の部分が時間的には重なっていますが、これはAudioクラスとHIDクラスのソフトウェア処理が別のタスクにより実行されているために並行処理されているためです。ハードウェア的には、Isoc転送が完了してからIntterrupt転送が実行されています。 このように処理時間的には、間に合っていると判断できます。仮に処理開始が遅くなる場合が発生したとしても、常にIsoc転送の方が先に実行されているので、HID処理が間に合わなくなることがあってもAudio送信には問題は発生しそうもないのですが、実際にはひどく音がぶつぶつと切れてしまいます。

STM32H7B3のUSBは、High speedだけでなくFull speed動作にも設定できるので、Full speedでの動作も試してみました。

今度は、SOFが1msec周期で発生しており、Isoc/Interrupt転送は時間内に完了しています。やはり、音切れやInterrupt転送でのエラーは発生しているのですが、High speedよりもその頻度は半分以下になっている印象です。 Music Playerを走らせて画面に動きがあると、音切れ/エラーが発生しますが、画面に変化がなければ全く問題は発生しないようです。また、Music PlayerではなくDoomを動かした場合には、格段にエラーの発生頻度が下がります。画面のアクセスと関係がありそうに思われるので、フレームバッファの配置場所を DRAMから AXI SRAMに変更してみたりもしたのですが、ほとんど影響は無いようです。 このような状況で、音切れ/エラーの発生原因はいまだに不明。USBタイミング的には問題ないので、画面アクセスによりUSBの配線パターンにノイズが載るとかしているのかもしれません。

DualSenseをつなぐには -- その2

2022-10-05 12:55:09 | DoomPlayer

STM32H7B3I-DKにUSBでDualSenseをつなげているのですが、LvglのMusic Playerを動かして48kHzで音楽を再生すると、ボロボロとUSBのエラーが多発して再生音にもブツブツと音切れが発生してしまうことが判明。静的な画面を表示している時には、綺麗に音楽を再生できるのですが、画面に動きがあるとエラーが発生してしまうようです。

Lvglの描画処理タスクよりもUSBの処理タスクの方の優先度を高くして設定してあるのですが、まだ処理が間に合っていないのでしょうか? 最初はFFTをかけてスペクトラム表示している処理が負荷になっているのかと思いましたが、そうではない様子。スペクトラム表示処理を止めて、画面をスクロールするだけでも、USBでエラーが発生してしまうようです。USBのプロトコルアナライザーとかあれば良いのですが、簡単に購入できるものでもないので、どうやって原因を調査すれば良いのか思案中です。