4

HIDデバイスからデータを読み取ろうとしています。基本的に次のようなUSBスニファキャプチャがあります。

Get Device Descriptor
Get Device Descriptor
Set Address
Get Configuration Descriptor
Get Configuration Descriptor
Set Configuration
Set Idle
Get Input Report
Get Input Report
Get Input Report
Get Input Report
Set Feature Report
Get Input Report
Set Feature Report
Get Input Report
Get Input Report
Set Output Report
Get Input Report
Set Feature Report
Input Report
Input Report

Input Reportセットアップ前のすべてInput Reportが、デバイスからの定期的なデータ収集であるように見えます。

libusbでは、次のことを行っています。

usb_init();
usb_find_busses();
usb_find_devices();

loop through busses
    loop through devices
        if correct vendor and correct product
            handle = usb_open(device)
            break

usb_set_configuration(dev_handle, 1)

// Endpoint 0 is a 'write endpoint', endpoint 1 is a 'read endpoint'.
endpoint = &device->config[0].interface[0].altsetting[0].endpoint[1]
usb_claim_interface(dev_handle, 0)
usb_set_altinterface(dev_handle, 0)

usb_bulk_read(dev_handle, endpoint->bEndpointAddress, buffer, endpoint->wMaxPacketSize, 1);

までのドライバーとコードは、までusb_set_configurationのスニファー分析に対応していると思いますSet Configuration

コード内のすべては、失敗するまで成功usb_bulk_readします。

  1. どのように私Set IdleGet Input Report、、、、?Set Feature ReportSet Output Report
  2. なぜusb_bulk_read失敗するのですか?
  3. デバイスとの通信を設定するには、他に何をする必要がありますか?
4

2 に答える 2

3

HIDデバイス[...]usb_bulk_read

痛い。USBバルク読み取りはバルクエンドポイントでのみ使用され、HIDには使用されません。

HIDエンドポイントは割り込みエンドポイントであるため、が必要usb_interrupt_transfer()です。エンドポイント記述子を見ましたね。エンドポイントタイプを割り込みとして宣言する必要があります。

于 2012-03-02T04:22:46.573 に答える
3

私は一般的にlibusbとUSBに慣れていないので、これが正しいかどうかはわかりませんが、 USBlyzerなどのUSBスニファーからの出力を見て、いくつかのことを調整した後、次のプロトコル項目を思いつきます。

usb_claim_interface

インターフェイス(usb_claim_interface)を要求してからアプリケーションをキャンセルすると、その後の実行で操作不能な状態になりました。さまざまなリセット(usb_resetおよびusb_resetep)を試しましたが、それでも適切な使用法を得ることができませんでしたusb_control_msg

SetReport / GetReport

USBlyzer、、、、および。Get Descriptor_ Select Configuration_ とはそれぞれとに明確に関連付けられています。Set ReportGet ReportGet DescriptorSelect Configurationusb_get_descriptorusb_set_configuration

含まれているGet Reportパケットと含まれFeature IdているパケットInput Idusb_control_msgこれらを次のパラメーターと一致させることができました( libusb.cはこれを理解するのに役立ちました):

requesttype = USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE
value = 0x01 (for GetReport)
index = id | (0x03 << 8) (for FeatureId)

Set Reportパケットも使用されますFeature IdOutput IdInput Id詳細を見ると、一致するもの(0x01 << 8)とOutput Id一致するもの(0x02 << 8)が明らかになりました。したがって、これらの調整されたパラメータを使用しSet Reportて呼び出すには、次のようにします。usb_control_msg

requesttype = USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE
value = 0x09 (for SetReport)
index = id | (0x03 << 8) (for FeatureId)

これは、これらすべてを行うための「正しい」方法ではない可能性があります。APIのさまざまな機能で何が起こっているのかについて、より深い洞察をいただければ幸いです。しかし、これにより、ホストがデバイスから関連するすべてのデータをキャプチャできるようになりました。

于 2012-03-02T21:19:18.313 に答える