Udostępnij za pośrednictwem


zasoby sprzętowe GPIO-Based

Począwszy od systemu Windows 8, wyprowadzenia we/wy ogólnego przeznaczenia (GPIO), które są kontrolowane przez sterownik kontrolera GPIO, są dostępne dla innych sterowników jako zasoby sprzętowe zarządzane przez system. Piny wejściowe/wyjściowe GPIO, które są skonfigurowane jako piny wejściowe lub piny wyjściowe danych, są dostępne jako nowy typ zasobu systemu Windows, zasoby we/wy GPIO. Ponadto piny GPIO, które skonfigurowano jako wejścia żądania przerwania, są dostępne jako standardowe zasoby przerwań w systemie Windows.

Zasób GPIO I/O reprezentuje zestaw jednego lub więcej wyprowadzeń GPIO, z których sterownik urządzenia peryferyjnego może odczytywać lub do których może zapisywać. System Windows ukrywa szczegółowe informacje o podstawowej implementacji wyprowadzeń we/wy GPIO, dzięki czemu sterowniki urządzeń peryferyjnych mogą być zapisywane w celu manipulowania abstrakcyjnymi zasobami we/wy gpIO. Sterowniki urządzeń peryferyjnych, które korzystają z tych abstrakcyjnych zasobów, mogą działać na różnych platformach niezależnie od sprzętu kontrolera GPIO, który implementuje zasoby. Zasób wejścia/wyjścia GPIO jest reprezentowany przez uchwyt WDFIOTARGET, który kojarzy ten zasób z określonym sterownikiem kontrolera GPIO, który jest właścicielem bazowego lub bazowych wyprowadzeń GPIO.

Zazwyczaj wyprowadzenie we/wy na kontrolerze GPIO można skonfigurować jako wejście lub wyjście, w zależności od możliwości sprzętowych kontrolera i urządzenia, które jest fizycznie podłączone do pinu. W związku z tym sterownik może otworzyć połączenie logiczne z tym pinem dla operacji zapisu lub odczytu, ale nie dla obu jednocześnie. Jednak to ograniczenie jest nakładane przez sprzęt, a nie przez rozszerzenie struktury GPIO (GpioClx). Jeśli sprzęt umożliwia skonfigurowanie wyprowadzenia I/O zarówno jako wejścia, jak i jako wyjścia, GpioClx umożliwia sterownikowi otwarcie logicznego połączenia z pinem, które obsługuje operacje zarówno odczytu, jak i zapisu.

W przypadku wyprowadzeń gpIO, które są skonfigurowane jako dane wejściowe żądania przerwania, fakt, że żądanie przerwania jest implementowane przez wyprowadzenia GPIO zamiast przez kontroler przerwania lub dedykowany wiersz żądania przerwania jest całkowicie abstrakcyjny przez system operacyjny. Przerwania GPIO są prezentowane sterownikom urządzeń peryferyjnych jako abstrakcyjne zasoby przerwania. Abstrakcja tych zasobów jest obsługiwana przez stos sterowników GPIO i warstwę abstrakcji sprzętu (HAL). W związku z tym sterowniki urządzeń peryferyjnych korzystających z zasobów przerwania mogą w dużej mierze ignorować szczegóły dotyczące podstawowej implementacji tych zasobów. Aby uzyskać więcej informacji, zobacz GPIO Przerwania.

Na poniższym diagramie przedstawiono przykładowe przypisanie zasobów opartych na gpIO do dwóch sterowników urządzeń peryferyjnych:

przykładowe przypisanie zasobów opartych na gpio.

Na powyższym diagramie następujące trzy zasoby GPIO są przypisane do sterownika urządzenia peryferyjnego A:

  • Dwa wyprowadzenia wejściowe danych
  • Pin danych wyjściowych
  • Wyprowadzenie wejściowe przerwania

Następujące dwa zasoby oparte na gpIO są przypisane do sterownika urządzenia peryferyjnego B:

  • Pin danych wejściowych
  • Pin wejściowy przerwania

Sterowniki A i B otrzymują swoje przypisane zasoby w funkcjach wywołań zwrotnych EvtDevicePrepareHardware. Jeśli sterownik otrzymuje jako zasób zestaw co najmniej jednego wyprowadzenia I/O GPIO, może otworzyć połączenie z tymi wyprowadzeniami, aby uzyskać do nich dostęp. Sterownik uzyskuje uchwyt WDFIOTARGET w celu zidentyfikowania połączenia i wysyła żądania wejścia/wyjścia do tego uchwytu, aby odczytywać z tych pinów lub zapisywać do nich.

Przykłady kodu pokazujące sposób łączenia się z zestawem wyprowadzeń I/O interfejsu GPIO i wysyłania żądań I/O do tych wyprowadzeń można znaleźć w następujących tematach:

Łączenie sterownika KMDF z wyprowadzeniami wejścia/wyjścia GPIO

W obu tematach, funkcja IoRoutine w przykładzie kodu otwiera zasób wyprowadzenia GPIO we/wy dla operacji odczytu lub zapisu, w zależności od wartości parametru ReadOperation. Jeśli zasób jest otwarty do odczytu (DesiredAccess = GENERIC_READ), piny w zasobie są skonfigurowane jako wejścia, a żądanie IOCTL_GPIO_READ_PINS wysłane do zasobu pin odczytuje wartości wejściowe na tych pinach. GpioClx nie zezwala na wysyłanie żądania IOCTL_GPIO_WRITE_PINS do zestawu wejściowych wyprowadzeń i kończy takie żądanie statusem błędu STATUS_GPIO_OPERATION_DENIED. Podobnie, jeśli zasób pin jest otwarty dla zapisów (DesiredAccess = GENERIC_WRITE), piny w zasobie są skonfigurowane jako wyjścia, a żądanie IOCTL_GPIO_WRITE_PINS wysłane do zasobu pin ustawia wartości w zatrzaskach wyjściowych, które kontrolują te piny. Zazwyczaj wysłanie żądania IOCTL_GPIO_READ_PINS do zestawu wyprowadzeń wyjściowych po prostu odczytuje ostatnie wartości zapisane w zatrzaskach wyjściowych.

Aby użyć zasobu przerwania do odbierania przerwań, sterownik klienta musi połączyć procedurę obsługi przerwania (ISR) z przerwaniem. Zazwyczaj sterownik nawiązuje to połączenie przez wywołanie metody WdfInterruptCreate (lub, ewentualnie, procedury IoConnectInterruptEx ). Aby uzyskać więcej informacji na temat przerwań usługi KMDF, zobacz Tworzenie obiektu przerwania.

W przeciwieństwie do urządzeń Plug and Play, które mogą być dynamicznie połączone i odłączone od platformy sprzętowej, urządzenie kontrolera GPIO jest trwale dołączone. Ponadto zakłada się, że połączenia między wyprowadzeniami GPIO i urządzeniem peryferyjnym są trwałe. (Lub jeśli urządzenie peryferyjne może być odłączone od gniazda, gniazdo jest przeznaczone dla tego urządzenia). W związku z tym dostępne zasoby gpIO są stałe i można je określić w oprogramowaniu układowym platformy. Podobnie zakłada się, że sterowniki urządzeń peryferyjnych korzystających z zasobów GPIO używają dedykowanych zestawów zasobów GPIO. W związku z tym wymagania dotyczące zasobów dla tych sterowników urządzeń można określić w oprogramowaniu układowym platformy.

Gdy oprogramowanie układowe platformy wyznacza zestaw wyprowadzeń GPIO jako zasób we/wy gpIO, oprogramowanie układowe wskazuje, czy wyprowadzenia w tym zasobie mogą być otwierane dla odczytów, dla zapisów, czy zarówno odczytów, jak i zapisów.

Jeśli sterownik urządzenia peryferyjnego używa więcej niż jednego zasobu we/wy gpIO, ten sterownik musi być świadomy kolejności, w której te zasoby są wyliczane przez menedżera PnP. Na przykład, jeśli sterownik używa dwóch wyprowadzeń we/wy GPIO, ale te wyprowadzenia muszą być dostępne niezależnie i w różnym czasie, oprogramowanie układowe platformy powinno opisać każde wyprowadzenie GPIO jako oddzielny zasób we/wy. Menedżer PnP wylicza te zasoby w kolejności, w jakiej są one opisane w oprogramowaniu układowym platformy, który musi odpowiadać kolejności oczekiwanej przez sterownik.

Gdy sterownik urządzenia peryferyjnego otworzy połączenie z zasobem we/wy GPIO, żądanie IOCTL_GPIO_READ_PINS lub IOCTL_GPIO_WRITE_PINS wysłane przez ten sterownik do tego połączenia uzyskuje dostęp do wszystkich pinów w zasobie. Jeśli sterownik musi czasami uzyskiwać dostęp tylko do podzbioru tych numerów PIN, ten podzestaw musi być przypisany do sterownika jako oddzielny zasób.

Aby uzyskać więcej informacji na temat żądań IOCTL_GPIO_READ_PINS, w tym mapowania wyprowadzeń wejściowych danych do bitów w buforze wyjściowym żądania, zobacz IOCTL_GPIO_READ_PINS. Aby uzyskać więcej informacji na temat żądań IOCTL_GPIO_WRITE_PINS, w tym mapowania bitów w buforze wejściowym żądania na wyprowadzenia wyjściowe danych, zobacz IOCTL_GPIO_WRITE_PINS.