2017年1月22日日曜日

[STM32マイコン]SW4STM32を使う(USB-HIDデバイス:複数デバイス)

今回は、前回作ったHIDマウスのプログラムを改造して、HIDマウス&キーボードとしてF401REをPCに認識させます。

○USB-HID規格について
まず、USBのHID規格についての基礎知識があったほうがいいので下記のリンクを見ていくと参考になります。

・USB-HIDクラスの概要:http://www.cqpub.co.jp/hanbai/books/33/33381/33381.pdf

・HIDの各ディスクリプタ:http://www.wdic.org/w/TECH/USB%20HID%20%E3%82%AF%E3%83%A9%E3%82%B9

・HIDのレポートディスクリプタの詳細:http://wiki.onakasuita.org/pukiwiki/?%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF

・USB-HIDの通信の詳細等(PCIマイコン):http://www.geocities.jp/zattouka/GarageHouse/micon/USB/USB5.htm


○変更箇所について
次に、SW4STM32でプログラムを行うときに、大まかにどこを変えていけばいいのかについては、下記のサイトなどが参考になります。
  http://damogranlabs.com/2016/03/stm32-custom-usb-hid-device-yes-please/

さらに、複数のHIDデバイスとして認識させるために下記のサイトを参考にします。
   https://stm32f4-discovery.net/2014/09/library-34-stm32f4-usb-hid-device/
このページの下のほうにある "TM STM32F4 USB HID Device Library" をダウンロードして中にある "usbd_hid_core.c" を見ることでどのようにディスクリプタを変更すればよいかが分かり、 "usbd_hid_core.h" を見ることでどこでディスクリプタのサイズを変更するのかが分かります。
ただし、HALドライバーでかかれていないので、このライブラリ自体をそのまま使うことはできないと思います。
また、このライブラリによって、HIDのマウス・キーボード・ゲームパッド(ジョイスティック)についてどのようにレポートディスクリプタを書けばよいかが分かります。

○プログラムについて
・ usbd_hid.c 内の変更点
 1) USBD_HID_CfgDesc[ ] の変更
  "bInterfaceSubClass" を "no boot" にする : 0x01→ 0x00
  "nInterfaceProtocol" を "none" にする : 0x02 → 0x00
 2) HID_MOUSE_ReportDesc[ ] の変更
   "TM STM32F4 USB HID Device Library" の "usbd_hid_core.c" のレポートディスクリプタを参考にしてキーボードとマウスのディスクリプタに書き換える。
・ usbd_hid.h 内の変更
 定義されている "HID_MOUSE_REPORT_DESC_SIZE" のサイズ(Byte)を、usbd_hid.c内のレポートディスクリプタのサイズ(Byte)に変更

ここまでで、PCに接続するとキーボードとマウスとして認識すると思います。
(認識しないときは、一番下の"※1"を参考にしてください)
最後に、PCにマウスとキーボードの値を送ります。
main()関数内の初期化終了後の位置に、下記の配列を用意します。
・キーボード:
     uint8_t hid_keyboard[9]={1,0b00000000,1,0,0,0,0,0,0};
           //ReportID, button1-8, reverse, key1, key2, key3, key4, key5, key6
・マウス:
     int8_t hid_mouse[5]={2,0,-5,0,0};
           //ReportID,button1-3,x,y,wheelこれは、 "TM STM32F4 USB HID Device Library"とそれがあったページを参考にしています。
これらの配列を各々PCに下記のようにして送ることができます。
     USBD_HID_SendReport(&hUsbDeviceFS,hid_keyboard,9); 
     USBD_HID_SendReport(&hUsbDeviceFS,hid_mouse,5);
送る配列の中身を書き換えることで、PCにマウスとキーボードの情報を送ります。

※1. 上記ではうまく動かない可能性があります
 usbd_hid.c 内の USBD_HID_DeviceQualifierDesc[ ] 配列をコメントアウトし、
 USBD_HID_GetDeviceQualifierDesc() 関数の中身を return NULL; とする。
 これによって解決するかも知れないです。

0 件のコメント:

コメントを投稿