IEEE 1394 ノードの構成 ROM の内容の取得

Windows 7 には、カーネル モード ドライバー フレームワーク (KMDF) を使用して実装される新しい IEEE 1394 バス ドライバーである1394ohci.sysが含まれています。 1394ohci.sys バス ドライバーは、ポート/ミニポート構成のレガシ IEEE バス ドライバーを置き換えます-- 1394bus.sysとochi1394.sys。 従来の 1394 バス ドライバーと下位互換性があります。 新しいバス ドライバーと従来の 1394 バス ドライバーの動作に関する既知の違いについては、「 Windows 7 の IEEE 1394 バス ドライバー」を参照してください。

このトピックでは、1394ohci.sys バス ドライバーが、後でデバイスの列挙に使用されるノードの構成 ROM の内容を取得する方法について詳しく説明します。 デバイス検出のためにノードの構成 ROM の内容を処理する方法は、Windows 7 では変更されていません。 ノードの構成 ROM の内容の処理方法の詳細については、「 1394 構成 ROM の変更」を参照してください。

1394ohci.sys バス ドライバーは、非同期読み取りトランザクションをノードに送信することで、1394 バスのリセット後にノードの構成 ROM の内容を取得します。 ノードに送信される非同期読み取りトランザクションの数を減らして、ノードの構成 ROM の内容を取得しようとします。

このトピックは、次のセクションで構成されています。

構成 ROM ヘッダーの取得

ノードの構成 ROM の内容を取得するために、クライアント ドライバーは、GET_HOST_CONFIG_ROMに u.GetLocalHostInformation.nLevel を指定して IEEE 1394 ドライバー スタックにREQUEST_GET_LOCAL_HOST_INFO要求を送信します。 要求が完了すると、バス ドライバーは、 GET_LOCAL_HOST_INFO5 構造体でノードの構成 ROM ヘッダーを取得します。 構成 ROM ヘッダーは、ノードの構成 ROM の最初の 5 つの四角形にあります。 このヘッダーには、IEEE-1394a 仕様で定義されているバス情報ブロックの内容が含まれています。

1394ohci.sys バス ドライバーは、1 つの非同期ブロック読み取りトランザクションで構成 ROM ヘッダーの取得を試みます。 ただし、特定の 1394 デバイスがこのトランザクションに正しく応答しない可能性があります。 この状況では、新しい 1394 バス ドライバーは、5 つの非同期 quadlet 読み取りトランザクションを使用して、構成 ROM ヘッダーを取得します。

ノードとの通信速度は、ノードの構成 ROM ヘッダーの取得中に決定されます。 1394ohci.sys バス ドライバーは、サポートされている最速の速度で非同期読み取りトランザクションをノードに送信し、ローカル ノードとターゲット ノードの間の低速なノードを考慮します。 サポートされている最速の速度で非同期読み取りトランザクションが正常に完了しない場合、1394ohci.sys バス ドライバーは、低速で別の非同期読み取りトランザクションをノードに送信します。 1394ohci.sys バス ドライバーは、トランザクションが正常に完了するまで、低速で低速でノードに非同期読み取りトランザクションを送信し続けます。 非同期トランザクションが特定の速度で完了すると、その速度は、別の 1394 バス リセットが発生するまで、ノードとの追加のすべての通信に使用されます。 非同期読み取りトランザクションが可能な限り低速で完了しない場合、1394ohci.sys バス ドライバーはノードの構成 ROM の内容を取得しません。

構成 ROM ヘッダーが取得されると、1394ohci.sys バス ドライバーは、ノードの構成 ROM の内容が以前に取得されたかどうかを確認します。 その場合は、キャッシュされたバージョンを再利用できます。 それ以外の場合は、ノードの構成 ROM の残りの内容を取得する必要があります。

新しい構成 ROM

1394ohci.sys バス ドライバーは、ノードの構成 ROM の内容が以前に取得されなかったと判断した場合は、ノードの構成 ROM の残りの内容の取得に進みます。

1394ohci.sys バス ドライバーは、構成 ROM ヘッダーのバス情報ブロックの max_rom 値を使用して、構成 ROM の残りの内容を取得するためにノードに送信する非同期読み取りトランザクションのサイズを決定します。 max_rom値に関係なく、非同期読み取りトランザクションが失敗した場合、新しい 1394 バス ドライバーは非同期 quadlet 読み取りトランザクションを使用して、ノードの構成 ROM の残りの内容を取得します。

以前に取得した構成 ROM

1394ohci.sys バス ドライバーは、ノードの構成 ROM ヘッダーの内容を取得した後、ドライバーが以前に取得した構成 ROM コンテンツのキャッシュされたコピーの 1 つのヘッダーとヘッダーが一致するかどうかを決定します。 一致する構成 ROM ヘッダーが見つかると、キャッシュされた構成 ROM の内容が再利用されます。

1394ohci.sys バス ドライバーは、次の手順を使用して、ノードの構成 ROM の内容のキャッシュされたコピーを再利用できるかどうかを判断します。

  1. バス ドライバーは、ノードの構成 ROM ヘッダーのバス情報ブロック内の node_vendor_idchip_id hiおよび chip_id lo 値が、ドライバーのキャッシュされた構成 ROM コンテンツのコピーのヘッダーにある値と同じ値と一致するかどうかを判断します。
  2. 手順 1 で一致が見つかった場合、バス ドライバーは、バス情報ブロックの生成値も一致するかどうかを判断します。 生成値が変更されていない場合 (または変更されないことを示す 1 に設定されている場合)、バス ドライバーは、構成 ROM のキャッシュされた内容を再利用します。

構成 ROM 値の説明については、IEEE 1394 仕様の前の手順を参照してください。 1394ohci.sys バス ドライバーが一致するキャッシュされた構成 ROM ヘッダーを見つけることができない場合、または 生成 値が変更されたためにノードの構成 ROM の内容を再読み取りする必要がある場合は、前の手順に従って新しい構成 ROM の内容を取得します。

IEEE 1394 ドライバー スタック
1394 構成 ROM の修正
REQUEST_GET_CONFIG_ROM