Sdílet prostřednictvím


Dynamický výčet

Dynamický výčet je schopnost řidiče detekovat a hlásit změny počtu a typu zařízení, která jsou připojená k systému, zatímco je systém spuštěný.

Ovladače sběrnice musí používat dynamický výčet, pokud počet nebo typy zařízení, která jsou připojená k nadřazené zařízení, závisí na konfiguraci systému. Některá z těchto zařízení můžou být vždy připojená k systému a některá se můžou připojit a odpojit, když je systém spuštěný.

Například počet a typ zařízení připojených ke sběrnici PCI systému jsou závislé na systému, ale jsou trvalé, pokud uživatel nevyvede napájení, otevře případ a přidá nebo odebere zařízení pomocí šroubováku. Na druhé straně může uživatel přidat nebo odebrat zařízení USB připojením kabelu nebo odpojením kabelu, když je systém spuštěný.

Dynamické podřízené seznamy

Framework umožňuje ovladačům podporovat dynamické výčty tím, že poskytuje objekty podřízeného seznamu frameworku. Každý objekt podřízeného seznamu představuje seznam podřízených zařízení připojených k nadřazenému zařízení. Ovladač sběrnice nadřazeného zařízení musí identifikovat podřízená zařízení nadřazeného zařízení, přidat je do podřízeného seznamu nadřazeného zařízení a vytvořit objekt fyzického zařízení (PDO) pro každé podřízené zařízení.

Pokaždé, když ovladač vytvoří objekt zařízení frameworku, který představuje objekt FDO pro zařízení, framework vytvoří prázdný výchozí podřízený seznam pro zařízení. Ovladač může získat popisovač výchozího seznamu podřízených zařízení zavoláním WdfFdoGetDefaultChildList. Pokud běžně píšete ovladač sběrnice, který vyhledává podřízená zařízení zařízení, může váš ovladač přidat podřízené zařízení do výchozího seznamu podřízených zařízení. Pokud potřebujete vytvořit další podřízené seznamy, ovladač může volat WdfChildListCreate.

Než může ovladač použít podřízený seznam, musí nakonfigurovat objekt podřízeného seznamu inicializací struktury WDF_CHILD_LIST_CONFIG a přenesením struktury buď do WdfFdoInitSetDefaultChildListConfig, pro výchozí podřízený seznam, nebo do WdfChildListCreate, pro další podřízené seznamy.

Dynamické popisy dětí

Pokaždé, když ovladač sběrnice identifikuje podřízené zařízení, musí do podřízeného seznamu přidat popis podřízeného zařízení. Dětský popis se skládá z povinného identifikačního popisu a volitelného popisu adresy.

Popis identifikace Popis identifikace je struktura, která obsahuje informace, které jednoznačně identifikují každé zařízení, které ovladač vyčísluje. Ovladač definuje tuto strukturu, ale jeho prvním členem musí být struktura WDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER .

Popis identifikace obvykle obsahuje identifikační řetězce zařízení, případně sériové číslo a informace o umístění zařízení ve sběrnici, například číslo slotu.

Ovladač může poskytnout následující sadu funkcí zpětného volání, které umožňují rozhraní manipulovat s informacemi v popisu identifikace:

Obvykle je třeba poskytnout tyto funkce zpětného volání, pokud identifikační struktury ovladače obsahují ukazatele na dynamicky přidělené buffery. Další informace o účelu těchto funkcí zpětného volání najdete na referenčních stránkách.

Popis adresy Popis adresy je struktura, která obsahuje informace, které ovladač vyžaduje pro přístup k zařízení ve sběrnici, pokud se informace můžou změnit, když je zařízení připojené. Ovladač definuje tuto strukturu, ale jeho prvním členem musí být struktura WDF_CHILD_ADDRESS_DESCRIPTION_HEADER .

Popisy adres jsou volitelné. Pokud se informace o adrese zařízení mezi časem, kdy je zařízení připojené, a časem, kdy je zařízení odpojené, nedají se změnit, všechny informace o adrese zařízení se dají uložit do identifikačního popisu. Například řadiče USB přiřazují adresy zařízením, když jsou zařízení připojená, a tyto adresy se nemění.

Na druhou stranu některé autobusy používají adresní informace, které se můžou změnit. Například sběrnice IEEE 1394 používá "počet generování", což je počet resetů sběrnice, ke kterým došlo. Každý asynchronní vstupně-výstupní požadavek na zařízení IEEE 1394 musí obsahovat počet generování. Vzhledem k tomu, že se tyto informace o adrese můžou změnit, musí ho ovladač uložit do popisu adresy.

K manipulaci s informacemi v popisu adresy může ovladač poskytnout následující sadu funkcí zpětného volání:

Tyto funkce zpětného volání je obvykle potřeba poskytnout, pokud struktury popisu adres ovladače obsahují ukazatele na dynamicky přidělené vyrovnávací paměti. Další informace o účelu těchto funkcí zpětného volání najdete na referenčních stránkách.

Přidání zařízení do dynamického podřízeného seznamu

Když framework volá funkci zpětného volání EvtDriverDeviceAdd ovladače sběrnice, musí tato funkce zavolat WdfDeviceCreate k vytvoření FDO pro nadřazené zařízení, což je obvykle adaptér sběrnice. Další informace o vytvoření objektu FDO naleznete v tématu Vytváření objektů zařízení v ovladači funkce. Ovladač pak musí vyjmenovat potomky nadřazeného zařízení a přidat je do seznamu potomků.

Volitelně může ovladač volat WdfDeviceSetBusInformationForChildren, aby rozhraní poskytl informace o sběrnici. Doporučujeme to udělat, protože je pro podřízená zařízení a aplikace jednodušší identifikovat sběrnici.

Chcete-li přidat zařízení do podřízeného seznamu, musí ovladač pro každé nalezené podřízené zařízení volat WdfChildListAddOrUpdateChildDescriptionAsPresent. Toto volání informuje rámec, že ovladač zjistil podřízené zařízení připojené k nadřazenému zařízení. Když ovladač volá WdfChildListAddOrUpdateChildDescriptionAsPresent, poskytuje identifikační popis a volitelně i popis adresy.

Jakmile ovladač zavolá WdfChildListAddOrUpdateChildDescriptionAsPresent k hlášení nového zařízení, architektura informuje správce PnP, že nové zařízení existuje. Správce PnP vytvoří zásobník zařízení a zásobník ovladačů pro nové zařízení. V rámci tohoto procesu volá rámec funkci zpětného volání řidiče sběrnice EvtChildListCreateDevice. Tato funkce zpětného volání musí volat WdfDeviceCreate k vytvoření PDO (fyzického objektu zařízení) pro nové zařízení.

Obvykle je několik podřízených zařízení připojeno k nadřazenému zařízení, takže ovladač sběrnice musí několikrát volat WdfChildListAddOrUpdateChildDescriptionAsPresent. Nejúčinnější způsob, jak tento proces provést, je následující:

  1. Zavolejte WdfChildListBeginScan.

  2. Zavolejte WdfChildListAddOrUpdateChildDescriptionAsPresent pro každé podřízené zařízení.

  3. Zavolejte WdfChildListEndScan.

Pokud obklopíte dynamický výčet ovladače voláními WdfChildListBeginScan a WdfChildListEndScan, architektura uloží všechny změny podřízeného seznamu. Upozorní správce PnP na změny, když ovladač volá WdfChildListEndScan. Řídící rámec v pozdější době volá funkci zpětného volání EvtChildListCreateDevice ovladače sběrnice pro každé zařízení v podřízeném seznamu. Tato funkce zpětného volání volá WdfDeviceCreate k vytvoření fyzického objektu zařízení (PDO) pro každé nové zařízení.

Když ovladač volá WdfChildListBeginScan, architektura označí všechna dříve hlášená zařízení jako neexistují. Ovladač proto musí volat WdfChildListAddOrUpdateChildDescriptionAsPresent pro všechny podřízené položky, které ovladač dokáže rozpoznat, nejen nově zjištěné podřízené položky. Chcete-li přidat jedno dítě do podřízeného seznamu, může ovladač provést volání WdfChildListUpdateAllChildDescriptionsAsPresent bez toho, aby nejprve volal WdfChildListBeginScan.

Aktualizace dynamického podseznamu

Chcete-li aktualizovat informace v dynamickém podřízeném seznamu, použijte některou z následujících metod:

  1. Když nadřazené zařízení obdrží přerušení, které indikuje příchod nebo odebrání podřízené položky, funkce zpětného volání EvtInterruptDpc volá WdfChildListAddOrUpdateChildDescriptionAsPresent, pokud je zařízení připojené, nebo WdfChildListUpdateChildDescriptionAsMissing, pokud je zařízení odpojeno.

  2. Ovladač může poskytnout funkci zpětného volání EvtChildListScanForChildren , kterou architektura volá pokaždé, když nadřazené zařízení přejde do svého funkčního stavu (D0). Tato funkce zpětného volání by měla zobrazit výčet všech podřízených zařízení voláním WdfChildListBeginScan, WdfChildListAddOrUpdateChildDescriptionAsPresent (nebo WdfChildListUpdateAllChildDescriptionsAsPresent) a WdfChildListEndScan.

V ovladači můžete použít jednu nebo obě tyto techniky.

Procházení dynamického podřízeného seznamu

Pokud chcete prozkoumat obsah podřízeného seznamu, může váš ovladač procházet seznam pomocí jedné z následujících technik:

  • K získání obsahu popisu jednotlivých podřízených zařízení může ovladač postupně:

    1. Volání WdfChildListBeginIteration.
    2. Zavolejte WdfChildListRetrieveNextDevice tolikrát, kolikrát to bude potřeba.
    3. Zavolejte WdfChildListEndIteration.

    Při volání WdfChildListBeginIteration ovladač určuje příznak typu WDF_RETRIEVE_CHILD_FLAGS, který označuje, zda má architektura načíst všechny popisy zařízení nebo pouze podmnožinu. Když WdfChildListRetrieveNextDevice najde shodu, načte identifikační a adresní popisy podřízeného zařízení, plus popisovač jeho zařízení.

  • Chcete-li získat popis adresy, který je aktuálně obsažen v popisu podřízeného zařízení, ovladač může volat WdfChildListRetrieveAddressDescription a zadat popis identifikace. Rámec prochází seznam potomků, dokud nenajde zařízení s odpovídajícím identifikačním popisem. Potom načte popis adresy.

  • Pokud potřebujete získat popisovač objektu zařízení rámce, který je přidružený k určitému podřízenému zařízení, ovladač může volat WdfChildListRetrievePdo. Architektura prochází podřízeným seznamem, dokud nenajde podřízené zařízení s odpovídajícím identifikačním popisem, a pak vrátí popisovač objektu zařízení. Chcete-li volajícího chránit před náhlým odebráním PDO (Physical Device Object) v rámci PnP na jiném vlákně, zabalte volání pomocí WdfChildListBeginIteration a WdfChildListEndIteration.

Přístup k identifikačním a adresním popisům PDO

Váš ovladač může volat následující metody pro přístup k identifikačnímu popisu nebo popisu adresy PDO:

Zpracování požadavků na opakované výčty

Ovladače sběrnice založené na frameworku, které podporují dynamické číslování, mohou přijímat požadavek na reenumeraci konkrétního podřízeného zařízení prostřednictvím rozhraní REENUMERATE_SELF_INTERFACE_STANDARD. Další informace najdete v tématu Zpracování požadavků výčtu.