функция обратного вызова GPIO_CLIENT_PRE_PROCESS_CONTROLLER_INTERRUPT (gpioclx.h)

Функция обратного вызова событий CLIENT_PreProcessControllerInterrupt выполняет предварительную обработку прерывания ввода-вывода общего назначения (GPIO), которое должно быть выполнено немедленно, если isR планируется запустить позже.

Синтаксис

GPIO_CLIENT_PRE_PROCESS_CONTROLLER_INTERRUPT GpioClientPreProcessControllerInterrupt;

NTSTATUS GpioClientPreProcessControllerInterrupt(
  [in] PVOID Context,
  [in] BANK_ID BankId,
       ULONG64 EnabledMask
)
{...}

Параметры

[in] Context

Указатель на контекст устройства драйвера контроллера GPIO.

[in] BankId

Банк, содержащий прерванный контакт GPIO. Если N — количество банков в контроллере GPIO, BankId — это целое число в диапазоне от 0 до N–1. Расширение платформы GPIO ранее получило количество банков в контроллере из функции обратного вызова события CLIENT_QueryControllerBasicInformation . Дополнительные сведения см. в разделе Примечания в CLIENT_CONTROLLER_BASIC_INFORMATION.

EnabledMask

Возвращаемое значение

Функция CLIENT_PreProcessControllerInterrupt возвращает STATUS_SUCCESS, если вызов выполнен успешно. В противном случае возвращается соответствующий код ошибки.

Комментарии

Эта функция обратного вызова является необязательной. Драйвер контроллера GPIO реализует эту функцию, только если выполняет большую часть обработки прерываний в PASSIVE_LEVEL, но должен выполнять некоторую начальную обработку прерывания в DIRQL.

Как правило, драйвер контроллера GPIO может получить доступ к контроллеру GPIO, сопоставленном в памяти, в DIRQL, но может получить доступ к контроллеру GPIO с последовательным подключением только в PASSIVE_LEVEL. Однако некоторые последовательно подключенные контроллеры GPIO могут потерять данные о состоянии прерывания, если они задерживают запись битов состояния прерывания до тех пор, пока IRQL не упадет на PASSIVE_LEVEL. Когда irQL позже падает на PASSIVE_LEVEL, расширение платформы GPIO (GpioClx) может вызывать функцию обратного вызова CLIENT_QueryActiveInterrupts драйвера для получения содержимого регистра.

Драйвер контроллера GPIO указывает, должен ли он обрабатывать прерывания при PASSIVE_LEVEL в сведениях об устройстве, которые он передает GpioClx во время обратного вызова CLIENT_QueryControllerBasicInformation . Если контроллер GPIO сопоставлен с памятью, чтобы драйвер смог получить доступ к регистрам контроллера в DIRQL, драйвер устанавливает бит флага MemoryMappedController в элементе Flagsструктуры CLIENT_CONTROLLER_BASIC_INFORMATION , которую драйвер передает в GpioClx. В противном случае драйвер задает MemoryMappedController = 0, чтобы указать, что драйвер должен обрабатывать прерывания при PASSIVE_LEVEL. Дополнительные сведения см. в разделе IsR пассивного уровня.

Чтобы зарегистрировать функцию обратного вызова CLIENT_PreProcessControllerInterrupt драйвера, вызовите метод GPIO_CLX_RegisterClient . Этот метод принимает в качестве входного параметра указатель на структуру GPIO_CLIENT_REGISTRATION_PACKET , содержащую указатель функции CLIENT_PreProcessControllerInterrupt .

Примеры

Чтобы определить функцию обратного вызова CLIENT_PreProcessControllerInterrupt , необходимо сначала предоставить объявление функции, определяющее тип определяемой функции обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.

Например, чтобы определить функцию обратного вызова CLIENT_PreProcessControllerInterrupt с именем MyEvtGpioPreProcessInterrupt, используйте тип функции GPIO_CLIENT_PRE_PROCESS_CONTROLLER_INTERRUPT, как показано в следующем примере кода:

GPIO_CLIENT_PRE_PROCESS_CONTROLLER_INTERRUPT MyEvtGpioPreProcessInterrupt;

Затем реализуйте функцию обратного вызова следующим образом:

_Use_decl_annotations_
NTSTATUS
  MyEvtGpioPreProcessInterrupt(
    PVOID Context
    )
{ ... }

Тип функции GPIO_CLIENT_PRE_PROCESS_CONTROLLER_INTERRUPT определен в файле заголовка Gpioclx.h. Чтобы более точно определить ошибки при запуске средств анализа кода, не забудьте добавить заметку Use_decl_annotations в определение функции. Заметка Use_decl_annotations гарантирует использование заметок, которые применяются к типу функции GPIO_CLIENT_PRE_PROCESS_CONTROLLER_INTERRUPT в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в статье Объявление функций с помощью типов ролей функций для драйверов KMDF. Дополнительные сведения о Use_decl_annotations см. в статье О поведении функции.

Требования

Требование Значение
Минимальная версия клиента Поддерживается начиная с Windows 8.
Целевая платформа Персональный компьютер
Верхняя часть gpioclx.h
IRQL Вызывается по адресу DIRQL.

См. также раздел

GPIO_CLIENT_REGISTRATION_PACKET

GPIO_CLX_RegisterClient