Comece por aqui: identifique o sintoma
Sintoma | Causa mais provável | Ir para |
|---|---|---|
Nada em 0x5D ou 0x14 na varredura I2C | Controlador sem alimentação, pull-ups ausentes ou o chip mantido em reset | Passo 1 |
Encontrado em 0x14 quando o driver espera 0x5D (ou vice-versa), ou o endereço muda entre inicializações | Nível do pino INT durante o reset | Passo 2 |
Detectado, o product ID é lido corretamente, mas nenhum toque chega | Registrador de status não limpo, borda de interrupção incorreta ou INT não conectado | Passo 3 |
Os toques chegam, mas aparecem no lugar errado, espelhados ou rotacionados | A resolução na configuração do GT911 não corresponde ao painel, ou os eixos precisam ser invertidos | Passo 4 |
Pensando em gravar um novo bloco de configuração | Leia isto primeiro | Passo 5 |
Siga os passos em ordem. Os endereços de registrador e os timings abaixo vêm do driver goodix do Linux, do componente esp_lcd_touch_gt911 da Espressif e da documentação do ESPHome; os links estão na seção Fontes.
1. Confirme que o GT911 está alimentado e respondendo no I2C
Alimentação e pull-ups
O device-tree binding do Linux para controladores Goodix define duas alimentações: AVDD28 (analógica) e VDDIO (trilhas de E/S lógicas). Em um módulo ou FPC, ambas geralmente são alimentadas pelo conector do host, então meça-as no conector antes de suspeitar do firmware. SDA e SCL também precisam de resistores de pull-up em algum ponto do barramento; muitos módulos de display não os incluem.
Faça a varredura do barramento
Execute um sketch de varredura I2C ou o i2cdetect. Um GT911 responde em um de dois endereços de 7 bits:
Endereço de 7 bits | Bytes de escrita/leitura de 8 bits (como algumas datasheets listam) |
|---|---|
| |
| |
Os pares de 8 bits vêm de um comentário no código de reset do driver do Linux. Se uma folha do fornecedor diz "endereço 0xBA", trata-se do mesmo dispositivo que o 0x5D de 7 bits; use 0x5D no Arduino, ESP-IDF e Linux.
Leia o product ID
Os registradores do GT911 usam endereços de 16 bits. O driver do Linux lê 6 bytes a partir de 0x8140: os primeiros 4 bytes são o product ID em texto ASCII e os últimos 2 são a versão do firmware (little-endian). Um GT911 reporta a string 911. Se você obter 911, o barramento, a alimentação e o endereço estão todos corretos e o problema está mais adiante nesta lista.
Se nada responder em nenhum dos endereços, verifique se a linha de reset não está sendo mantida em nível baixo. Em muitos módulos, o RST é uma entrada do GT911 e precisa ser acionado em nível alto pelo host (ou com pull-up na placa) antes que o controlador funcione.
2. Acerte a sequência de reset e seleção de endereço
O GT911 escolhe seu endereço I2C a partir do nível do pino INT no momento em que o reset é liberado. Nas palavras do binding do Linux, a linha INT "é amostrada pelo dispositivo na desassertuação do reset para selecionar o endereço do cliente I2C".
Nível do INT quando o RST vai para alto | Endereço I2C |
|---|---|
Baixo | |
Alto | |
A sequência que o driver Linux utiliza
- Acione RST em nível baixo e aguarde mais de 10 ms (o driver espera 20 ms).
- Acione INT no nível correspondente ao endereço desejado: alto para
0x14, baixo para0x5D. - Aguarde mais de 100 µs.
- Acione RST em nível alto e aguarde mais de 5 ms (o driver espera de 6 a 10 ms).
- Mantenha INT em nível baixo por 50 ms e, em seguida, configure INT como entrada.
Se INT ficar flutuando durante a etapa 4, o endereço pode variar de uma inicialização para outra. Esse é o clássico relato de "funciona após gravar o firmware, falha após um cold boot".
ESP-IDF: esp_lcd_touch_gt911
O componente da Espressif define ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS como 0x5D e ESP_LCD_TOUCH_IO_I2C_GT911_ADDRESS_BACKUP como 0x14. Ele só executa a sequência de seleção de endereço quando todas estas três condições são atendidas:
rst_gpio_numé um GPIO real (nãoGPIO_NUM_NC),int_gpio_numé um GPIO real,driver_dataaponta para uma estruturaesp_lcd_touch_io_gt911_config_tcujodev_addré o endereço desejado.
Caso contrário, ele registra I2C address initialization procedure skipped - using default GT9xx setup e faz um reset simples. Nesse caso, o endereço será o que a fiação da placa determinar, e o endereço I2C do panel-IO que você passar deve corresponder ao resultado da varredura. O clock I2C padrão do componente em ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG() é 100 kHz.
Placas em que o host não controla o INT
Se o INT não estiver conectado ao host, o host não pode escolher o endereço, então faça a varredura nos dois endereços e use aquele que responder. Na Sunton ESP32-8048S043C, por exemplo, a interrupção do GT911 não é conectada a um GPIO por padrão (consulte a página da placa). A página do GT911 do ESPHome observa que, quando o INT passa por um expansor de IO, o pino ainda é usado para definir o endereço na inicialização, mas o toque é feito por polling em vez de por interrupção.
3. Detectado, mas sem eventos de toque
Leia e limpe o registro de status
Os dados de toque começam em 0x814E. O primeiro byte é um byte de status:
- Bit 7 (
0x80): buffer pronto. Novos dados são válidos apenas quando este bit está definido. - Bits 0–3: número de pontos de toque. O driver Linux rejeita contagens acima do máximo configurado.
- Bit 4: uma tecla (botão) está pressionada.
Cada ponto de toque subsequente ocupa 8 bytes: um track ID, seguido de X, Y e tamanho como valores de 16 bits little-endian.
Após a leitura, tanto o driver Linux quanto o esp_lcd_touch_gt911 gravam 0 em 0x814E. Se você escrever seu próprio driver, faça o mesmo; omitir essa gravação é um motivo comum de um driver feito à mão detectar apenas o primeiro toque.
Ajuste a borda da interrupção
O tipo de gatilho está na própria configuração do GT911: bits 0–1 do byte de configuração em 0x804D (offset 6 a partir do início da configuração em 0x8047). O driver Linux faz o mapeamento assim:
Valor | Tipo de interrupção |
|---|---|
0 | Borda de subida |
1 | Borda de descida |
2 | Nível baixo |
3 | Nível alto |
Configure sua interrupção de GPIO para corresponder. Em esp_lcd_touch_gt911, levels.interrupt = 1 seleciona uma interrupção de borda de subida e 0 uma borda de descida.
Sem linha INT? Faça polling
O polling funciona bem para uso em HMI. O ESPHome faz polling a cada 50 ms por padrão (update_interval) quando nenhum interrupt_pin é definido. O driver Linux, quando tem uma interrupção, aguarda até 20 ms pelo bit de pronto antes de desistir de um frame.
4. O toque aparece no lugar errado
Verifique a resolução armazenada no GT911
O GT911 reporta coordenadas na resolução gravada em sua configuração, não na resolução do seu display. Segundo o driver Linux, o X máximo é o valor de 16 bits little-endian em 0x8048 e o Y máximo em 0x804A. Leia esses valores. Se o controlador estiver configurado para 1024×600 e o seu painel for 800×480, os toques aparecerão à direita e abaixo do seu dedo, e as bordas extremas cairão fora da tela. A solução é fazer a escala (ou definir os limites do driver com os valores do controlador).
De onde cada stack obtém os limites:
Stack | Fonte da resolução | Swap e espelhamento |
|---|---|---|
Linux | Lê da configuração do GT911; recorre a 4095 × 4095 quando a configuração não tem nenhum valor | Device-tree |
ESP-IDF | Seu | |
ESPHome | | |
Calibre a partir dos valores brutos
A página de touchscreen do ESPHome sugere registrar touch.x_raw e touch.y_raw em uma lambda on_touch, tocar os cantos nos pixels de borda algumas vezes e inserir os valores brutos mínimo e máximo como calibração. O mesmo método funciona em qualquer plataforma: imprima o X e o Y brutos, toque nos quatro cantos e mapeie a faixa na tela.
Corrija a orientação nesta ordem: primeiro coloque X e Y nos eixos corretos (swap_xy), depois inverta o eixo que estiver ao contrário (mirror_x / mirror_y). O (0, 0) lógico do display deve ser o canto superior esquerdo.
5. Reescrever a configuração do GT911: último recurso
O bloco de configuração começa em 0x8047. No GT911, o driver Linux o trata como 186 bytes:
- Byte 0 (
0x8047): versão da configuração. - Bytes 1–4: resolução X e Y (veja o passo 4).
- Byte 5 (
0x804C): número máximo de pontos de toque, 4 bits baixos. - Byte 6 (
0x804D): tipo de gatilho de interrupção, 2 bits baixos. - Byte 184 (
0x80FF): checksum, o complemento de dois de 8 bits da soma dos bytes 0–183. - Byte 185 (
0x8100):config_fresh, que deve ser1.
O próprio driver Linux só grava uma configuração quando tem tanto os GPIOs INT e RST quanto encontra um arquivo de firmware (nome padrão goodix_911_cfg.bin, ou o nome em uma propriedade goodix,config-name). Sem esse arquivo, ele usa a configuração já armazenada no chip.
Antes de gravar qualquer coisa, leia os 186 bytes e salve-os. Corrija resolução e orientação em software sempre que possível. Um bloco de configuração feito para outro painel touch pode fazer o toque parar de funcionar no seu, por isso obtenha o arquivo do fornecedor do painel se realmente precisar alterá-lo.
Escolhendo um módulo com touch capacitivo
Se você está escolhendo um display CTP para um novo projeto, pergunte três coisas ao fornecedor antes de solicitar amostras: qual controlador de touch ele usa, em qual endereço I2C ele é enviado e se INT e RST chegam ao conector. Envie o tamanho, a interface e o processador host do seu projeto pelo Ask an Engineer, e incluiremos essas três respostas nos módulos que sugerirmos.
Perguntas frequentes
Qual é o endereço I2C do GT911?
0x5D ou 0x14 (7 bits). O controlador amostra o pino INT quando o reset é liberado: INT em nível baixo seleciona 0x5D, INT em nível alto seleciona 0x14. Datasheets que listam 0xBA/0xBB ou 0x28/0x29 estão informando os mesmos endereços como bytes de escrita/leitura de 8 bits.
Por que meu GT911 muda de endereço após uma reinicialização?
INT está flutuando ou sendo acionado por outro circuito quando o reset é liberado, então o controlador amostra um nível diferente a cada vez. Mantenha INT em nível baixo (para 0x5D) ou alto (para 0x14) antes de liberar RST, aguarde mais de 5 ms, mantenha INT em nível baixo por 50 ms e depois configure-o como entrada. Se o host não puder controlar INT, faça uma varredura nos dois endereços.
Por que recebo apenas um toque do GT911?
Após ler os dados de toque em 0x814E, escreva 0 em 0x814E. O driver goodix do Linux e o esp_lcd_touch_gt911 da Espressif fazem isso após cada leitura; um driver que omitir essa etapa geralmente para de detectar novos toques.
Por que as coordenadas de toque do GT911 estão escaladas ou deslocadas?
O GT911 informa as coordenadas na resolução armazenada na sua própria configuração (X em 0x8048, Y em 0x804A). Se ela for diferente da do seu painel, escale os valores ou defina x_max/y_max do seu driver com a resolução do controlador e, em seguida, use swap_xy e mirror_x/mirror_y para a orientação.
O GT911 funciona sem o pino INT?
Sim. Faça polling no registrador de status 0x814E em vez de usar uma interrupção. O ESPHome faz polling a cada 50 ms por padrão quando nenhum interrupt_pin é definido. Sem INT, o host também não consegue escolher o endereço, então use aquele entre 0x5D e 0x14 que responder.
Devo reescrever a configuração do GT911?
Apenas como último recurso. Primeiro leia e salve o bloco existente de 186 bytes a partir de 0x8047, prefira corrigir resolução e orientação em software e use o arquivo de configuração do fornecedor do painel de toque se precisar gravar um. O bloco termina com um checksum de 8 bits em 0x80FF e um byte config_fresh em 0x8100 que deve ser 1.
Fontes
- Kernel Linux: drivers/input/touchscreen/goodix.c
- Kernel Linux: drivers/input/touchscreen/goodix.h (endereços de registradores)
- Kernel Linux: device-tree binding do touchscreen Goodix (goodix.yaml)
- Espressif ESP-BSP: código-fonte do driver esp_lcd_touch_gt911
- Espressif ESP-BSP: header do esp_lcd_touch_gt911 (endereços I2C)
- ESPHome: touchscreen GT911
- ESPHome: componentes de touchscreen (transform, calibration)