Quando criança, depois do Atari 2600, tive o prazer de jogar o Phantom System, clone do NES, fabricado pela Gradiente (empresa), no Brasil. O gamepad era similar ao do Mega Drive, console que tive logo a seguir. Pra mim, portanto, esse gamepad foi aquele com o qual me adaptei, tendo dificuldades ainda hoje de usar qualquer outro.

Há algumas semanas, comprei um joystick de Mega Drive com 6 botões, ainda fabricado pela Tectoy, no Brasil. Meu interesse era poder usá-lo no computador, através da interface USB. Não encontrei adaptadores no mercado, apesar de existirem adaptadores para o controle do Playstation, por exemplo.

Mas a idéia, certamente, era criar um adaptador usando o Brasuíno, clone de Arduino que fabricamos na Holoscópio.

O Phractal fez o adaptador, que ele apresenta em seu blog, e eu escrevi o "sketch" para o Brasuíno e um programa para ler da serial e gerar eventos que o Linux entenderia como se fosse um joystick.

Para entender o protocolo utilizado pelo controle para se comunicar de forma paralela, usei como fonte o código do driver para Linux usando a porta paralela. No código fonte do Linux, você encontrará o arquivo drivers/input/joystick/db9.c usando o GENESIS6 como gamepad, já que esse é um gamepad de 6 botões.

Depois disso, bastou utilizar os mesmos bits, pinos e timeouts e conseguimos identificar cada botão pressionado e enviar a informação via serial.

Uma das possibilidades era gravar o processador ATMEGA8U2 com um código para ser identificado como um HID (Human Interface Device) por praticamente qualquer sistema operacional moderno que suporte USB. No entanto, ficou como trabalho futuro.

O que foi feito é um programa que lê da interface serial /dev/ttyACM0 os caracteres enviados pelo Brasuíno e os interpreta como eventos de entrada conhecidos pelo Linux. Esses eventos são enviados para o Linux através do /dev/uinput, que permite criar drivers de entrada em userspace. Daí, é só utilizar qualquer jogo que reconheça joysticks.

Uma das dificuldades foi enviar sequências de eventos (pressionar e soltar das teclas) de forma que o supertux funcionasse, além de configurá-lo corretamente. Se quiser usá-lo, experimente trocar os parâmetros de configuração em .supertux/config.

UPDATE: Oops. O código está aqui.