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

Драйвер контроллера ввода-вывода общего назначения (GPIO) вызывает метод GPIO_CLX_RegisterClient для регистрации в качестве клиента расширения платформы GPIO (GpioClx). Во время этого вызова драйвер передает пакет регистрации в GpioClx, который указывает список функций обратного вызова событий, реализованных драйвером. GpioClx вызывает эти функции обратного вызова для настройки оборудования контроллера GPIO, выполнения операций ввода-вывода и управления прерываниями. Для реализации определенных функций обратного вызова требуется драйвер контроллера 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 Драйвер, поддерживающий операции чтения, должен реализовать одну из двух функций обратного вызова Xxx CLIENT_ReadGpioPinsв предыдущем списке. Драйвер, поддерживающий операции записи, должен реализовать одну из двух функций обратного вызова CLIENT_WriteGpioPinsXxx в предыдущем списке.

Драйвер, реализующий 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 с особыми требованиями.