Compartilhar via


Método específico do dispositivo do controlador GPIO (_DSM)

Para dar suporte a uma variedade de comunicações específicas da classe de dispositivo entre a pilha de driver de E/S de uso geral (GPIO) no Windows e o firmware de plataforma, a Microsoft define um método de Device-Specific (_DSM) que pode ser incluído em um controlador GPIO no namespace ACPI.

Atualmente, esse método define duas funções:

  • índice de função 0: a função de consulta padrão que todos os métodos _DSM são necessários para fornecer.

  • índice de funções 1: a função Polarity ActiveBoth, que informa a pilha GPIO de quaisquer pinos ActiveBoth no controlador que não são declarados baixos lógicos. A pilha gpio pressupõe que os pinos ActiveBoth são declarados como lógicos baixos, portanto, essa função permite que a plataforma substitua esse padrão por pinos específicos.

Definição de GUID

O GUID para o método _DSM do controlador GPIO é definido como:

{4F248F40-D5E2-499F-834C-27758EA1CD3F}

Função 0

A função 0 de cada _DSM é uma função de consulta que retorna o conjunto de índices de função com suporte e é sempre necessária. Para obter a definição da Função 0, consulte a seção 9.14.1, "_DSM (Método Específico do Dispositivo)", na especificação ACPI 5.0.

Função 1

Os parâmetros para a Função 1 do controlador GPIO _DSM método são definidos da seguinte maneira:

Argumentos

  • Arg0: UUID para controlador 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: ID da revisão de

    #define GPIO_CONTROLLER _DSM_REVISION_ID 0

  • Arg2: índice de funções para ActiveBoth afirmou a polaridade:

    #define GPIO_CONTROLLER_DSM_ACTIVE_BOTH_POLARITY_FUNCTION_INDEX 1

  • Arg3: Pacote vazio (não usado)

Retornar

Um pacote de inteiros, cada um deles é o número de pino relativo do controlador de um pino no controlador GPIO que é:

  • Definido como uma interrupção do ActiveBoth e

  • Cujo estado declarado é não lógica baixa (em outras palavras, é lógica alta).

Por exemplo, se um pino ActiveBoth emulado estiver conectado a um dispositivo de botão, o pino entrará no declarado estado (nível de entrada lógico alto no pino) quando o usuário pressionar o botão e permanecer no estado declarado enquanto o usuário segurar o botão para baixo. Quando o usuário libera o botão, o estado do pino é alterado para não inserido (nível de entrada lógico-baixo).

Exemplo de código ASL

O exemplo de código ASL a seguir identifica um conjunto de pinos GPIO que têm polaridade inicial do 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})
    }
}