1

Microsoft LifeCam で「TrueColor」をオンにする方法を見つけようとしています。USBSniffer からいくつかの大きな USB ログがあり、Microsoft のソフトウェアのチェックボックスをクリックすると一貫して表示されるシーケンスがいくつかあります。これは、有効化シーケンスの最初からの要求とデバイスの応答です (このデータを誤解している場合は訂正してください)。

[156918643 ms] UsbSnoop - FilterDispatchAny(ac56afd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[156918643 ms] UsbSnoop - FdoHookDispatchInternalIoctl(ac56b1ea) : fdo=88b25448, Irp=889911d8, IRQL=0
[156918643 ms]  >>>  URB 1482 going down  >>> 
-- URB_FUNCTION_CLASS_INTERFACE:
  TransferFlags          = 00000001 (USBD_TRANSFER_DIRECTION_IN, ~USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 00000002
  TransferBuffer       = abb04b86
  TransferBufferMDL    = 00000000
  UrbLink                 = 00000000
  RequestTypeReservedBits = 00000000
  Request                 = 00000085
  Value                   = 00001600
  Index                   = 00000500
[156918644 ms] UsbSnoop - MyInternalIOCTLCompletion(ac56b126) : fido=00000000, Irp=889911d8, Context=894d6c98, IRQL=2
[156918644 ms]  <<<  URB 1482 coming back  <<< 
-- URB_FUNCTION_CONTROL_TRANSFER:
  PipeHandle           = 885639a0
  TransferFlags        = 0000000b (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 00000002
  TransferBuffer       = abb04b86
  TransferBufferMDL    = 8837fee0
    00000000: 40 00
  UrbLink              = 00000000
  SetupPacket          =
    00000000: a1 85 00 16 00 05 02 00

ここで、PyUSB 経由で確認した一連のリクエストを送信したいのですが、最初のリクエストを送信すると、次のようになります。

>>> ret = dev.ctrl_transfer(0x80, 0x85, 0x1600, 0x0500, 8)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "c:\Python24\Lib\site-packages\usb\core.py", line 702, in ctrl_transfer
    self.__get_timeout(timeout)
  File "c:\Python24\Lib\site-packages\usb\backend\libusb0.py", line 539, in ctrl_transfer
    timeout
  File "c:\Python24\Lib\site-packages\usb\backend\libusb0.py", line 387, in _check
    raise USBError(errmsg, ret)
usb.core.USBError: (None, 'usb_control_msg: invalid request 0x85')

価値があるのは、単純な GET_STATUS が機能しているようです:

>>> ret = dev.ctrl_transfer(0x80, 0, 0, 0, 8)
>>> print ret
array('B', [0, 0])

あるケースでは応答されたリクエストが別のケースでは無効になるのはなぜですか? 構文?デバイス状態?

4

1 に答える 1

2

非常に役立つUSB Made Simpleから、リクエスト タイプの最上位 3 ビットは次のようにフォーマットされます。

D7 Data direction
0 - Host-to-device
1 - Device-to-host
D6:5 Type
0 = Standard
1 = Class
2 = Vendor
3 = Reserved

ログには、USB のクラス インターフェイスを使用していると書かれているため (「URB_FUNCTION_CLASS_INTERFACE」を参照)、RequestType はデバイス クラス (オーディオ、物理、この場合はビデオ) に固有です。GET_STATUS コマンドは、標準タイプであるため機能します。

したがって、より正しいコマンドは

ret = dev.ctrl_transfer(0xa0, 0x85, 0x1600, 0x0500, 8)

コマンドがデータを返すため、より正しいと言いますが、それでも期待するデータではありません!

編集: 完全な真実性のために、USB Made Simple の残りの要求タイプ テーブルに従って、受信者をインターフェイスとして指定する必要がありました。

D4:0 Recipient
0 = Device
1 = Interface
2 = Endpoint
3 = Other
4-31 = Reserved

...また、スニッフィングされたリクエストと同じ長さを設定するため、コマンドの真のバージョンは次のとおりです。

ret = dev.ctrl_transfer(0xa1, 0x85, 0x1600, 0x0500, 2)
于 2012-11-15T05:40:35.023 に答える