libusb  1.0.24
USBデバイスにアクセスするためのクロス・プラットフォームのユーザー・ライブラリ
デバイス活線挿抜イベント通知

はじめに

バージョン1.0.16(LIBUSB_API_VERSION >= 0x01000102)は、一部のプラットフォームで活線挿抜イベントのサポートを追加しました(パラメーター LIBUSB_CAP_HAS_HOTPLUG を指定して libusb_has_capability() を呼び出し、あなたのプラットフォームが活線挿抜通知をサポートするかどうかをテストする必要があります)。

このインターフェイスを使用すると、一致するUSBデバイスの到着と出発の通知を要求できます。

活線挿抜通知を受信するには、 libusb_hotplug_register_callback() を呼び出してコールバックを登録します。 この関数は、オプションで、 libusb_hotplug_deregister_callback() に渡すことができるコールバック・ハンドルを返します。

コールバック関数は、コールバックが追加のイベントを予期しているかどうかを示す整数(0または1)を返す必要があります。0を返すとコールバックが再度イベント待ちに入り、1を返すとコールバックの登録が解除されます。 LIBUSB_HOTPLUG_ENUMERATE フラグが原因で libusb_hotplug_register_callback() からコールバックが呼び出された場合、コールバックの戻り値は無視されることに注意してください。つまり、 libusb_hotplug_register_callback() から呼び出されたときに1を返すことによって、コールバックの登録を解除することはできません。

特定のコンテキストのコールバックは、 libusb_exit() によって自動的に登録解除されます。

1.0.16の時点で、サポートされている活線挿抜イベントは以下の2つです:

  • LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: デバイスが装着済で使用する準備ができています
  • LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: デバイスが取り去られて使用できなくなりました

活線挿抜イベントは、これらのイベントのいずれかまたは両方をリッスンできます。

注意: デバイスが取り去られたという通知を受け取った時、デバイスのlibusb_device_handlesがある場合は、各デバイス・ハンドルで libusb_close() を呼び出して、デバイスに関連付けられている残りのリソースを解放する必要があります。デバイスが取り去られると、そのデバイスに関連付けられているlibusb_device_handleは無効になり、後でそのデバイスが戻ってきても無効のままになります。

LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVEDイベントを処理する場合、libusb_deviceを受け取るlibusb関数を呼び出すのが安全であると見なされます。 デバイスを開いて非同期転送を送信することも安全です。ただし、libusb_device_handleを使用する他のほとんどの関数は、安全に呼び出すことができません。 このような関数の例としては、さまざまな USBデスクリプター を取得する 同期API 関数またはブロッキング関数があります。これらの関数は、活線挿抜コールバックのコンテキスト外で使用する必要があります。

LIBUSB_HOTPLUG_EVENT_DEVICE_LEFTイベントを処理する場合、安全な関数は libusb_get_device_descriptor() のみです。

以下のコードは、活線挿抜インターフェイスの使用例を示しています:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <libusb.h>
static int count = 0;
int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev,
libusb_hotplug_event event, void *user_data) {
static libusb_device_handle *dev_handle = NULL;
int rc;
(void)libusb_get_device_descriptor(dev, &desc);
rc = libusb_open(dev, &dev_handle);
if (LIBUSB_SUCCESS != rc) {
printf("Could not open USB device\n");
}
} else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) {
if (dev_handle) {
libusb_close(dev_handle);
dev_handle = NULL;
}
} else {
printf("Unhandled event %d\n", event);
}
count++;
return 0;
}
int main (void) {
int rc;
libusb_init(NULL);
LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL,
&callback_handle);
if (LIBUSB_SUCCESS != rc) {
printf("Error creating a hotplug callback\n");
libusb_exit(NULL);
return EXIT_FAILURE;
}
while (count < 2) {
nanosleep(&(struct timespec){0, 10000000UL}, NULL);
}
libusb_hotplug_deregister_callback(NULL, callback_handle);
libusb_exit(NULL);
return 0;
}
libusb_init
int libusb_init(libusb_context **ctx)
定義: core.c:2270
libusb_get_device_descriptor
int libusb_get_device_descriptor(libusb_device *dev, struct libusb_device_descriptor *desc)
定義: descriptor.c:531
libusb_hotplug_event
libusb_hotplug_event
定義: libusb.h:1946
libusb_context
struct libusb_context libusb_context
定義: libusb.h:987
LIBUSB_HOTPLUG_MATCH_ANY
#define LIBUSB_HOTPLUG_MATCH_ANY
定義: libusb.h:1972
libusb_exit
void libusb_exit(libusb_context *ctx)
定義: core.c:2385
libusb_device
struct libusb_device libusb_device
定義: libusb.h:1004
libusb_handle_events_completed
int libusb_handle_events_completed(libusb_context *ctx, int *completed)
定義: io.c:2429
libusb_hotplug_register_callback
int libusb_hotplug_register_callback(libusb_context *ctx, int events, int flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *callback_handle)
定義: hotplug.c:320
libusb_hotplug_callback_handle
int libusb_hotplug_callback_handle
定義: libusb.h:1939
LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT
@ LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT
デバイスが取り去られて使用できなくなりました。
定義: libusb.h:1953
libusb_device_descriptor
定義: libusb.h:528
LIBUSB_SUCCESS
@ LIBUSB_SUCCESS
成功(エラー無し)
定義: libusb.h:1049
libusb_open
int libusb_open(libusb_device *dev, libusb_device_handle **dev_handle)
定義: core.c:1291
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED
@ LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED
デバイスが接続され使用できるようになりました。
定義: libusb.h:1948
libusb_hotplug_deregister_callback
void libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle callback_handle)
定義: hotplug.c:404
libusb_close
void libusb_close(libusb_device_handle *dev_handle)
定義: core.c:1446
libusb_device_handle
struct libusb_device_handle libusb_device_handle
定義: libusb.h:1015