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


Секционирование контроллера GPIO на банки контактов

Разработчик драйвера может, как вариант, разделить устройство контроллера ввода-вывода общего назначения (GPIO) на два или более банков контактов GPIO. Например, устройство контроллера GPIO с 64 контактами GPIO может быть описано драйвером контроллера GPIO как два банка, каждый из которых имеет 32 контакта GPIO. Разработчик может предоставить один драйвер для управления всеми банками в устройстве контроллера GPIO, и этот драйвер обычно использует один объект устройства для представления всего устройства. Однако некоторыми или всеми банками на устройстве можно управлять независимо от других банков на устройстве.

Как правило, драйвер контроллера GPIO выбирает секционирование контроллера GPIO на два или более банков по одной из следующих причин:

  • Состоянием власти контактов GPIO в банке можно управлять независимо от контактов в других банках.
  • Общее число контактов в контроллере GPIO больше 64.

Максимальный размер банка, поддерживаемый расширением платформы GPIO (GpioClx), составляет 64 контакта. Устройство контроллера GPIO, содержащее более 64 контактов, должно быть разделено драйвером на два или более банков, каждый из которых содержит не более 64 контактов.

Чтобы определить, как контроллер GPIO секционируется на банки, GpioClx вызывает функцию обратного вызова события CLIENT_QueryControllerBasicInformation . Эта функция, реализованная драйвером контроллера GPIO, предоставляет CLIENT_CONTROLLER_BASIC_INFORMATION структуру, описывающую атрибуты и возможности контроллера GPIO. Два члена этой структуры, TotalPins и NumberOfPinsPerBank, указывают, как контакты в контроллере GPIO разделяются на банки. TotalPins указывает общее количество контактов в контроллере GPIO, а NumberOfPinsPerBank — количество контактов на банк. Если N — это количество банков в контроллере, банки нумеруются от 0 до N–1. Все, кроме последнего банка (т. е. номер банка N–1), должны содержать количество контактов, указанных в элементе NumberOfPinsPerBank . Последний банк может иметь любое количество контактов от одного до NumberOfPinsPerBank.

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

(TotalPins + NumberOfPinsPerBank — 1) / NumberOfPinsPerBank В некоторых устройствах контроллера GPIO банк контактов на устройстве можно включить или переключить в маломощное состояние независимо от других банков на том же устройстве. Таким образом, при бездействии конкретного банка этот банк может быть переключен в маломощное состояние для снижения энергопотребления. Для размещения таких устройств GpioClx поддерживает управление питанием на уровне компонентов. GpioClx определяет два состояния питания на уровне компонентов: F0 (полностью включено) и F1 (низкий или выключенный).

Чтобы определить, поддерживает ли банк контактов GPIO управление питанием на уровне компонентов, GpioClx вызывает функцию обратного вызова события CLIENT_QuerySetControllerInformation . Параметр InputBuffer этой функции является указателем на структуру CLIENT_CONTROLLER_QUERY_SET_INFORMATION_INPUT . Чтобы запросить сведения об управлении питанием, вызывающий объект задает для элемента RequestType этой структуры значение QueryBankPowerInformation.

Если банк GPIO поддерживает управление питанием на уровне компонентов, GpioClx включает переход в состояние питания F1, когда банк неактивен. Прежде чем банк перейдет в состояние F1, GpioClx вызывает функцию обратного вызова события CLIENT_SaveBankHardwareContext , чтобы сообщить драйверу сохранить аппаратный контекст (главным образом, содержимое регистра) банка. Позже, когда банк перейдет в состояние F0, GpioClx вызывает функцию обратного вызова события CLIENT_RestoreBankHardwareContext , чтобы сообщить драйверу восстановить ранее сохраненный контекст оборудования.