Aula — 17 de Novembro (Segunda feira) - theedwilk/JoystickRaspberry-HandsOn-DevTitans GitHub Wiki

Integração Final, Testes e Ajustes do Firmware + Driver

Nesta aula avançamos de forma significativa na integração entre o firmware do ESP32, o driver de kernel Linux e o AOSP rodando no Raspberry Pi 4B.


Principais Conquistas do Dia

  1. Driver carregado com sucesso no AOSP

O módulo nesjoy.ko foi finalmente instalado no Android e registrado pelo InputFlinger. O Android reconheceu o joystick como um gamepad nativo.

  1. Aplicativo Android recebendo inputs

Rodamos um jogo no AOSP e os botões do controle funcionaram corretamente, confirmando toda a cadeia:

ESP32 → GPIOs → Driver Kernel → Input Subsystem → InputFlinger → App Android

Problemas Identificados

  1. Analógico não funciona no Android (D-Pad analógico)

O driver recebe o pacote de 16 bits, mas os bits referentes ao eixo analógico não são interpretados corretamente.

Possíveis causas identificadas:

  • Ordem dos bits pode não coincidir com a ordem esperada pelo driver.

  • Bits do eixo podem não estar sendo montados corretamente no dataToWrite.

  • Mapeamento no driver pode estar diferente do firmware atual.

  1. Analógico gera lixo mesmo parado

Mesmo estando em posição neutra, o ESP32 continua enviando valores que disparam DOWN/LEFT/RIGHT/UP irregularmente.

Hipóteses:

  • Ruído nos ADCs do ESP32.

  • Centro dos eixos pode estar descalibrado.

  • AXIS_THRESHOLD está pequeno demais.

  • Conversão dos eixos foi invertida para adequar o jogo (veja o novo mapeamento).


Alterações realizadas no Firmware (17/11)

  1. Reordenação dos botões

Foi modificada a ordem do array buttons[]:

Button buttons[] = {
  {"RIGHT", PIN_RIGHT, false, HIGH, HIGH, 0},
  {"DOWN",  PIN_DOWN,  false, HIGH, HIGH, 0},
  {"UP",    PIN_UP,    false, HIGH, HIGH, 0},
  {"LEFT",  PIN_LEFT,  false, HIGH, HIGH, 0},
  {"SELECT",PIN_SELECT,true,  HIGH, HIGH, 0},
  {"START", PIN_START, true,  HIGH, HIGH, 0},
};

Essa ordem influencia diretamente o bit que cada botão ocupa em dataToWrite.

  1. Remoção temporária do botão ANALOG

O botão ANALOG estava causando conflitos e foi comentado.

  1. Novo mapeamento do D-Pad analógico

A ordem agora está assim:

dpadStates[0] = down_active;
dpadStates[1] = right_active;
dpadStates[2] = up_active;
dpadStates[3] = left_active;
  1. Enviar dados apenas quando houver mudança

Foi adicionada uma lógica para evitar enviar pacotes redundantes:

static uint16_t lastSent = 0;

if (lastSent != dataToWrite) {
    lastSent = dataToWrite;
    write_2_bytes(dataToWrite);
}

Isso ajuda muito:

  • reduz ruído no CLK,

  • diminui carga no driver,

  • facilita debugging no kernel.


Próximas Ações

1.Validar se o driver Linux interpreta os bits na mesma ordem que o firmware envia

  • Conferir máscaras (MASK_UP, MASK_DOWN, etc.)

  • Ajustar ordenação dos bits 0..9 para coincidir com o driver.

2.Recalibrar o analógico

  • Ajustar AXIS_CENTER_VAL_X/Y

  • Testar thresholds maiores (ex: 400 ou 450)

  • Considerar filtragem (média móvel)

  1. Revisar o PR do Jefferson e comparar com o código enviado à main

Foi identificado que:

  • PR e modificações locais alteram as mesmas áreas

  • Possível conflito de abordagem


Evidências

https://github.com/user-attachments/assets/e9139741-1885-480f-b321-ffec92f803e6