Guia de Implementação da Iluminação de Fundo do Teclado

Este documento detalha a implementação do protocolo para integrar o controlo de retroiluminação de dispositivos com teclado que se ligam a um host Windows 11 compatível. Isto não inclui orientações sobre restrições mecânicas, elétricas ou seleção de componentes para o hardware do teclado.

Este guia cobre apenas as luzes de fundo globais simples do teclado, onde um único nível de brilho se aplica a todo o teclado. Para teclados com iluminação RGB zonada ou por tecla, consulte a Iluminação Dinâmica em vez disso.

O suporte para integração de retroiluminação do teclado está disponível no Windows 11, versão 25H2, versão 26200.7922 ou superior.

Implementação do Protocolo de Retroiluminação do Teclado

É necessária uma boa compreensão do protocolo HID para poder compreender as informações aqui apresentadas. Consulte os seguintes recursos para obter informações sobre o protocolo HID:

Guia de Retroiluminação do Teclado

Coleção HID Obrigatória

Funcionalidades relacionadas com retroiluminação do teclado devem ser incluídas numa coleção HID Consumer Keyboard Backlight (Página 0xC, Uso 0x7).

Botões de Entrada

A tabela seguinte define os botões de entrada suportados pelo host para controlos de retroiluminação do teclado. Estes botões não devem aplicar diretamente atualizações de brilho no dispositivo, mas devem, em vez disso, delegar as operações de controlo de brilho para o computador anfitrião. Em muitos casos, o anfitrião responde prontamente a um botão de entrada com um relatório de Nível de Conjunto, opcionalmente ajustado com base no algoritmo de brilho do anfitrião. O dispositivo não deve aplicar qualquer alteração temporária de brilho enquanto aguarda essa resposta.

Os botões de entrada são aplicados por dispositivo e não se aplicam a nenhum dispositivo além do que emite o relatório.

Se o dispositivo estiver ligado a um host que não suporta controlo de retroiluminação do teclado — indicado pela ausência de um relatório de saída de Nível Set no arranque ou no momento da ligação — o dispositivo pode recorrer ao controlo direto local de brilho para os seus botões de entrada.

Usos Opcionais
Nome do relatório Description Página ID
Incremento de Brilho Pede ao anfitrião que aumente o brilho da retroiluminação em um passo lógico. O host determina o tamanho da etapa, que pode variar consoante o alcance lógico e o algoritmo de luminosidade ativa. Recomenda-se fortemente que os dispositivos que suportam Aumento de Brilho também suportem a Diminuição de Brilho. 0x0C 0x0079
Diminuição do brilho Pede ao anfitrião que diminua o brilho da retroiluminação em um passo lógico. O host determina o tamanho do passo, que pode variar consoante o alcance lógico e o algoritmo de brilho ativo. É altamente recomendado que os dispositivos que suportem a Diminuição de Brilho também suportem o Aumento de Brilho. 0x0C 0x007A
Controlo de Ligar/Desligar (OOC) Pede ao anfitrião para ativar ou desligar a luz de fundo do teclado. Se ligar a luz de fundo, o sistema anfitrião definirá um valor de brilho diferente de zero adequado para enviar ao dispositivo. Desligar a retroiluminação implica um pedido para o anfitrião definir a retroiluminação para brilho zero. 0x0C 0x007C
Auto Pede ao anfitrião para ativar ou desativar o ajuste automático de brilho. 0x0C 0x007F
Definir Mínimo Solicita ao anfitrião que defina a luz de fundo do teclado para o seu nível mínimo de brilho lógico não nulo (tipicamente 1 nit). Isto representa o brilho mínimo suportado pelo dispositivo sem desligar totalmente a luz de fundo. 0x0C 0x007D
Definir Máximo Pede ao anfitrião que ajuste a luz de fundo do teclado para o seu nível lógico máximo de brilho. 0x0C 0x007E
Próximo Nível Pede ao anfitrião que defina o brilho da luz de fundo do teclado para o próximo nível sugestivo mais brilhante, com transbordar para o nível sugestivo mais baixo se o nível atual de brilho atingir ou exceder o nível sugestivo mais alto. Se o Relatório de Funcionalidades de Sugestões de Nível não for implementado, este botão é ignorado. 0x0C 0x0515
Nível Anterior Solicita ao host que defina o brilho da luz de fundo do teclado para o próximo nível mais baixo de luminosidade recomendada, com retrocesso para o nível de luminosidade mais alto recomendado se o nível atual de luminosidade for igual ou inferior ao nível mais baixo recomendado. Se o Relatório de Sugestões de Funcionalidades de Nível não estiver implementado, este botão é ignorado. 0x0C 0x0516

Relatório de Saída de Nível de Conjunto

O anfitrião enviará este relatório para definir ou alterar o nível de brilho da retroiluminação no dispositivo. O dispositivo pode detetar um host com retroiluminação do teclado ao receber este relatório no arranque do sistema ou ao ligar-se ao host.

O relatório de saída do Ajuste de Nível deve definir uma gama lógica de valores de níveis de brilho numa escala linear, com a unidade HID declarada como nits. O host utiliza esta gama lógica para determinar os possíveis níveis de brilho suportados pelo dispositivo; Não requer que o dispositivo seja calibrado para emitir valores exatos de luminância. Todos os outros comandos de retroiluminação do teclado e operações do host irão referenciar este intervalo lógico.

Se o mínimo lógico for igual ou superior ao máximo lógico, o dispositivo é considerado não compatível e não será aberto para controlo de retroiluminação pelo anfitrião.

Um valor de Nível Definido de 0 instrui o dispositivo a desligar a luz de fundo. É fortemente recomendado que o dispositivo utilize um mínimo lógico de 0 (sem brilho) para este relatório.

Usos Obrigatórios
Nome do relatório Description Página ID
Definir Nível Instrui o dispositivo a definir o brilho da retroiluminação do teclado para o valor de nits lógicos especificado. 0x0C 0x007B

Relatório de Funcionalidades de Sugestões de Níveis de Retroiluminação do Teclado

Este relatório é opcional. O dispositivo pode optar por suportar uma série de pelo menos dois preajustes de brilho que deseja alternar quando o utilizador pressiona os botões Next Level ou Previous Level. O host irá consultar estes presets no arranque do sistema ou quando o dispositivo se liga ou volta a ligar ao host. Os predefinidos devem estar dentro do intervalo lógico especificado no relatório de saída da Configuração de Nível. Um valor de sugestão de 0 é válido e indica o estado de retroiluminação desligado como uma pré-definição.

O relatório da funcionalidade Sugestões de Nível é ignorado se o dispositivo não implementar nem o botão de entrada de Nível Próximo nem o de Nível Anterior.

Usos Opcionais
Nome do relatório Description Página ID
Sugestão de Nível de Retroiluminação do Teclado Indica uma predefinição sugerida de nível de brilho que deve ser considerada quando o anfitrião manipula os botões de entrada do Nível Seguinte ou Nível Anterior. 0x07 0x0517

Relatório de Ajuste do Nível de Iluminação do Teclado

Este relatório é opcional. O dispositivo pode optar por implementar este relatório para sinalizar ao anfitrião um nível inicial de brilho sugerido no momento de arranque ou de ligação, por exemplo, se a luz de fundo foi ajustada pelo utilizador antes do arranque do sistema ou da ligação do dispositivo. O host vai consultar este relatório no arranque do sistema operativo ou quando o dispositivo se liga ou se reconecta ao host, podendo opcionalmente substituir este nível sugerido pelo seu próprio valor. Um valor sugerido de 0 é válido e indica que a luz de fundo estava desligada. Se o valor sugerido estiver fora do intervalo lógico do relatório de saída a nível de conjunto, o relatório é ignorado. Um valor sugerido que não corresponda a nenhuma entrada no relatório de funcionalidades de Sugestões de Nível é válido, desde que se enquadre no intervalo lógico.

O intervalo lógico para este relatório deve estar dentro do intervalo lógico para o relatório de saída a nível de conjunto.

Usos Opcionais
Nome do relatório Description Página ID
Definir Nível Informa o anfitrião do nível atual de brilho da luz de fundo como sugestão para o estado inicial do dispositivo nos seus algoritmos de brilho. 0x0C 0x007B

Comportamento do Host com Retroiluminação do Teclado

Escurecimento no modo de poupança de energia

O Windows suporta a diminuição automática da luz de fundo do teclado quando o modo Energy Saver está ativado. Em dispositivos compatíveis, esta funcionalidade pode ser ativada nas DefiniçõesSistemaEnergia & bateriaReduzir o brilho do teclado ao usar economia de energiaou no seguinte atalho: Energia & bateria.

Personalização

Esta funcionalidade pode ser configurada no registo, conforme descrito na tabela abaixo. Por defeito, a funcionalidade aplica um multiplicador de 70% ao brilho da retroiluminação do teclado quando o Energy Saver está ativado.

Chave de registo Name Tipo Unidades
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight EconomizadorDeEnergiaDoIluminadorAtivado REG_DWORD Booleano (1 ou 0)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight BacklightEnergySaverMultiplier REG_DWORD Percentagem (0-100)

A funcionalidade pode também ser configurada usando Windows Unattended Setup ou Runtime Provisioning.

Luminosidade Automática da Retroiluminação do Teclado

Em dispositivos como portáteis com retroiluminação de teclado e um sensor de luz ambiente Ambient light sensor, o Windows suporta o ajuste automático do brilho da retroiluminação do teclado. Esta funcionalidade também é suportada para teclados externos quando estão ligados a dispositivos com sensores de luz ambiente.

O Autobrilho com Retroiluminação do Teclado é distinto do Brilho Adaptativo para ecrãs, mas conceptualmente semelhante na sua implementação.

Em dispositivos compatíveis, esta funcionalidade pode ser ativada nas Definições>Bluetooth & dispositivos>Teclado>Retroiluminação> do tecladoAlterar automaticamente o brilho do teclado quando a iluminação mudar ou no seguinte atalho: Teclado.

Curva de resposta agrupada à luz ambiente

O Autobrilho da Luz de Fundo do Teclado empresta o conceito de uma curva de resposta à luz ambiente (ALR) em cubos, conforme descrito em Brilho adaptativo.

Os mapeamentos de valores padrão entre intervalos de lux e percentagens de brilho da retroiluminação do teclado são mostrados na tabela abaixo. A percentagem do "bucket" refere-se a uma proporção do valor máximo lógico do relatório de saída do "Set Value" e será usada quando o nível de luz ambiente estiver dentro do intervalo do "bucket".

Todos os baldes na curva ALR devem ser contíguos ou sobrepostos — não são permitidos espaços entre baldes. Cada balde deve ter um valor mínimo de lux estritamente inferior ao seu valor máximo de lux. Se a leitura da luz ambiente cair abaixo do mínimo de lux do balde mais baixo, é usada a percentagem do balde mais baixo. Se exceder o máximo de lux do balde mais alto, é usada a percentagem do balde mais alto.

Balde Min Lux Max Lux Percentagem
1 0 6 35
2 5 14 52
3 12 32 70
4 30 45 88
5 40 100 100
6 95 110 88
7 105 160 70
8 155 205 52
9 200 300 0

Quando vários teclados retroiluminados são ligados, a mesma curva ALR é usada para todos os teclados, com as percentagens resultantes aplicadas a cada dispositivo com base na gama lógica de brilho desse dispositivo.

Personalização

Os valores de habilitação de brilho automático e da curva ALR podem ser configurados no registo, como indicado na tabela abaixo. Podem também ser configurados usando Windows Unattended Setup ou Runtime Provisioning.

Chave de registo Name Tipo Unidades
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight EnableBucketedBacklightAutobrilho REG_DWORD Booleano (1 ou 0)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight Luz de fundoAutobrilhoBucketMapping REG_SZ Cadeia composta por um ou mais triplos delimitados por vírgulas na forma <minlux>:<maxlux>:<percentage>. Cada triplo representa um balde na curva ALR. Se a curva ALR personalizada tiver lacunas, zero entradas ou contiver qualquer bucket onde minlux ≥ maxlux, será usada a curva ALR padrão em vez disso.

Anulação manual do Brilho Automático

Se um botão de comando for pressionado enquanto o Autobrilho de Retroiluminação do Teclado estiver ativado, será iniciada uma substituição manual temporária do algoritmo de autobrilho. A substituição gera um único segmento adicional aplicado sobre a curva segmentada, originando-se na leitura atual da luz ambiente, com valores mínimos e máximos de lux gerados a uma determinada distância acima ou abaixo da leitura atual, com base numa percentagem dessa leitura.

Os mapeamentos predefinidos de valores entre intervalos de lux e constantes manuais de substituição são apresentados na tabela abaixo. As entradas na tabela de consulta devem ter intervalos de lux contíguos e não sobrepostos.

Balde Min Lux Max Lux Fator Limite Inferior de Sobreposição Fator Limite de Sobreposição Superior
1 0 20 1,00 1,00
2 20 40 0.70 0.60
3 40 150 0.60 0.60
4 150 600 0,5 0,5
5 600 1000 0.40 0.40
6 1000 4000 0.30 0.25
7 4000 10000 0.20 0.20
8 10000 30000 0.15 0.10
9 30000 100000 0.10 0.10

Para um exemplo de cálculo do intervalo de sobreposição, considere um utilizador a pressionar um botão de entrada quando a leitura mais recente de luz ambiente é de 120 lux. A entrada correspondente na tabela de consulta é o bucket 3, porque 120 lux situa-se entre 40 e 150 lux. O bucket será criado utilizando um limiar inferior de 60% em relação ao valor atual de leitura. Com R=120 e A=0,6, o limiar inferior é 120(1 - 0,6) = 48 lux. O limiar superior é também 60% acima da leitura atual. Novamente, com R=120 e B=0,6, o limiar superior é 120(1 + 0,6) = 192 lux. Assim, o override manual aplica-se enquanto o nível de luz ambiente se mantiver na faixa de [48, 192].

Uma vez ativado, a percentagem de brilho do balde de sobreposição manual é usada até que:

  • a leitura da luz ambiente excede os limites da zona de substituição, momento em que a substituição é cancelada, o intervalo de substituição é eliminado e o controlo de autobrilho retoma usando a curva ALR compartimentada, ou
  • Quando outro pressionar do botão de entrada do dispositivo é recebido, isso solicita ao sistema anfitrião que ajuste a percentagem de brilho e recalcule o intervalo de substituição manual de acordo com a leitura mais recente da luz ambiente.

Personalização

A tabela de consulta manual de sobreposição pode ser configurada no registo, conforme descrito na tabela abaixo. Também pode ser configurado usando Windows Unattended Setup ou Runtime Provisioning.

Chave de registo Name Tipo Unidades
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight Luz de fundoAutobrilhoManualOverrideLut REG_SZ Cadeia composta por um ou mais 4-tuplas delimitadas por vírgulas na forma <minlux>:<maxlux>:<lowerboundfactor>:<upperboundfactor>. Cada 4-tupla representa uma entrada na tabela de consulta. Se a tabela de consulta personalizada tiver lacunas, zero entradas, tiver intervalos sobrepostos ou contiver qualquer intervalo onde minlux ≥ maxlux, a tabela de consulta padrão será utilizada.

Exemplos de Descritores de Relatório HID

Descritor de Retroiluminação de Teclado de Amostra

O descritor a seguir suporta todos os usos obrigatórios e opcionais. Declara suporte para oito botões de entrada de retroiluminação do teclado.

Todos os intervalos lógicos para os relatórios de funcionalidades do Definir Nível e os relatórios de Sugestões de Nível devem enquadrar-se no intervalo lógico do relatório obrigatório de saída do Definir Nível.

0x05, 0x0C,                      // UsagePage(Consumer[0x000C])
0x09, 0x07,                      // UsageId(Keyboard Backlight[0x0007])
0xA1, 0x01,                      // Collection(Application)
0x85, 0x01,                      //     ReportId(1)
0x09, 0x79,                      //     UsageId(Keyboard Brightness Increment[0x0079])
0x09, 0x7A,                      //     UsageId(Keyboard Brightness Decrement[0x007A])
0x09, 0x7C,                      //     UsageId(Keyboard Backlight OOC[0x007C])
0x09, 0x7D,                      //     UsageId(Keyboard Backlight Set Minimum[0x007D])
0x09, 0x7E,                      //     UsageId(Keyboard Backlight Set Maximum[0x007E])
0x09, 0x7F,                      //     UsageId(Keyboard Backlight Auto[0x007F])
0x0A, 0x15, 0x05,                //     UsageId(Keyboard Brightness Next[0x0515])
0x0A, 0x16, 0x05,                //     UsageId(Keyboard Brightness Previous[0x0516])
0x15, 0x00,                      //     LogicalMinimum(0)
0x25, 0x01,                      //     LogicalMaximum(1)
0x95, 0x08,                      //     ReportCount(8)
0x75, 0x01,                      //     ReportSize(1)
0x81, 0x06,                      //     Input(Data, Variable, Relative, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
0x0A, 0x17, 0x05,                //     UsageId(Keyboard Backlight Level Suggestion[0x0517])
0x67, 0xE1, 0x00, 0x00, 0x01,    //     Unit('nits', SiLinear, Centimeter:-2, Candela:1)
0x55, 0x04,                      //     UnitExponent(10,000)
0x26, 0xFF, 0x00,                //     LogicalMaximum(255)
0x95, 0x04,                      //     ReportCount(4)
0x75, 0x08,                      //     ReportSize(8)
0xB1, 0x03,                      //     Feature(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, NonVolatile, BitField)
0x85, 0x02,                      //     ReportId(2)
0x09, 0x7B,                      //     UsageId(Keyboard Backlight Set Level[0x007B])
0x95, 0x01,                      //     ReportCount(1)
0xB1, 0x03,                      //     Feature(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, NonVolatile, BitField)
0x85, 0x01,                      //     ReportId(1)
0x09, 0x7B,                      //     UsageId(Keyboard Backlight Set Level[0x007B])
0x91, 0x02,                      //     Output(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, NonVolatile, BitField)
0xC0,                            // EndCollection()

O descritor acima foi gerado através do seguinte arquivo Waratah :

[[unit]]
name = 'meter'
centimeter = [100.0, 1.0]

[[unit]]
name = 'nits'
candela = [1.0, 1.0]
meter = [1.0, -2.0]

[[usagePage]]
name = 'Consumer'

    [[usagePage.usage]]
    id = 0x07
    name = 'Keyboard Backlight'
    types = ['CA']

    [[usagePage.usage]]
    id = 0x515
    name = 'Keyboard Brightness Next'
    types = ['OSC']

    [[usagePage.usage]]
    id = 0x516
    name = 'Keyboard Brightness Previous'
    types = ['OSC']

    [[usagePage.usage]]
    id = 0x517
    name = 'Keyboard Backlight Level Suggestion'
    types = ['SV']

[[applicationCollection]]
usage = ['Consumer', 'Keyboard Backlight']

    [[applicationCollection.inputReport]]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Brightness Increment']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Brightness Decrement']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight OOC']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Set Minimum']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Set Maximum']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Auto']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Brightness Next']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Brightness Previous']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

    # Keyboard provided brightness level suggestions for host.
    # Here, the device suggests 4 brightness levels, which the host is free to override as it sees fit.
    [[applicationCollection.featureReport]]

        [[applicationCollection.featureReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Level Suggestion']
        sizeInBits = 8
        logicalValueRange = 'maxUnsignedSizeRange'
        unit = 'nits'
        reportFlags = ['constant']
        count = 4

    # Keyboard reports its last used brightness level as a hint to the host during initialization.
    [[applicationCollection.featureReport]]

        [[applicationCollection.featureReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Set Level']
        sizeInBits = 8
        logicalValueRange = 'maxUnsignedSizeRange'
        unit = 'nits'
        reportFlags = ['constant']

    # Host control of the keyboard brightness level.
    # Device has been previously calibrated to understand what LED 'power level' corresponds to emitted nits.
    [[applicationCollection.outputReport]]

        [[applicationCollection.outputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Set Level']
        sizeInBits = 8
        logicalValueRange = 'maxUnsignedSizeRange'
        unit = 'nits'