Udostępnij przez


Interrupt-Related wywołania zwrotne

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.

zintegrowany kontroler gpio i zewnętrzny kontroler gpio.

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.