HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2022/07/23

USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!! USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!

(FPGAに USB HOST機能を実装して Low Speedの USB HIDデバイスを接続するのら)

Tags: [FPGA], [電子工作], [Xilinx XC6SLX9], [FPGA 2022]




● USB HOST機能を FPGAに実装する方法、FPGAに USB HOST機能を実装して HIDデバイスを接続するのら

 FPGAに USBデバイスを接続したいので USB HOST機能を実現します。

 USBのゲームパッドを接続して NESエミュレータやアーケードゲームのコントローラとするのが目的です。

 事前に下記の調査を行い、PicoBlaze KCPSM + FPGAの回路 + いしかわさんの AVR USB HOSTの組み合わせで実現できそうだ、と言う所に居ます。


2022/07/01
Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!
Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!

  PicoBlaze KCPSM6 in Spartan-6 with ISE WebPack

2022/07/07
USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する
USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する

  FPGAに USBデバイスを接続したいのですが、USB HOSTの通信を実装できないので困っています

2022/07/17
USBの通信プロトコルを勉強する
USBの通信プロトコルを勉強する

  今まで漠然としていた USBデバイスの通信方法を理解します


● USB HOST機能を FPGAに実装した結果

 当初の目的通り、FPGA NESのゲームコントローラとして USB GAMEPADを使用する改造ができました!!

 GitHubにプロジェクトをアップロードしています。


2022/06/25
FPGA Spartan-6 XC6SLX16でファミコンを動かす!
FPGA Spartan-6 XC6SLX16でファミコンを動かす!

  Xilinx FPGA Spartan-6 XC6SLX16 NES clone in ALINX AX309


● USBの DP、DM信号の送信部分を Verilogで実装

 とりあえず USBの DP、DM信号の送信部分を Verilogで実装しました。
 これを PicoBlazeから制御します。

 なんちゃって送信実装なので USBの NRZIの仕様の 1が 6個連続の時に必要な ビット・スタッフィング bit stuffingをしません。
 (元々そういうデータの送信をしない前提)

 (シミュレータ上では)意図通りに送信処理が動いています。
 USBの送信データは SYNCの 0x80から始まり、0xD2、0xA5、0x5A、0x3Cの順番で、最後に EOPを送信しています。

・USBの DP、DM信号の送信部分を Verilogで実装
USBの DP、DM信号の送信部分を Verilogで実装



・USB ACKパケットを送信した時の DP、DM信号の送信波形、Verilogで USB機能を実装
USB ACKパケットを送信した時の DP、DM信号の送信波形、Verilogで USB機能を実装




● USBの NRZIの仕様のビット・スタッフィング

 例:
 bit列を 00000000とした時は KJKJKJKJとなり、1bit毎に DP、DM信号の HLが変化します。

・USB DP、DM信号、bit列を 00000000とした時は KJKJKJKJ
USB DP、DM信号、bit列を 00000000とした時は KJKJKJKJ



 例:
 bit列を 01111111とした時は KKKKKKKKとなり、2bit目から DP、DM信号の HLが変化しません。
 なので、この場合は 011111101と 1が6個連続した後に 0のビットを挿入して KKKKKKKJJとします。
 Jや Kの連続状態は最初の 0の変化時を含め、最大で 7個になる。
 ビット・スタッフィングの影響で送信ビット長が 1bit長くなります。
 つまり 6bitの送信に 7bitぶんの時間が必要になります。(転送が相対的に遅くなる)

・USB DP、DM信号、bit列を 01111111とした時は KKKKKKKK、ビット・スタッフィングが無い不正な状態
USB DP、DM信号、bit列を 01111111とした時は KKKKKKKK、ビット・スタッフィングが無い不正な状態



・USB DP、DM信号、bit列を 01111111とした時は KKKKKKKJJ、ビット・スタッフィングが有る正常な状態
USB DP、DM信号、bit列を 01111111とした時は KKKKKKKJJ、ビット・スタッフィングが有る正常な状態
 色変部分が「ビット・スタッフィング」


● FPGAの実機でも USBの波形が出ました

 とりま、FPGAの実機でも USBの波形が出ました。

・FPGAの実機でも USBの波形が出ました
FPGAの実機でも USBの波形が出ました
 SYNC、PID、EOP
 80、D2、EOP


・FPGAの実機でも USBの波形が出ました、USBデバイスから NACKの応答
FPGAの実機でも USBの波形が出ました、USBデバイスから NACKの応答
 SYNC、DATA IN

 USBデバイスから NACKの応答。

・FPGA USB HOST機能の回路図
FPGA USB HOST機能の回路図



・FPGA USB HOST機能の写真
FPGA USB HOST機能の写真


FPGA USB HOST機能の写真


FPGA USB HOST機能の写真


FPGA USB HOST機能の写真


FPGA USB HOST機能の写真


FPGA USB HOST機能の写真


FPGA USB HOST機能の写真


FPGA USB HOST機能の写真
 15kΩの抵抗を持っていなかったので 22kΩでプルダウンしています。

・USBコネクタのピン配置
USBコネクタのピン配置
 +5V:赤
 D-:白
 D+:緑
 GND:黒

今回購入


KKHMF 10個 USB 2.0メスソケット - DIP 4Pアダプタコネクタ2.54mmソルダープリント基板DIY
ASIN: B07TYBQY9W

サンハヤト USB用変換基板 CK-38
ASIN: B00J7LBSOU

uxcell PCBマウントポート USB 2.0 タイプA メス ジャック ライトアングル 5個
ASIN: B01C8CU0TS

Treedix 6個 マイクロ USB to DIP 変換アダプタ 5ピン メスコネクタ Bタイプ 5V PCBコンバータピンボード DIY 電源 ブレッドボードデザイン用
ASIN: B09D78QJWK


● FPGAの実機で USBデバイスから ACK応答と入力データの確認ができました!

 この調子で FPGA側に受信処理を作りこむぞ!

・なんちゃって FPGA USB HOST爆誕!
なんちゃって FPGA USB HOST爆誕!
 RESET信号から 40ms後に 1ms間隔で 40回 KEEP ALIVEを送信。
 その後に、SETUP STAGE、DATA STAGEが順に続きます。

なんちゃって FPGA USB HOST爆誕!
 SETUP STAGE、DATA STAGEの後に 1ms間隔で 10回 KEEP ALIVEを送信。
 その後に、DATA INを行ない、GAME PADの状態を取得します。

なんちゃって FPGA USB HOST爆誕!
 SETUP STAGE、DATA STAGEの拡大。

なんちゃって FPGA USB HOST爆誕!
 KEEP ALIVEを送信
 USB_SEND_SETUP_TOKEN_0を送信
 USB_SEND_SET_ADDRESS_1を送信
 ・USBデバイスからの受信(ACKの部分)
 USB_SEND_DATA_IN_0_0を送信
 ・USBデバイスからの受信(DATA1の部分)
 USB_SEND_ACKを送信

なんちゃって FPGA USB HOST爆誕!
 上記から 1ms待つ
 KEEP ALIVEを送信
 USB_SEND_SETUP_TOKEN_1を送信
 USB_SEND_SET_CONFIG_1を送信
 ・USBデバイスからの受信(ACKの部分)
 USB_SEND_DATA_IN_1_0を送信
 ・USBデバイスからの受信(DATA1の部分)
 USB_SEND_ACKを送信

なんちゃって FPGA USB HOST爆誕!
 GAME PADの状態を取得
 KEEP ALIVEを送信
 USB_SEND_DATA_IN_1_1を送信
 ・USBデバイスからの受信(DATA0の部分)
 USB_SEND_ACKを送信

なんちゃって FPGA USB HOST爆誕!
 ・USBデバイスからの受信(DATA0の部分)
 を拡大。
 コントローラの十字型方向キーは「未入力」の状態。
 データバイトの 0と 1は 0x89~0x8Aの値をとります。

なんちゃって FPGA USB HOST爆誕!
 ・USBデバイスからの受信(DATA0の部分)
 を拡大。
 コントローラの十字型方向キーを「左」「上」にした時。
 データバイトの 0と 1が 0x00になります。

なんちゃって FPGA USB HOST爆誕!
 ・USBデバイスからの受信(DATA0の部分)
 を拡大。
 コントローラの十字型方向キーを「右」「下」にした時。
 データバイトの 0と 1が 0xFFになり、1状態の bitが連続するので bit stuffingをしています。


●なんちゃって FPGA USB HOSTの実機での動作確認時にハマった所

 ・接続していた USB HIDデバイスの USB仕様が実は Full Speedだった。
  >> ロジアナを適当に接続してプルアップ側が D-と思って波形を観察していたが、合点のいかない波形でワケがわからず混乱した。
  >> USBデバイスを接続しない状態で FPGA側から波形を送信したら「素直」な波形だったのと、ロジアナのプローブの接続を確認し直して原因を発見できた。
  >> Low Speedのデバイスを接続して解決した

 メーカー製の USBマウスは HIDデバイスなのに Full Speedの物が有るので注意です。
 (Full Speedデバイスは D+側にプルアップ抵抗が付いています)

 プレイステーション クラシック SCPH-1000RJの USB接続のゲームコントローラも Full Speedでした。

2018/12/03
SONY PlayStation Classicを買ってみた。内箱の正しい開け方
SONY PlayStation Classicを買ってみた。内箱の正しい開け方

  初期型プレイステーションの復刻版プレイステーション クラシック SCPH-1000RJを買った


● BUFFALO model BSGP815GY CLASSIC USB GAMEPAD

 USB 1.1 Low Speed device
 データ 8バイト長
 類似品:BSGP801GY、BSGP810GY

 運の良い事に、BUFFALO CLASSIC USB GAMEPAD BSGP815GYは「なんちゃって FPGA USB HOST」で相性の問題も起きず、問題無く正常に動きました。

データバイト意味
0左右、左=0x00、右=0xFF、未入力=0x89~0x8ALeft and Right
1上下、上=0x00、下=0xFF、未入力=0x89~0x8AUp and Down
2MSB bit7=Start、Select、Right、Left、Y、X、B、bit0=ASta、Sel、Rig、Lef、YXBA
3Turbo=0x10、Clear=0x20Turbo、Clear
4常に 0x00
5常に 0x00
6常に 0x00
7常に 0x00


BUFFALO USBゲームパッド 8ボタン スーパーファミコン風 グレー
ASIN: B00RF10Z3O

for USBゲームパッド有線ゲームコントローラ用 Windows/SwitchPC/MACコントローラーと互換性のあるUSBゲームコントローラー
ASIN: B08RZC3J64

エレコム ゲームパッド USB接続 Xinput/DirectInput両対応 Xbox系12ボタン振動/連射 【ドラゴンクエストX 眠れる勇者と導きの盟友 推奨】 ブラック JC-U3613MBK
ASIN: B00ABPBLA2

ELECOM ゲームパッド JC-U1708TSV
ASIN: B000GA4YKG

SANWA SUPPLY JY-P2S USBゲームパッド
ASIN: B0009SC20E

・BUFFALO model BSGP815GY CLASSIC USB GAMEPAD
BUFFALO model BSGP815GY CLASSIC USB GAMEPAD


BUFFALO model BSGP815GY CLASSIC USB GAMEPAD




● FPGAで USB HOST機能を実装する、受信処理編、シミュレータ

 FPGA側に受信処理を作りこむぞ!

・FPGAで USB HOST機能を実装する、受信処理編
FPGAで USB HOST機能を実装する、受信処理編


FPGAで USB HOST機能を実装する、受信処理編
 受信処理は bit stuffingに対応しています。


● FPGAで USB HOST機能を実装する、受信処理編、FPGA実機

 FPGA実機でも受信処理が動いたよ!

 なんちゃって FPGA USB HOST爆誕!

・FPGAで USB HOST機能を実装する、受信処理編、FPGA実機
FPGAで USB HOST機能を実装する、受信処理編、FPGA実機


FPGAで USB HOST機能を実装する、受信処理編、FPGA実機
 KCPSMのサンプルの UARTで USBの受信パケットをターミナルで送信してデバグ確認。
 パケットは 12バイト長です。

 80 = SYNC
 4B/C3 = PID
 8A = DATA 1バイト目 左右
 89 = DATA 2バイト目 上下
 xx = DATA 3バイト目 ボタン郡
 x0 = DATA 4バイト目 Turbo、Clearボタン
 00 = DATA 5バイト目 常に 00
 00 = DATA 6バイト目 常に 00
 00 = DATA 7バイト目 常に 00
 00 = DATA 8バイト目 常に 00
 xx = CRC16 下位バイト
 xx = CRC16 上位バイト

・FPGAで USB HOST機能を実装する、受信処理編、FPGA実機
FPGAで USB HOST機能を実装する、受信処理編、FPGA実機


FPGAで USB HOST機能を実装する、受信処理編、FPGA実機
 FPGAの実機でも 受信処理の bit stuffingが正常に動きました!



Tags: [FPGA], [電子工作], [Xilinx XC6SLX9], [FPGA 2022]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

USBの通信プロトコルを勉強する
USBの通信プロトコルを勉強する

  今まで漠然としていた USBデバイスの通信方法を理解します

USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する
USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する

  FPGAに USBデバイスを接続したいのですが、USB HOSTの通信を実装できないので困っています

OLIMEX LPC-H40(Philips LPC2106)
OLIMEX LPC-H40(Philips LPC2106)

  MOTHER BOARD for LPC-H40(LPC-H2106) and ASM Sample Program.

AMD Xilinxの FPGA Spartan-6 XC6SLX16のボードを買ってアーケード ゲームを動かす
AMD Xilinxの FPGA Spartan-6 XC6SLX16のボードを買ってアーケード ゲームを動かす

  ALINX AX309 XC6SLX9の中華クローンの XC6SLX16版を購入しました

FPGA Spartan-6 XC6SLX16でファミコンを動かす!
FPGA Spartan-6 XC6SLX16でファミコンを動かす!

  Xilinx FPGA Spartan-6 XC6SLX16 NES clone in ALINX AX309

Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!
Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!

  PicoBlaze KCPSM6 in Spartan-6 with ISE WebPack

パソコンと USBで接続して使用する USB 8ch 24MHzロジック アナライザ
パソコンと USBで接続して使用する USB 8ch 24MHzロジック アナライザ

  Cypress EZ-USB FX2LP CY7C68013A使用で内部のバッファ ICに LVC245Aを使用のチョイ性能アップ版




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2022 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/fpga/usb_host_fpga/