Поделиться через


Функции обратного вызова 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 Драйвер, поддерживающий чтение, должен реализовать одну из двух функций обратного вызова xxx CLIENT_ReadGpioPinsв предыдущем списке. Драйвер, поддерживающий запись, должен реализовать одну из двух функций обратного вызова 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 с особыми требованиями реализуют эти функции.