Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйверы контроллера GPIO могут вызывать методы GPIO_CLX_AcquireInterruptLock и GPIO_CLX_ReleaseInterruptLock для получения и выпуска блокировок прерываний, реализованных внутри расширения платформы GPIO (GpioClx). Код драйвера, работающий на IRQL = PASSIVE_LEVEL, может вызывать эти методы для синхронизации с подпрограммой обработки прерываний (ISR) в GpioClx. GpioClx выделяет отдельную блокировку прерывания для каждого банка пинов в контроллере GPIO.
Если аппаратные регистры контроллера GPIO сопоставлены с памятью, ISR в GpioClx вызывает определенные функции обратного вызова событий, реализованные драйвером, в DIRQL; GpioClx вызывает остальные функции обратного вызова в PASSIVE_LEVEL. Функциям обратного вызова пассивного уровня, которые обращаются к банку регистров, может потребоваться использовать блокировку прерывания для синхронизации с функциями обратного вызова, которые выполняются на DIRQL и обращаются к тем же регистрам.
Например, функции обратного вызова пассивного уровня CLIENT_EnableInterrupt и CLIENT_DisableInterrupt изменяют параметры оборудования, влияющие на работу других подпрограмм обратного вызова, связанных с прерыванием, которые выполняются в DIRQL. Функции CLIENT_EnableInterrupt и CLIENT_DisableInterrupt обычно используют блокировки прерываний банка для синхронизации их доступа к регистрам.
GpioClx автоматически сериализует связанные с прерыванием и вводом-выводом обратные вызовы, которые происходят в DIRQL. GpioClx получает блокировку прерывания для целевого банка перед вызовом функции обратного вызова на уровне DIRQL и освобождает её сразу после завершения выполнения функции. Это ошибка для функции обратного вызова, вызываемой в DIRQL, чтобы попытаться повторно приобрести блокировку прерывания банка путем вызова GPIO_CLX_AcquireInterruptLock.
Аналогично, GpioClx автоматически сериализует обратные вызовы, которые происходят на уровне PASSIVE_LEVEL. GpioClx внутренне реализует блокировку ожидания для каждого банка. GpioClx получает блокировку ожидания для целевого банка перед вызовом функции обратного вызова в PASSIVE_LEVEL и освобождает блокировку при возврате функции. Для контроллера GPIO с отображением на память, GpioClx управляет блокировками ожидания банка от имени драйвера, но не позволяет драйверу в явной форме получать и освобождать блокировки.
Однако для контроллера GPIO, не использующего сопоставление с памятью, GPIO_CLX_AcquireInterruptLock и GPIO_CLX_ReleaseInterruptLock получают и освобождают блокировку ожидания вместо блокировки прерывания. GpioClx реализует отдельную блокировку ожидания для каждого банка контактов в контроллере GPIO. Так как регистры не сопоставляются с памятью, все функции обратного вызова, связанные с прерываниями и вводом-выводом, вызываются на PASSIVE_LEVEL, чтобы они могли использовать запросы ввода-вывода для доступа к регистрам через последовательную шину, такую как I²C. GpioClx получает блокировку ожидания для целевого банка перед вызовом одной из этих функций обратного вызова и освобождает блокировку после возврата функции.
Это ошибка для функции обратного вызова для контроллера, не сопоставленного с памятью, чтобы попытаться повторно приобрести блокировку ожидания банка, вызвав GPIO_CLX_AcquireInterruptLock. Однако код драйвера пассивного уровня за пределами функций обратного вызова может вызывать методы GPIO_CLX_XxxInterruptLock для синхронизации с функциями обратного вызова. Поскольку GpioClx вызывает все функции обратного вызова, связанные с прерыванием, и функции обратного вызова ввода-вывода, связанные с PASSIVE_LEVEL, банковские блокировки ожидания эффективно занимают место блокировки прерываний банка для контроллеров, не сопоставленных с памятью.
Другим вариантом для контроллера без отображения в памяти является реализация набора блокировок ожидания драйвером контроллера. Эти блокировки ожидания могут позволить подпрограммам обратного вызова выполнять более детальное блокировку и разблокировку общих ресурсов, чем это возможно с помощью блокировок ожидания, реализованных GpioClx.
Во время вызова подпрограммы обратного вызова CLIENT_QueryControllerBasicInformation драйвер контроллера GPIO сообщает GpioClx, отображаются ли регистры контроллера в памяти. Дополнительные сведения см. в описании флага MemoryMappedController в CLIENT_CONTROLLER_BASIC_INFORMATION.
Дополнительные сведения о блокировках прерываний и блокировках ожидания см. в разделе Using Framework Locks.
В следующих таблицах содержатся более подробные сведения о том, какие функции обратного вызова вызываются в DIRQL вместо PASSIVE_LEVEL, если регистры сопоставляются с памятью. Примечания, следующие за таблицами, поясняют, когда функции обратного вызова пассивного уровня должны использовать блокировки прерываний.
- Функции обратного вызова, связанные с прерыванием
- Функции обратного вызова, связанные с операцией ввода-вывода
- Функции обратного вызова, связанные с инициализацией и настройкой GPIO
- Функции обратного вызова, связанные с управлением питанием GPIO
- Другие функции обратного вызова
Функции обратного вызова, связанные с прерыванием
Чтобы поддерживать пин-коды GPIO, настроенные как входные данные прерывания, драйвер контроллера GPIO реализует набор функций обратного вызова событий для управления запросами прерываний с помощью этих закреплений. В следующей таблице средний столбец указывает IRQL, в котором вызываются функции, если аппаратные регистры контроллера GPIO сопоставляются с памятью. Самый правый столбец указывает IRQL, в котором вызываются функции, если регистры не сопоставлены с памятью и должны быть доступны через последовательную шину.
Функция обратного вызова | IRQL, если память сопоставлена (MemoryMappedController = 1) | IRQL при последовательном доступе (MemoryMappedController = 0) |
---|---|---|
пассивный уровень (См. примечание 1.) |
PASSIVE_LEVEL (См. примечание 2.) |
|
DIRQL (См. примечание 3.) |
Уровень_пассивности (См. примечание 4.) |
|
DIRQL (См. примечание 5.) |
DIRQL (См. примечание 6.) |
Примечания
GpioClx не получает блокировку прерывания банка перед вызовом этой функции обратного вызова. Функция обратного вызова может при необходимости получить блокировку прерывания банка, чтобы синхронизировать доступ к регистрам, которые совместно используются с функциями обратного вызова, работающими на DIRQL.
GpioClx сериализует вызов этой функции обратного вызова с другими функциями обратного вызова, связанными с прерыванием, и функциями обратного вызова ввода-вывода, которые вызываются в PASSIVE_LEVEL. Таким образом, функция обратного вызова не должна пытаться получить блокировку ожидания банка.
GpioClx получает блокировку прерывания банка перед вызовом этой функции обратного вызова и освобождает блокировку после возврата функции. Таким образом, функция обратного вызова не должна пытаться получить блокировку прерывания банка.
GpioClx сериализует вызов этой функции обратного вызова с другими функциями обратного вызова, связанными с прерыванием, и функциями обратного вызова ввода-вывода, которые вызываются в PASSIVE_LEVEL. Функция обратного вызова не должна пытаться захватить замок ожидания банка.
GpioClx получает блокировку прерывания банка перед вызовом этой функции обратного вызова и освобождает блокировку после возврата функции. Таким образом, функция обратного вызова не должна пытаться захватить блокировку прерывания банка.
GpioClx не захватывает блокировку прерывания банка перед вызовом этой функции обратного вызова. Драйвер контроллера GPIO отвечает за предоставление любой синхронизации, которая может потребоваться.
Функции обратного вызова, связанные с операцией ввода-вывода
Чтобы поддерживать контакты GPIO, настроенные в качестве контактов ввода-вывода данных, драйвер контроллера GPIO реализует набор функций обратного вызова событий для управления операциями ввода-вывода через эти контакты. В следующей таблице центральный столбец указывает IRQL, на котором вызываются функции, если аппаратные регистры контроллера GPIO отображаются в памяти. Самый правый столбец указывает IRQL, на котором вызываются функции, если регистры не сопоставлены с памятью и должны быть доступны через последовательную шину.
Функция обратного вызова | IRQL при сопоставлении памяти (MemoryMappedController = 1) | IRQL при последовательном доступе (MemoryMappedController = 0) |
---|---|---|
ПАССИВНЫЙ_УРОВЕНЬ (См. примечание 1.) |
ПАССИВНЫЙ_УРОВЕНЬ (См. примечание 2.) |
|
DIRQL (См. примечание 3.) |
PASSIVE_LEVEL (См. примечание 4.) |
Примечания
GpioClx не получает блокировку прерывания банка перед вызовом этой функции обратного вызова. Функция обратного вызова может, если это необходимо, получить блокировку прерывания для синхронизации доступа к регистрам, которые используются совместно с функциями обратного вызова, работающими на уровне DIRQL.
GpioClx сериализует вызов данной функции обратного вызова с другими функциями обратного вызова, связанными с прерываниями и вводом-выводом, которые вызываются на PASSIVE_LEVEL. Таким образом, функции обратного вызова не следует пытаться захватить банковскую блокировку ожидания.
GpioClx получает блокировку прерывания банка перед вызовом этой функции обратного вызова и освобождает блокировку после возврата функции. Таким образом, функция обратного вызова не должна пытаться получить блокировку прерывания банка.
GpioClx сериализует вызов этой функции обратного вызова с другими функциями обратного вызова, связанными с прерыванием, и функциями обратного вызова ввода-вывода, которые вызываются в PASSIVE_LEVEL. Таким образом, функция обратного вызова не должна пытаться получить блокировку ожидания банка.
Функции обратного вызова GPIO и настройки
Чтобы настроить контроллер GPIO для выполнения операций ввода-вывода и прерываний, драйвер контроллера GPIO реализует набор функций обратного вызова событий для инициализации контроллера. В следующей таблице средний столбец указывает IRQL, в котором вызываются функции, если аппаратные регистры контроллера GPIO сопоставляются с памятью. Самый правый столбец указывает IRQL, на котором вызываются функции, если регистры не сопоставлены с памятью и доступ к ним должен осуществляться через последовательную шину.
Функция обратного вызова | IRQL, если память сопоставлена с памятью (MemoryMappedController = 1) | IRQL при последовательном доступе (MemoryMappedController = 0) |
---|---|---|
ПАССИВНЫЙ_УРОВЕНЬ (См. примечание 1.) |
PASSIVE_LEVEL (См. примечание 2.) |
Примечания
Когда GpioClx вызывает любую из этих функций обратного вызова, блокировки банковских прерываний недоступны. Таким образом, эти функции обратного вызова не должны пытаться получить блокировку прерывания банка.
Блокировки ожидания банка GpioClx недоступны, когда вызываются эти функции обратного вызова. Таким образом, драйвер не должен пытаться установить блокировку ожидания банка для синхронизации с этими функциями обратного вызова.
Функции обратного вызова, связанные с управлением питанием GPIO
Чтобы включить контроллер GPIO для изменения состояний питания устройства, драйвер контроллера GPIO реализует набор функций обратного вызова событий для сохранения и восстановления параметров оборудования во время этих изменений. В следующей таблице средний столбец указывает IRQL, на котором вызываются функции, если аппаратные регистры контроллера GPIO отображены в памяти. Самый правый столбец указывает IRQL, на котором вызываются функции, если регистры не сопоставлены с памятью и должны быть доступны через последовательную шину.
Функция обратного вызова | IRQL, если память сопоставлена (MemoryMappedController = 1) | IRQL при последовательном доступе (MemoryMappedController = 0) |
---|---|---|
DIRQL или HIGH_LEVEL (См. заметки.) |
Не поддерживается. |
Примечания
- Для обычных переходов состояния F: функции обратного вызова сохранения и восстановления вызываются с блокировкой прерывания банка, удерживаемой GpioClx в DIRQL. Таким образом, ни одна из функций обратного вызова не должна пытаться захватить блокировку прерывания банка.
- Для критических переходов состояний F: обратные вызовы сохранения и восстановления активируются, когда подключаемый модуль подсистемы питания (PEP) используется для сохранения и восстановления состояния GPIO. Функции обратного вызова сохранения и восстановления вызываются на HIGH_LEVEL в контексте последнего процессора, который освобождается на позднем этапе последовательности перехода платформы в режим глубокого простоя. Таким образом, ни одна из функций обратного вызова не должна пытаться захватить блокировку прерывания банка.
Дополнительные сведения о F-состояниях см. в разделеComponent-Level Power Management. Дополнительные сведения о PEP см. в разделе PoFxPowerControl.
Другие функции обратного вызова
Чтобы позволить контроллеру GPIO поддерживать контроллер-специфические операции, драйвер контроллера GPIO реализует функцию обратного вызова для обработки событий CLIENT_ControllerSpecificFunction. В следующей таблице средний столбец указывает IRQL, в котором вызывается функция, если аппаратные регистры контроллера GPIO сопоставляются с памятью. Самый правый столбец указывает IRQL, в котором вызывается функция, если регистры не сопоставлены с памятью и должны быть доступны через последовательную шину.
Функция обратного вызова | IRQL, если память сопоставлена (MemoryMappedController = 1) | IRQL при последовательном доступе (MemoryMappedController = 0) |
---|---|---|
Уровень пассивности (См. примечание 1.) |
ПАССИВНЫЙ УРОВЕНЬ (См. примечание 2.) |
Примечания
GpioClx не получает блокировку прерывания банка перед вызовом этой функции обратного вызова. Функция обратного вызова может, при необходимости, получить блокировку прерывания банка, чтобы синхронизировать доступ к регистрам, которые используются совместно с функциями обратного вызова, выполняющимися на DIRQL.
GpioClx сериализует вызов этой функции обратного вызова с другими функциями обратного вызова, связанными с прерыванием, и функциями обратного вызова ввода-вывода, которые вызываются в PASSIVE_LEVEL. Таким образом, функция обратного вызова не должна пытаться получить блокировку ожидания банка.