B級なPowerMateの研究(ミドルウェア編)
Sorry, this page is written in Japanese(ISO-2022-JP).
 
PowerMate
研究の目的
BeOSでPowerMateを使うために研究してみました.
 
PowerMateに関するLink
■ 海外のページ
┗ PowerMate
■ 日本のページ
┣ PowerMateを極限まで使いこなす
┣ Griffin Technology社インタビュー
┣ 諏訪バーチャル工業団地
┗ コーシングラフィックシステムズPowerMate

■目次

■USBディスクリプタの解説

PowerMateは以下のようなディスクリプタを返します.

[Device]
Class .................. 0
Subclass ............... 0
Protocol ............... 0
Vendor ID .............. 0x077d
Product ID ............. 0x0410
Version ................ 0x0109
Manufacturer String .... "Griffin Technology, Inc."
Product String ......... "Griffin PowerMate"
Serial Number .......... ""
  [Configuration 0]
    [Interface 0]
    Class .............. 3
    Subclass ........... 1
    Protocol ........... 2
      [Endpoint 0]
      MaxPacketSize .... 3
      Interval ......... 10
      Type ............. Interrupt
      Direction ........ Output


このディスクリプタを見る限り,PowerMateはデバイスクラス0,サブクラス0,プロトコル0の HID(Human Interface Device)として働きます.すなわちUSBマウスと同類ということです.

参考までに,USBマウス(ロジテックOEM N48)のディスクリプタを次に示します.

[Device]
Class .................. 0
Subclass ............... 0
Protocol ............... 0
Vendor ID .............. 0x046d
Product ID ............. 0xc001
Version ................ 0x0401
Manufacturer String .... "Logitech"
Product String ......... "N48"
Serial Number .......... ""
  [Configuration 0]
    [Interface 0]
    Class .............. 3
    Subclass ........... 1
    Protocol ........... 2
      [Endpoint 0]
      MaxPacketSize .... 8
      Interval ......... 10
      Type ............. Interrupt
      Direction ........ Output


唯一普通のマウスと異なるのは,Endpoint 0に対するMaxPacketSizeが3バイトであるところです. 普通はEndpoint 0(コントロールエンドポイント)に対しては8バイトです. ディスクリプタとしては他に特筆すべきところはありません.

■USBコマンドの解説

PowerMateは,Endpoint 0のInterrupt Out転送で得られる3バイトのデータを用いて, ダイヤルの左右回転,ダイヤルのクリックをPC(ホスト)側に通知します.

また,PC(ホスト)はInterface 0へのVendor RequestによってLEDの発光状態を 制御します.

以下にダイヤルの状態を示すコントロールOUTエンドポイントの 3バイトのフォーマットを示します.

PowerMateのダイヤル状態データ
バイト位置 意味
1バイト目 押下状態
0x01 : クリックされていない状態からクリックされた状態へと変化した.
0x00 : クリックされた状態からクリックされていない状態へと変化した.
2バイト目 回転状態
0x01 : 上から見て時計周り方向に回された.
0x00 : 回されていない.
0xFF : 上から見て反時計回り方向に回された.
3バイト目 不明

以下にLEDの発光状態を制御するためのInterfaceへの Vendor Requestのフォーマットを示します.

PowerMateのLED制御コマンド
offset field データ 意味
0 bmRequestType 0x41 データ転送方向: Host→Device
Type: Vendor
Recipient: Interface
1 bRequest 0x01 SET_INTERFACE
2 wValue 0x0001 不明
4 wIndex 0x00?? LEDの点灯状態を示す.
??には0x00(消灯状態)〜0xFF(最大輝度)が入る
6 wLength 0x0000 データステージで転送するデータバイト数は0

さて,解説はここまでにしてここからがB級なPowerMateの実践研究です.


■実践研究

以下の例ではBeOS R5.0.3で実験を行なっています.

例題1: LEDを制御する

では例によってBeOS on x86を使って,LEDを制御してみましょう. ここではpokeコマンドを叩いて簡単に試すワケにもいかないので, 簡単なアプリを作って制御します.

とりあえず,BeOSのusbkitのmouse.cppを改造したモノがこれ.(ソース)
ソースからビルドしたい場合は,usbkitのexampleディレクトリにpmled.cppのソースを 置いて,そこで以下のコマンドを実行してください.

$ gcc -c pmled.cpp
$ gcc -o pmled pm.o ../usb/USBKit.a -lbe


で,以下のようにターミナルから実行します.

$ ./pmled /dev/bus/usb/0/0


実行後,PowerMateのダイヤルを回すと,PowerMateのLEDが右に回すと明るく, 左に回すと暗くなるハズです.
#このアプリがキチンと動いていることは,LEDを見れば一発でわかるので, とってもわかりやすいですね.

なお,一旦Control-Cで実行を中止した後, 再度実行してもLEDの明度は変わりません. なぜかはよくわかりません.
一旦USBケーブルを外してやれば,再度実行できます.

 
[B技研TOPへ戻る] [B級なミドルウェアの研究へ戻る]
 
Copyright (c) 2002 Shuichi NAKAMURA All rights reserevd.
You can link this page freely.