Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Opcjonalnie, sterownik dla kontrolera we/wy ogólnego przeznaczenia (GPIO) może zapewnić obsługę przerwań GPIO. Aby obsługiwać przerwania GPIO, sterownik kontrolera GPIO implementuje zestaw funkcji wywołania zwrotnego w celu zarządzania tymi przerwaniami. Sterownik zawiera wskaźniki do tych funkcji wywołania zwrotnego w pakiecie rejestracyjnym, który sterownik dostarcza, gdy rejestruje się jako klient rozszerzenia platformy GPIO (GpioClx). Aby uzyskać więcej informacji na temat tego pakietu rejestracji, zobacz GPIO_CLIENT_REGISTRATION_PACKET.
Z reguły kontroler GPIO, który jest zintegrowaną częścią Systemu na Chipie (SoC), ma rejestry sprzętowe mapowane w pamięci, które mogą być bezpośrednio dostępne przez procesor w układzie SoC. Jednak oddzielne urządzenie kontrolera GPIO może być podłączone zewnętrznie do mikroukładu SoC za pośrednictwem magistrali szeregowej, jak pokazano na poniższym diagramie.
Na tym diagramie zewnętrzny kontroler GPIO jest podłączony do magistrali I²C. Ta magistrala jest kontrolowana przez kontroler magistrali I²C, który jest zintegrowaną częścią mikroukładu SoC. Linia żądania przerwania z zewnętrznego kontrolera GPIO jest podłączona do pinu na zintegrowanym kontrolerze GPIO. GpioClx DDI może pomieścić zarówno zintegrowany kontroler GPIO, jak i zewnętrzny kontroler GPIO w tym przykładzie.
Jeśli urządzenie kontrolera GPIO jest mapowane na pamięć, sterownik kontrolera GPIO może bezpośrednio uzyskać dostęp do rejestrów sprzętowych kontrolera w DIRQL. Jeśli jednak kontroler GPIO jest podłączony szeregowo, sterownik kontrolera GPIO może uzyskiwać dostęp do rejestrów sprzętowych tylko przy IRQL = PASSIVE_LEVEL, zgodnie z opisem w Passive-Level ISR.
Sterownik kontrolera GPIO, który ma rejestry sprzętowe z mapą pamięci, powinien ustawić bit flagi MemoryMappedController w informacjach o urządzeniu, które sterownik udostępnia GpioClx. W przeciwnym razie GpioClx zakłada, że rejestry sprzętowe nie są mapowane na pamięć i że sterownik może uzyskać dostęp do tych rejestrów tylko przy poziomie IRQL = PASSIVE_LEVEL. Aby uzyskać więcej informacji na temat tego bitu flagi, zobacz CONTROLLER_ATTRIBUTE_FLAGS.
GpioClx implementuje procedurę usługi przerwania (ISR) w celu obsługi żądań przerwań z kontrolera GPIO. Ta usługa ISR wywołuje następujące funkcje wywołania zwrotnego związane z przerwaniami:
CLIENT_ClearActiveInterruptsCLIENT_MaskInterruptsCLIENT_QueryActiveInterruptsCLIENT_QueryEnabledInterruptsCLIENT_UnmaskInterrupt Te funkcje są wywoływane na poziomie DIRQL lub PASSIVE_LEVEL, w zależności od tego, czy ISR w GpioClx działa na poziomie DIRQL lub PASSIVE_LEVEL. IsR wywołuje te funkcje w DIRQL, jeśli MemoryMappedController = 1, a w PASSIVE_LEVEL, jeśli MemoryMappedController = 0. W obu przypadkach ISR automatycznie serializuje wywołania zwrotne, aby wywołanie jednej z tych funkcji nie nastąpiło w środku wywołania innej z tych funkcji.
Rozszerzenie frameworku GPIO wywołuje poniższe funkcje callback związane z przerwaniami wyłącznie na poziomie PASSIVE_LEVEL, niezależnie od ustawienia flagi MemoryMappedController.
CLIENT_DisableInterruptCLIENT_EnableInterrupt Jeśli flaga MemoryMappedController nie jest ustawiona, wszystkie funkcje wywołania zwrotnego związane z przerwaniem są wywoływane w PASSIVE_LEVEL. Funkcja GpioClx automatycznie serializuje wywołania tych funkcji, dzięki czemu wywołanie jednej z tych funkcji nie występuje w środku wywołania do innej z tych funkcji.
Jeśli jednak ustawiono flagę MemoryMappedController, funkcje CLIENT_EnableInterrupt i CLIENT_DisableInterrupt muszą jawnie zsynchronizować swoje operacje włączania i wyłączania przerwań z GpioClx ISR, która wywołuje pozostałe cztery funkcje wywołania zwrotnego związane z przerwaniami na poziomie DIRQL.
Zazwyczaj inne funkcje dla wywołań zwrotnych CLIENT_Xxx (których nazwy nie zawierają "Przerwanie") nie wykonują przetwarzania związanego z przerwaniem, dlatego nie muszą być synchronizowane z GpioClx ISR. Jeśli jednak którakolwiek z tych funkcji jest wywoływana na poziomie PASSIVE_LEVEL i zawiera kod, który uzyskuje dostęp do ustawień przerwania dostępnych przez funkcje związane z przerwaniami na poziomie DIRQL, ten kod musi być zsynchronizowany z ISR.
Aby obsługiwać synchronizację przerwań, GpioClx implementuje zestaw blokad przerwań. Funkcja wywołania zwrotnego uruchamiana w PASSIVE_LEVEL może wywołać metodę GPIO_CLX_AcquireInterruptLock w celu uzyskania blokady przerwania i wywołać metodę GPIO_CLX_ReleaseInterruptLock w celu zwolnienia blokady. Gdy funkcja przechowuje blokadę przerwania, ISR GpioClx nie może się uruchomić, a ten ISR nie może wywołać żadnej funkcji wywołania zwrotnego związanej z przerwaniem. Aby umożliwić obsługę przerwań GPIO w odpowiednim czasie, sterownik powinien trzymać blokadę przerwania nie dłużej niż jest to konieczne.
Aby uzyskać więcej informacji, zobacz Synchronizacja przerwań dla sterowników kontrolera GPIO.