Udostępnij przez


Wyliczenie dynamiczne

dynamiczna enumeracja to umiejętność sterownika do wykrywania i zgłaszania zmian liczby i typów urządzeń podłączonych do systemu podczas działania systemu.

Sterowniki magistrali muszą używać wyliczenia dynamicznego, jeśli liczba lub typy urządzeń połączonych z urządzeniem nadrzędnym zależą od konfiguracji systemu. Niektóre z tych urządzeń mogą być zawsze połączone z systemem, a niektóre mogą być podłączone i odłączone podczas działania systemu.

Na przykład liczba i typ urządzeń podłączonych do magistrali PCI systemu zależą od systemu, ale pozostają niezmienne, chyba że użytkownik wyłączy zasilanie, otworzy obudowę i za pomocą śrubokręta doda lub usunie urządzenie. Z drugiej strony użytkownik może dodawać lub usuwać urządzenia USB, podłączając lub odłączając kable, gdy system jest uruchomiony.

Dynamiczne listy podrzędne

Szkielet umożliwia sterownikom obsługę dynamicznego wyliczenia, udostępniając listę obiektów podrzędnych. Każdy obiekt listy podrzędnej reprezentuje listę urządzeń podrzędnych połączonych z urządzeniem nadrzędnym. Sterownik magistrali urządzenia nadrzędnego musi zidentyfikować urządzenia podrzędne, dodać je do listy podrzędnej urządzenia nadrzędnego i utworzyć obiekt urządzenia fizycznego (PDO) dla każdego urządzenia podrzędnego.

Za każdym razem, gdy sterownik tworzy obiekt urządzenia w ramach, który reprezentuje FDO dla urządzenia, struktura tworzy pustą, domyślną listę podrzędną dla urządzenia. Sterownik może uzyskać dojście do domyślnej listy podrzędnej urządzenia, wywołując WdfFdoGetDefaultChildList. Zazwyczaj, jeśli piszesz sterownik magistrali, który wylicza podrzędne elementy urządzenia, sterownik może dodać te elementy do domyślnej listy elementów podrzędnych. Jeśli musisz utworzyć dodatkowe listy podrzędne, sterownik może wywołać WdfChildListCreate.

Aby sterownik mógł użyć listy podrzędnej, musi skonfigurować obiekt listy podrzędnej, inicjując strukturę WDF_CHILD_LIST_CONFIG i przekazując strukturę do WdfFdoInitSetDefaultChildListConfig, dla domyślnej listy podrzędnej lub WdfChildListCreate, dla dodatkowych list podrzędnych.

Dynamiczne opisy dziecięce

Za każdym razem, gdy sterownik magistrali identyfikuje urządzenie podrzędne, musi dodać opis urządzenia podrzędnego do listy urządzeń podrzędnych. Opis elementu podrzędnego składa się z wymaganego opisu identyfikacyjnego oraz opcjonalnego opisu adresu .

Opis identyfikacji Opis identyfikacji to struktura zawierająca informacje, które jednoznacznie identyfikują każde urządzenie wyliczane przez sterownik. Sterownik definiuje tę strukturę, ale jej pierwszy element musi być strukturą WDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER.

Zazwyczaj opis identyfikacyjny zawiera ciągi identyfikacyjne urządzenia, możliwy numer seryjny oraz informacje o lokalizacji urządzenia na magistrali, takie jak numer slotu.

Sterownik może udostępnić następujący zestaw funkcji wywołania zwrotnego, które umożliwiają frameworkowi zarządzanie informacjami zawartymi w opisie identyfikacyjnym.

Zazwyczaj należy podać te funkcje wywołania zwrotnego, jeśli struktury opisu identyfikacji sterownika zawierają wskaźniki do dynamicznie przydzielonych buforów. Aby uzyskać więcej informacji na temat przeznaczenia tych funkcji wywołania zwrotnego, zobacz ich strony referencyjne.

Opis adresu Opis adresu to struktura zawierająca informacje wymagane przez sterownik do uzyskania dostępu do urządzenia w magistrali, jeśli informacje mogą ulec zmianie, gdy urządzenie jest podłączone. Sterownik definiuje tę strukturę, ale jej pierwszy element musi być strukturą WDF_CHILD_ADDRESS_DESCRIPTION_HEADER.

Opisy adresów są opcjonalne. Jeśli informacje o adresie urządzenia nie mogą ulec zmianie między czasem, w jaki urządzenie jest podłączone, a czasem jego odłączenia, wszystkie informacje o adresie urządzenia mogą być przechowywane w opisie identyfikacji. Na przykład kontrolery USB przypisują adresy do urządzeń, gdy urządzenia są podłączone, a te adresy nie ulegają zmianie.

Z drugiej strony niektóre autobusy używają informacji adresujących, które mogą ulec zmianie. Na przykład magistrala IEEE 1394 używa "liczby generacji", czyli liczby zresetowań magistrali, które wystąpiły. Każde żądanie asynchroniczne we/wy do urządzenia IEEE 1394 musi zawierać liczbę generacji. Ponieważ te informacje o adresie mogą ulec zmianie, sterownik musi przechowywać go w opisie adresu.

Aby manipulować informacjami w opisie adresu, sterownik może udostępnić następujący zestaw funkcji wywołania zwrotnego:

Zazwyczaj należy podać te funkcje wywołania zwrotnego, jeśli struktury opisu adresu sterownika zawierają wskaźniki do dynamicznie przydzielonych buforów. Aby uzyskać więcej informacji na temat przeznaczenia tych funkcji wywołania zwrotnego, zobacz ich strony referencyjne.

Dodawanie urządzeń do dynamicznej listy podrzędnej

Gdy struktura wywołuje funkcję wywołania zwrotnego EvtDriverDeviceAdd, funkcja ta musi wywołać WdfDeviceCreate, aby utworzyć obiekt FDO dla urządzenia nadrzędnego, który jest zazwyczaj adapterem magistrali. Aby uzyskać więcej informacji na temat tworzenia FDO, zobacz Tworzenie obiektów urządzeń w sterowniku funkcji. Następnie sterownik musi wyliczyć elementy podrzędne urządzenia nadrzędnego i dodać elementy podrzędne do listy podrzędnej.

Opcjonalnie kierowca może wywołać WdfDeviceSetBusInformationForChildren, aby udostępnić strukturę z informacjami o autobusie. Zalecamy wykonanie tej czynności, ponieważ ułatwia ona identyfikację magistrali przez urządzenia podrzędne i aplikacje.

Aby dodać urządzenia podrzędne do listy urządzeń podrzędnych, sterownik musi wywołać WdfChildListAddOrUpdateChildDescriptionAsPresent dla każdego znalezionego urządzenia podrzędnego. To wywołanie informuje system, że sterownik wykrył urządzenie podrzędne połączone z urządzeniem nadrzędnym. Kiedy sterownik wywołuje WdfChildListAddOrUpdateChildDescriptionAsPresent, przekazuje opis identyfikacyjny oraz opcjonalnie opis adresu.

Po tym, jak sterownik wywoła WdfChildListAddOrUpdateChildDescriptionAsPresent w celu zgłoszenia nowego urządzenia, platforma informuje menedżera PnP, że nowe urządzenie istnieje. Menedżer PnP tworzy stos urządzeń i stos sterowników dla nowego urządzenia. W ramach tego procesu struktura wywołuje funkcję zwrotną EvtChildListCreateDevice sterownika magistrali. Ta funkcja wywołania zwrotnego musi wywołać WdfDeviceCreate, aby utworzyć PDO dla nowego urządzenia.

Zazwyczaj kilka urządzeń podrzędnych jest podłączonych do urządzenia nadrzędnego, więc sterownik magistrali musi wywołać WdfChildListAddOrUpdateChildDescriptionAsPresent kilka razy. Najbardziej efektywnym sposobem wykonania tego procesu jest:

  1. Wywołaj WdfChildListBeginScan.

  2. Wywołaj WdfChildListAddOrUpdateChildDescriptionAsPresent dla każdego urządzenia podrzędnego.

  3. Wywołaj WdfChildListEndScan.

Jeśli otoczysz dynamiczne wyliczanie sterownika wywołaniami WdfChildListBeginScan i WdfChildListEndScan, framework przechowuje wszystkie zmiany na liście podrzędnej. Powiadamia menedżerowi PnP o zmianach w momencie, gdy sterownik wywołuje WdfChildListEndScan. W późniejszym czasie framework wywołuje EvtChildListCreateDevice funkcji wywołania zwrotnego dla każdego urządzenia na liście urządzeń podrzędnych. Ta funkcja wywołania zwrotnego wywołuje WdfDeviceCreate, aby utworzyć PDO dla każdego nowego urządzenia.

Gdy sterownik wywołuje WdfChildListBeginScan, framework oznacza wszystkie wcześniej zgłaszane urządzenia jako te, które już nie są obecne. W związku z tym sterownik musi wywołać WdfChildListAddOrUpdateChildDescriptionAsPresent dla wszystkich dzieci, które kierowca może wykryć, a nie tylko nowo odnalezione dzieci. Aby dodać jedno dziecko do listy dzieci, sterownik może dokonać jednego wywołania polecenia WdfChildListUpdateAllChildDescriptionsAsPresent bez wcześniejszego wywołania WdfChildListBeginScan.

Aktualizowanie dynamicznej listy podrzędnej

Aby zaktualizować informacje na liście dynamicznej podrzędnej, użyj jednej z poniższych metod:

  1. Gdy urządzenie nadrzędne odbiera przerwanie wskazujące przybycie lub usunięcie urządzenia podrzędnego, funkcja callback sterownika EvtInterruptDpc wywołuje WdfChildListAddOrUpdateChildDescriptionAsPresent, jeśli urządzenie jest podłączone lub WdfChildListUpdateChildDescriptionAsMissing, jeśli urządzenie jest odłączone.

  2. Sterownik może zapewnić funkcję wywołania zwrotnego EvtChildListScanForChildren, którą framework wywołuje przy każdym wejściu urządzenia nadrzędnego w stan roboczy (D0). Ta funkcja wywołania zwrotnego powinna wyliczać wszystkie urządzenia podrzędne przez wywołanie WdfChildListBeginScan, WdfChildListAddOrUpdateChildDescriptionAsPresent (lub WdfChildListUpdateAllChildDescriptionsAsPresent) i WdfChildListEndScan.

Możesz użyć jednej lub obu tych technik w sterowniku.

Przechodzenie po dynamicznej liście podrzędnej

Aby sprawdzić zawartość listy podrzędnej, sterownik może przejść przez listę przy użyciu jednej z następujących technik:

  • Aby uzyskać treść każdego opisu urządzenia podrzędnego, po kolei, sterownik może:

    1. Wywołaj WdfChildListBeginIteration.
    2. Wywołaj WdfChildListRetrieveNextDevice, tyle razy, ile jest to konieczne.
    3. Wywołaj WdfChildListEndIteration.

    Podczas wywoływania WdfChildListBeginIterationsterownik określa flagę typuWDF_RETRIEVE_CHILD_FLAGS, która wskazuje, czy framework powinien pobrać wszystkie opisy urządzeń, czy tylko ich podzbiór. Gdy WdfChildListRetrieveNextDevice znajdzie dopasowanie, pobiera identyfikator oraz opisy adresowe urządzenia podrzędnego, a także uchwyt do jego obiektu urządzenia.

  • Aby uzyskać opis adresu znajdujący się obecnie w opisie urządzenia podrzędnego, sterownik może wywołać WdfChildListRetrieveAddressDescription, określając opis identyfikacji. Platforma przechodzi przez listę podrzędną do momentu znalezienia urządzenia podrzędnego z zgodnym opisem identyfikacji. Następnie pobiera opis adresu.

  • Jeśli musisz uzyskać dojście do obiektu urządzenia struktury skojarzonego z konkretnym urządzeniem podrzędnym, sterownik może wywołać WdfChildListRetrievePdo. Struktura przemierza listę podrzędnych elementów do momentu znalezienia urządzenia podrzędnego z pasującym opisem identyfikacyjnym, a następnie zwraca uchwyt obiektu urządzenia. Aby chronić obiekt wywołujący przed nagłym usunięciem obiektu PDO w innym wątku, opakuj wywołanie za pomocą WdfChildListBeginIteration i WdfChildListEndIteration.

Uzyskiwanie dostępu do opisów identyfikacyjnych i adresowych PDO

Twój sterownik może wywołać następujące metody, aby uzyskać dostęp do opisu identyfikacji lub opisu adresu obiektu PDO.

Obsługa żądań ponownego wyliczania

Sterowniki magistrali opartej na strukturze, które obsługują wyliczanie dynamiczne, mogą otrzymać żądanie ponownego wyliczenia określonego urządzenia podrzędnego za pośrednictwem interfejsu REENUMERATE_SELF_INTERFACE_STANDARD. Aby uzyskać więcej informacji, zobacz Obsługa Żądań Wyliczania.