Aulas - theedwilk/JoystickRaspberry-HandsOn-DevTitans GitHub Wiki
O que foi desenvolvidos nas aulas
Aula — 24 de Setembro (Quarta‐feira)
- Foi desenvolvido a base do firmware que lê os eixos do joystick e sete botões, detecta mudanças e envia apenas atualizações pela Serial para reduzir ruído. O código usa pinos analógicos para X e Y, digitais com INPUT_PULLUP para botões e só transmite quando um valor muda além do limite. O sistema roda a ~100 Hz e envia mensagens no formato CHAVE:VALOR.
Aula — 26 de Setembro (Sexta‐feira)
- Trabalhamos na montagem física do joystick com ESP32, conectando botões e eixos analógicos conforme o circuito projetado no Fritzing. Em seguida, foi desenvolvido um driver em C que simula a leitura de botões, processa estados via máscaras de bits e organiza a lógica em uma máquina de estados. Isso estabelece a base para futura integração com GPIO real e com o subsistema de entrada do Linux.
Aula — 29 de Setembro (Segunda‐feira)
- O principal objetivo foi desenvolver o firmware ControlJoystick02.ino, trazendo debounce, leitura analógica, geração de D-Pad e envio estruturado dos estados do joystick via Serial. O código lê 7 botões, eixos X/Y e converte o movimento analógico em direções digitais, formando um array completo com 11 valores. Essa versão aprimora o firmware anterior, tornando o joystick mais estável e adequado para integração com o Raspberry Pi.
Aulas — 01 a 08 de Outubro (Quarta-feira a Quarta-feira)
- Criamos o nesjoy-overlay.dts, que mapeia os pinos GPIO do joystick no Device Tree do Linux, e o Makefile, que compila e carrega o módulo do kernel nesjoy_gpiod.ko. Esses arquivos permitem que o sistema reconheça o joystick no boot e associe automaticamente o driver correto. Com isso, o hardware passa a se integrar ao kernel de forma modular, configurável e sem necessidade de recompilar o kernel.
Aulas — 10 a 15 de Outubro (Sexta-feira a Quarta-feira)
- Fizemos a migração do driver para um módulo real de kernel, integrando-se ao subsistema de input do Linux e emitindo eventos oficiais de joystick (EV_KEY/EV_SYN). Também foi aprimorado o firmware do ESP32, agora com leitura modular, debounce, D-Pad analógico e envio estruturado dos estados via Serial. Essa evolução unifica hardware e software, preparando o joystick para uso real no Linux e em jogos/emuladores.
Aulas — 17 a 22 de Outubro (Sexta-feira a Quarta-feira)
- Finalizamos o driver nesjoy_gpiod, que agora lê 11 bits do joystick via GPIO usando o protocolo NES e envia eventos reais ao subsistema de input do Linux. Ele usa uma thread contínua para ler LATCH/CLOCK/DATA e reportar teclas como BTN_A, DPAD, START etc. Com o overlay do Device Tree, o driver é detectado automaticamente no boot e funciona como um joystick completo em /dev/input/eventX.
Aula — 29 de Outubro (Quarta-feira)
- O firmware foi atualizado com novo mapeamento de pinos e dois formatos de saída: uma versão CSV (ControlJoystick02.ino) e outra compacta em 1 byte binário (ControlJoystick02v2.ino). A versão v2 envia 6 botões + eixos X/Y em um único byte, otimizando a comunicação Serial. Também surgiram problemas de compatibilidade ao integrar o driver no AOSP devido a símbolos de kernel e políticas SELinux.
- Tutorial de Compilação do AOSP e Inclusão de Driver na Raspberry Pi
Aula — 31 de Outubro (Sexta-feira)
- O firmware de passou a transmitir uma palavra síncrona de 16 bits via GPIO (TX/CLK/SYNC), substituindo totalmente a antiga saída Serial textual. Cada frame inclui estados de botões e D-Pad, enviados bit a bit conforme a sincronização do driver Linux, que lê os pulsos de clock e gera eventos input. Essa mudança viabiliza a integração direta com o kernel AOSP/Raspberry Pi, alinhando firmware e driver no mesmo protocolo.
Aula — 03 de Novembro (Segunda-feira)
- Na aula foi montado o protótipo completo do joystick no protoboard e testados dois firmwares no ESP32 — a versão bit-banged de 16 bits (02/11) e a versão otimizada por mudança de estado (ControlJoystick02.ino). Também foi testado o módulo de kernel joy_driver_module.c.save, que recebeu os bits via GPIO e gerou eventos EV_KEY confirmados pelo evtest.
Aulas — 05 e 07 de Novembro (Quarta-feira e Sexta-feira)
- Na aula, foi demonstrado o protótipo final: o ESP32 enviando estados do joystick e o driver de kernel recebendo e convertendo em eventos EV_KEY. O evtest confirmou todos os botões e direções, e o Android reconheceu o dispositivo como um gamepad virtual. O vídeo registrado mostra o joystick funcionando em tempo real.
Aulas — 12 e 14 de Novembro (Quarta-feira e Sexta-feira)
-
A compilação cruzada do módulo para ARM64 envolve instalar o compilador aarch64-linux-gnu, baixar e compilar o kernel Linux 6.12.48, e então compilar o módulo ajustando o KDIR para o diretório do kernel. Após gerar o .ko, ele é copiado para o AOSP e incluído na imagem final.
-
Tutorial de Compilação Cruzada do Módulo para ARM64
Aula — 17 de Novembro (Segunda-feira)
- Avançamos a integração completa ESP32 → Driver → AOSP, com o Android reconhecendo o joystick e capturando eventos em jogos. Surgiram problemas no D-Pad analógico devido à ordem dos bits e ruído dos eixos, levando a ajustes no firmware (reordenação dos botões, novo mapeamento do D-Pad e envio somente quando houver mudança). Próximos passos incluem alinhar o mapeamento firmware/driver e recalibrar os eixos analógicos.
Aula — 19 de Novembro (Quarta-feira)
- Nessa aula documentamos como funciona a comunicação elétrica entre o ESP32 e o Raspberry Pi, e como o Android traduz os eventos do driver para eventos de controle de jogo usando arquivos .kl e .idc.
Aula — 21 de Novembro (Sexta-feira)
- Nessa aula realizamos uma análise das principais dificuldades encontradas durante o desenvolvimento do joystick integrado ao AOSP rodando no Raspberry Pi, bem como as soluções adotadas.
Aula — 24 de Novembro (Segunda-feira)
- Nessa aula finalizamos os slides e realizamos a apresentação preliminar interna do projeto. Recebemos feedback sobre a apresentação.