Метод Device-Specific контроллера GPIO (_DSM)
Для поддержки различных взаимодействий, зависящих от класса устройства, между стеком драйверов GPIO в Windows и встроенного ПО платформы корпорация Майкрософт определяет метод Device-Specific (_DSM), который можно включить в контроллер GPIO в пространство имен ACPI.
В настоящее время этот метод определяет две функции:
Индекс функции 0. Стандартная функция запроса, которую должны предоставить все _DSM методы.
Индекс функции 1. Функция полярности ActiveBoth, которая сообщает стеку GPIO о любых контактах ActiveBoth на контроллере, которые не являются логическим низким значением. В стеке GPIO предполагается, что контакты ActiveBoth имеют низкий уровень логики, поэтому эта функция позволяет платформе переопределить значение по умолчанию для определенных контактов.
Определение GUID
Guid для метода _DSM контроллера GPIO определяется следующим образом:
{4F248F40-D5E2-499F-834C-27758EA1CD3F}
Функция 0
Функция 0 каждого _DSM — это функция запроса, которая возвращает набор поддерживаемых индексов функций и всегда является обязательной. Определение функции 0 см. в разделе 9.14.1, "_DSM (метод для конкретного устройства)" в спецификации ACPI 5.0.
Функция 1
Параметры функции 1 метода _DSM контроллера GPIO определяются следующим образом:
Аргументы
Arg0: UUID для контроллера GPIO _DSM
// GUID: {4F248F40-D5E2-499F-834C-27758EA1CD3F}
DEFINE_GUID (GPIO_CONTROLLER _DSM_GUID,
0x4f248f40, 0xd5e2, 0x499f, 0x83, 0x4c, 0x27, 0x75, 0x8e, 0xa1, 0xcd. 0x3f);
Arg1: Идентификатор редакции
#define GPIO_CONTROLLER _DSM_REVISION_ID 0
Arg2: Индекс функции для утверждаемой полярности ActiveBoth:
#define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1
Arg3: Пакет пустой (не используется)
Возвращает
Пакет целых чисел, каждое из которых является номером контакта относительно контроллера на контроллере GPIO, который:
Определяется как прерывание ActiveBoth, и
Состояние утверждения которого не является логически низким (иными словами, имеет высокий уровень логики).
Например, если эмулированный контакт ActiveBoth подключен к устройству с кнопкой, контакт переходит в состояние утверждения (высокий уровень входных данных при закреплении), когда пользователь нажимает кнопку, и остается в состоянии утверждения, пока пользователь удерживает кнопку вниз. Когда пользователь отпускает кнопку, состояние закрепления меняется на unasserted (низкий уровень ввода логики).
Пример кода ASL
В следующем примере кода ASL идентифицируется набор контактов GPIO с начальной полярностью ActiveHigh.
//
// _DSM - Device-Specific Method
//
// Arg0: UUID Unique function identifier
// Arg1: Integer Revision Level
// Arg2: Integer Function Index (0 = Return Supported Functions)
// Arg3: Package Parameters
//
Function(_DSM,{BuffObj, PkgObj, IntObj},{BuffObj, IntObj, IntObj, PkgObj})
{
//
// Switch based on which unique function identifier was passed in
//
//
// GPIO CLX UUID
//
If(LEqual(Arg0,ToUUID("4F248F40-D5E2-499F-834C-27758EA1CD3F")))
{
switch(Arg2)
{
//
// Function 0: Return supported functions, based on
// revision
//
case(0)
{
// Revision 0+: Functions 0 & 1 are supported
return (Buffer() {0x3})
}
//
// Function 1: For emulated ActiveBoth controllers,
// returns a package of controller-relative pin
// numbers. Each corresponding pin will have an
// initial polarity of ActiveHigh.
//
// A pin number of 0xffff is ignored.
//
case(1)
{
// Marks pins 0x28, 0x29 and 0x44 to be ActiveHigh.
Return (Package() {0x28, 0x29, 0x44})
}
//
// Unrecognized function for this revision
//
default
{
BreakPoint
}
}
}
else
{
//
// If this is not one of the UUIDs we recognize, then return
// a buffer with bit 0 set to 0 to indicate that no functions
// are supported for this UUID.
//
return (Buffer() {0})
}
}