Необязательные и обязательные функции обратного вызова GPIO

Драйвер контроллера GPIO вызывает метод GPIO_CLX_RegisterClient для регистрации в качестве клиента расширения платформы GPIO (GpioClx). Во время этого вызова драйвер передает пакет регистрации в GpioClx, который задает список функций обратного вызова событий, реализованных драйвером. GpioClx вызывает эти функции обратного вызова для настройки оборудования контроллера GPIO, выполнения операций ввода-вывода и управления прерываниями. Для реализации определенных функций обратного вызова GpioClx требуется драйвер контроллера GPIO, но поддержка других функций обратного вызова является необязательной.

Пакет регистрации является GPIO_CLIENT_REGISTRATION_PACKET структурой. Если драйвер контроллера GPIO реализует определенную функцию обратного вызова, он записывает указатель функции на эту функцию обратного вызова в соответствующий член этой структуры. Или, чтобы указать, что определенная функция обратного вызова не поддерживается, драйвер записывает null в соответствующий член.

В пакет регистрации должны быть включены следующие функции обратного вызова:

CLIENT_PrepareControllerCLIENT_QueryControllerBasicInformationCLIENT_StartControllerCLIENT_StopControllerCLIENT_ReleaseController Если какая-либо функция обратного вызова в предыдущем списке отсутствует (то есть, если соответствующий указатель функции в пакете регистрации имеет значение NULL), метод GPIO_CLX_RegisterClient завершается ошибкой.

Драйвер контроллера GPIO не требуется для поддержки чтения и записи в контакты ввода-вывода GPIO, которые являются контактами, настроенными как входные или выходные данные. (Контроллер GPIO без контактов ввода-вывода по-прежнему может передавать запросы прерываний с периферийных устройств.) Однако если пакет регистрации включает в себя любой из следующих функций обратного вызова, связанных с вводом-выводом, пакет должен включать обе следующие функции обратного вызова:

CLIENT_ConnectIoPinsCLIENT_DisconnectIoPins Кроме того, если пакет регистрации включает две функции обратного вызова из предыдущего списка, драйвер должен дополнительно поддерживать чтение из контактов ввода-вывода GPIO, запись в контакты ввода-вывода GPIO или и то, и другое. В частности, пакет регистрации должен включать по крайней мере одну функцию обратного вызова в следующем списке:

CLIENT_ReadGpioPins или CLIENT_ReadGpioPinsUsingMaskCLIENT_WriteGpioPins или CLIENT_WriteGpioPinsUsingMask Драйвер, поддерживающий операции чтения, должен реализовывать одну из двух функций обратного вызова CLIENT_ReadGpioPinsXxx из предыдущего списка. Драйвер, поддерживающий операции записи, должен реализовывать одну из двух функций обратного вызова xxx CLIENT_WriteGpioPinsв предыдущем списке.

Драйвер, реализующий CLIENT_ReadGpioPinsUsingMask, CLIENT_WriteGpioPinsUsingMask или и то, и другое, должен задать бит флага FormatIoRequestsAsMasks в сведениях об устройстве, предоставляемых функцией обратного вызова CLIENT_QueryControllerBasicInformation . Драйвер, реализующий CLIENT_ReadGpioPins, CLIENT_WriteGpioPins или и то, и другое, не должен задавать этот бит флага. Дополнительные сведения см. в описании элемента Flags в CLIENT_CONTROLLER_BASIC_INFORMATION.

Драйвер контроллера GPIO не требуется для поддержки прерываний GPIO. Однако если пакет регистрации включает в себя какие-либо из следующих функций обратного вызова, связанных с прерыванием, пакет должен включать все следующие функции обратного вызова:

CLIENT_EnableInterruptCLIENT_DisableInterruptCLIENT_MaskInterruptsCLIENT_QueryActiveInterruptsCLIENT_UnmaskInterrupt Драйвер, поддерживающий маскирование прерываний, должен реализовывать функцию обратного вызова CLIENT_MaskInterrupts . Драйвер, поддерживающий запросы активных прерываний, должен реализовывать функцию обратного вызова CLIENT_QueryActiveInterrupts .

Функция обратного вызова CLIENT_ClearActiveInterrupts является особым случаем. Если оборудование контроллера GPIO автоматически очищает активные прерывания при их чтении, функция CLIENT_ClearActiveInterrupts не требуется, а соответствующий указатель функции в пакете регистрации должен иметь значение NULL. Однако если активные прерывания не очищаются автоматически при их чтении, а функции обратного вызова, связанные с прерываниями, в предыдущем списке указаны в пакете регистрации, функция CLIENT_ClearActiveInterrupts должна быть включена в пакет. Чтобы указать, что оборудование автоматически очищает активные прерывания при считывании, драйвер устанавливает бит флага ActiveInterruptsAutoClearOnRead в сведениях об устройстве, предоставляемых функцией обратного вызова CLIENT_QueryControllerBasicInformation . Дополнительные сведения см. в описании элемента Flags в CLIENT_CONTROLLER_BASIC_INFORMATION.

Если драйвер контроллера GPIO поддерживает прерывания GPIO, пакет регистрации может включать в себя следующую функцию обратного вызова:

CLIENT_QueryEnabledInterrupts GpioClx поддерживает функцию CLIENT_QueryEnabledInterrupts, начиная с Windows 8.1.

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

CLIENT_RestoreBankHardwareContextCLIENT_SaveBankHardwareContext Чтобы указать, что оборудование поддерживает управление питанием на уровне компонентов, драйвер устанавливает бит флага BankIdlePowerMgmtSupported в сведениях об устройстве, предоставляемых функцией обратного вызова CLIENT_QueryControllerBasicInformation . Дополнительные сведения см. в описании элемента Flags в CLIENT_CONTROLLER_BASIC_INFORMATION.

Функции обратного вызова CLIENT_PreProcessControllerInterrupt, CLIENT_ReconfigureInterrupt и CLIENT_ControllerSpecificFunction являются необязательными и поддерживаются GpioClx для решения проблем, связанных с оборудованием в некоторых реализациях контроллеров GPIO. Только драйверы контроллера GPIO с особыми требованиями реализуют эти функции.