USB デバイスはホットプラグをサポートします。USB デバイスの挿入や取り外しはいつでも行えます。クライアントドライバは、オープン状態のデバイスの取り外しと再挿入を処理する必要があります。オープン状態のデバイスを処理するには、ホットプラグコールバックを使用します。クローズ状態のデバイスの挿入と取り外しは、attach(9E) およびdetach(9E) エントリポイントによって処理されます。
USBA 2.0 フレームワーク では次のイベント通知がサポートされています。
デバイスが電源を入れたまま取り外された場合、クライアントドライバはコールバックを受け取ります。
デバイスが電源を入れたまま取り外されたあとで元に戻された場合、クライアントドライバはコールバックを受け取ります。このイベントコールバックが発生する可能性があるのは、デバイスのドライバインスタンスがオフラインになっていない状態でユーザーがデバイスを元のポートに戻した場合です。ドライバインスタンスがオープン状態に保たれていれば、ドライバインスタンスがオフラインになることはありません。
クライアントドライバは、attach(9E) ルーチン内でusb_register_hotplug_cbs(9F) を呼び出してイベントコールバックの登録を行う必要があります。ドライバは、設定解除を行う前に、detach (9E) ルーチン内で usb_unregister_hotplug_cbs(9F) を呼び出す必要があります。
電源を入れたまま USB デバイスを挿入した場合のイベントシーケンスは、次のとおりです。
ハブドライバhubd(7D) が、ポート接続ステータスが変化するまで待ちます。
hubd ドライバがポート接続を検出します。
hubd ドライバがデバイス内の情報を列挙し、子デバイスノードを作成し、クライアントドライバを接続します。互換名の定義については、Binding Client Driversを参照してください。
クライアントドライバがデバイスを管理します。ドライバの状態は ONLINE です。
電源を入れたまま USB デバイスを取り外した場合のイベントシーケンスは、次のとおりです。
ハブドライバhubd(7D) が、ポート接続ステータスが変化するまで待ちます。
hubd ドライバがポート切り離しを検出します。
hubd ドライバが、切り離しイベントを子クライアントドライバに送信します。子クライアントドライバが hubd ドライバまたはusb_mid(7D) マルチインタフェースドライバである場合、子クライアントドライバはそのイベントを子に伝播します。
クライアントドライバが、カーネルスレッドコンテキストで切り離しイベント通知を受け取ります。カーネルスレッドコンテキストでは、ドライバの切り離しハンドラのブロックが可能となります。
クライアントドライバの状態が DISCONNECTED に遷移します。device not responding という完了理由で未処理の入出力転送が失敗します。新しい入出力転送やデバイスノードのオープン試行もすべて失敗します。クライアントドライバがパイプを閉じる必要はありません。ドライバは、デバイスがふたたび接続された場合に復元する必要のあるデバイスやドライバのコンテキストを保存しておく必要があります。
hubd ドライバは、OS デバイスノードとその子を下から順にオフラインにしようとします。
hubd ドライバがデバイスノードをオフラインにしようとした時点でデバイスノードが開いていなかった場合、次のイベントが発生します。
クライアントドライバのdetach(9E) エントリポイントが呼び出されます。
デバイスノードが破棄されます。
そのポートが新しいデバイスから使用可能になります。
ホットプラグのイベントシーケンスが最初から始まります。hubd ドライバが、ポート接続ステータスが変化するまで待ちます。
hubd ドライバがデバイスノードをオフラインにしようとした時点でデバイスノードが開いていた場合、次のイベントが発生します。
hubd ドライバが、定期的オフライン再試行キューにオフライン要求を置きます。
そのポートは、新しいデバイスから使用不可能なままになります。
hubd ドライバがデバイスノードをオフラインにしようとした時点ではデバイスノードが開いていたが、その後ユーザーがそのデバイスノードを閉じた場合、hubd ドライバによるデバイスノードの定期的なオフライン化が成功し、次のイベントが発生します。
クライアントドライバの detach(9E) エントリポイントが呼び出されます。
デバイスノードが破棄されます。
そのポートが新しいデバイスから使用可能になります。
ホットプラグのイベントシーケンスが最初から始まります。hubd ドライバが、ポート接続ステータスが変化するまで待ちます。
ユーザーがそのデバイスを使用するアプリケーションをすべて閉じると、そのポートがまた使用可能になります。アプリケーションが終了しない場合やデバイスがクローズされない場合、そのポートは使用不可能なままになります。
デバイスのデバイスノードがまだ開いている間に以前に取り外されたデバイスが同じポートに再挿入された場合、次のイベントが発生します。
ハブドライバhubd(7D) がポート接続を検出します。
hubd ドライバがバスアドレスとデバイス構成を復元します。
hubd ドライバがオフライン再試行要求を取り消します。
hubd ドライバが、接続イベントをクライアントドライバに送信します。
クライアントドライバが接続イベントを受け取ります。
クライアントドライバが、新しいデバイスが以前接続されていたデバイスと同じものかどうかを判定します。クライアントドライバはこの判定を行うために、まずデバイス記述子を比較します。クライアントドライバは、シリアル番号や構成記述子クラウドも比較する可能性があります。
クライアントドライバが、現在のデバイスが以前接続されていたデバイスと同じものでないと判定した場合、次のイベントが発生する可能性があります。
クライアントドライバがコンソールに警告メッセージを発行する可能性があります。
ユーザーがデバイスを再度取り外す可能性があります。ユーザーがデバイスを再度取り外した場合、電源を入れたまま取り外した場合のイベントシーケンスが最初から始まります。hubd ドライバがポート切り離しを検出します。ユーザーがデバイスを再度取り外さなかった場合、次のイベントが発生します。
クライアントドライバの状態が DISCONNECTED のままになり、要求やオープンがすべて失敗します。
そのポートは使用不可能なままになります。ユーザーはポートを解放するために、デバイスを閉じて取り外す必要があります。
ポートが解放されると、ホットプラグのイベントシーケンスが最初から始まります。hubd ドライバが、ポート接続ステータスが変化するまで待ちます。
クライアントドライバが、現在のデバイスが以前接続されていたデバイスと同じものである判定した場合、次のイベントが発生する可能性があります。
クライアントドライバが状態を復元し、通常の動作を継続する可能性があります。このポリシーに従うかどうかは、クライアントドライバしだいです。クライアントドライバが処理を継続するべきである場合の例として、オーディオスピーカーが挙げられます。
再接続されたデバイスを使用し続けても安全である場合には、ホットプラグのイベントシーケンスが最初から始まります。hubd ドライバが、ポート接続ステータスが変化するまで待ちます。デバイスがふたたびサービスを提供できる状態になります。