2017年3月26日日曜日

[録画サーバー]運用経過3

冬の間の録画サーバーの調子の報告です。

1.KP41問題
 前回にも書きましたが、GPU (intel HD graphics) に急に負荷がかかると突然電源が落ちるようです。Chromeでの動画視聴時に特に起きやすいようです。Firefoxではあまりおきませんでしたが、GPUドライバが落ちることがありました。また、Windows8の画面分割を行おうとした時にも発生しました。
 画面分割時の電源落ちの後、PCを立ち上げ、Chromeを起動すると、Chromeで見ていた動画が表示されました。しかし、画面分割の操作時にChromeは既に(手動で)閉じていたので、この電源断は、Chromeのプロセスが正常に終了せずに悪さをした可能性が考えられます。

2.再起動を繰り返す問題
 起動させようとすると(更新のための再起動を含む)、画面が表示される前に(電源ボタンが点いて0.5秒くらいで)電源が落ち、さらに再起動し、また落ちることを繰り返す現象が高頻度で発生しました。HDDやTVのチューナーカードを外すと起動するので、起動時に電源電圧が不安定になっているものと思われます。
 起動させるには、再起動を繰り返す状態を放置して起動するのを待つか、HDDを外してしばらく動かしたからシャットダウンし、HDDを付け直して起動する方法がありました。

3.原因不明のコマ落ちの解決
 前回は、原因が分からなかったコマ落ちですが、解決法が分かりました。
 PX-W3PEにはカードリーダーが付いていますが、これを使うとコマ落ちがおきてしまうようです。なので、外付けのカードリーダーを使うことによって解決しました。


<<前



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; とする。
 これによって解決するかも知れないです。