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の配線パターンにノイズが載るとかしているのかもしれません。