Esta página em:

Fazendo meu tapete de dança funcionar

Adiel Mittmann
2012-03-18 20:26

Pule direto para o patch.

Aqui descrevo minha frustração com umas peças baratas que comprei e como fiz para dar um jeito em seus problemas alterando o código do Linux.

O que eu fiz foi programar o Linux para transformar o que meu tapete de dança enviava ao computador por um adaptador USB em algo compreensível pelo Stepmania.

Os tapetes de dança

A caixa do meu primeiro tapete de dança.
A caixa do meu primeiro tapete de dança.

A primeira vez que comprei um tapete de dança foi em 2006. Eu me surpreendi quando não tive de configurar nada ou ficar mexendo com drivers. O Stepmania reconheceu meu tapete e tudo estava funcionando muito bem.

O que eu não sabia naquela época é que aquilo tinha sido uma feliz coincidência. Um dia conectei o tapete a outro computador... não funcionou. Na verdade até funcionou, mas ficava desconectando a cada pouco, o que me impedia de terminar uma música sem ter que reiniciar o Stepmania. Sempre o Linux pensava que ele tinha sido desconectado e reconectado.

Já que eu pelo menos ainda conseguia jogar DDR no meu computador, simplesmente ignorei a questão. Mas eu dia tive de comprar uma placa-mãe nova, e o tapete começou a ser desconectado também no meu computador. Tentei usar o tapete de um amigo, muito similar (mas não igual) ao meu. Percebi que o dele funcionava no meu computador. Eu pensei em comprar o mesmo tapete de dança que ele tinha, e foi o que eu fiz. Para minha surpresa, o meu tapete novo, igualzinho ao do meu amigo, não funcionava no meu sistema. A única diferença entre o tapete dele e o meu é que o dele funcionava no meu computador, e o meu próprio tapete não.

Meu segundo tapete de dança.
Meu segundo tapete de dança.

Já que o tapete dele estava em boas condições, fizemos uma troca. Eu fiquei um tapete velho, mas que funcionava. Também dei-lhe meu primeiro tapete, que também não funcionava na minha placa-mãe nova. Parece que todos tapetes funcionam com ele porque ele os usa no PlayStation.

Tudo correu bem até eu comprar um computador novo. Agora, nenhum dos três tapetes funcionavam no meu sistema! Os tapetes disponíveis na minha cidade são muito parecido com eles, então não faz muito sentido comprar mais um tapete.

O adaptador USB

Meu adaptador de PS/2 para USB.
Meu adaptador de PS/2 para USB.

Como o problema com os tapetes era provavelmente alguma incompatibilidade (as placas-mãe não conseguiam conversar com aqueles tapetes toscos), pensei em comprar um adaptador de PS/2 para USB. Apesar de a página do Stepmania listar muitos adaptadores como incompatíveis, decidi dar um chance, e fui em busca de adaptadores por aqui. Fiquei maravilhado quando encontrei um (o Pu120T) que dizia: “...também o tapete de dança.” Meus problemas acabaram, certo?

Errado! O adaptador sofria do problema dos eixos (já falo mais sobre isso), e por causa disso o Stepmania nunca recebia eventos como quando se aperta esquerda e direita eu para cima e para baixo ao mesmo tempo. Até tentei instalar o driver que veio num CDzinho no Windows, mas não adiantou. Parece que é simplesmente mentira dizer que o adaptador Pu120T funciona com tapetes de dança. Talvez com alguns, mas não todos.

Qual é o problema?

Não conheço muito de USB, mas parece que o problema com o tapete de dança é que ele não consegue se comunicar direito com várias placas-mãe. Não acho que o problema seja com o computador, pois eles funcionam com qualquer outro tipo de dispositivo USB, e também porque a qualidade dos tapetes que comprei era claramente baixa.

Percebi que no Windows o problema era um pouco diferente. No Windows, o tapete não se desconectava; ao invés disso, para de funcionar por um ou dois segundos (o que é obviamente inadmissível). Depois consegui modificar o Linux e obter o mesmo resultado, o que mais uma vez mostra que o problema está nos tapetes, não no computador.

O problema dos eixos, do qual meu adaptador USB sofre, está relacionado com os eixos (X e Y) de um joystick. Parece que alguém considerou estúpido alguém apertar esquerda e direita ao mesmo tempo em um joystick. De fato, em alguns joysticks isso é impossível. Mas para jogar DDR, isso é absolutamente necessário.

Toda vez que uma flecha é pressionada no meu tapete de dança, ele envia dois eventos: um indicando que um botão comum foi pressionado e outro que uma flecha (de um dos eixos) foi pressionada. Quando toda essa informação chega ao Stepmania, ele sabiamente escolhe interpretar somente os eventos de botão, ignorando os eventos dos eixos. Até aí, tudo bem. Mas o que meu adaptador USB faz é filtrar os eventos, deixando só os eventos dos eixos passarem! Isso é desastroso e me impede de jogar DDR.

Resolvendo o problema

Usando o input-utils, descobri que, apesar de só os eventos dos eixos estarem passando, havia lá informação suficiente para saber tudo que estava acontecendo no tapete, ou seja, era possível saber quais botões estavam pressionados em qualquer momento. Deparei-me com alguns comentários sobre modificar o arquivo joydev.c do Linux (aqui, aqui e aqui), mas alguns desses patches não estavam disponíveis para baixar e outros não funcionaram.

Eu então sabia que teria de escrever minha própria gambiarra. E foi o que eu fiz. Usando o input-utils, consegui entender que informação era enviada para cada ação no tapete. Com isso, pude reescrever a função joydev_event, de maneira que ela agora interpreta as coisas corretamente. Usei algumas linhas de um outro patch para fazer minha gambiarra.

Caso não funcione, confira se o Stepmania está de fato usando os arquivos /dev/input/js*, e não os /dev/input/event*. Você pode usar o comando lsof para ver qual daqueles ele está usando. Se estiver usando /dev/input/event*, você pode, por exemplo, remover esses arquivos, forçando o Stepmania a usar os certos, ou então mudar o código-fonte do Stepmania. Se não souber como, entre em contato.

O arquivo de patch

Esse remendo resolve o problema dos eixos para a configuração descrita acima (um ou dois tapetes para PlayStation conectados através de um conversor de PS/2 para USB.)

A última versão (1.2) do remendo está disponível para as seguintes versões do Linux. Se a sua versão não é exatamente a mesma, tente mesmo assim; normalmente o mesmo remendo funciona para muitas versões diferentes do Linux.

Depois de aplicar o remendo, edite o arquivo drivers/input/joydev.c para especificar quais são os códigos de fabricante e de produto do seu adaptador. As linhas relevantes são as seguintes:

#define DANCEPAD_VENDOR  0x0810
#define DANCEPAD_PRODUCT 0x0001

Você pode usar o lsusb para descobrir quais são os seus códigos:

# lsusb | grep PSX
Bus 006 Device 043: ID 0810:0001 Personal Communication Systems, Inc. Dual PSX Adaptor

Versões antigas

Uma versão mais antiga (1.1) também está disponível. Essa versão suporta dois tapetes, mas os joysticks param de funcionar.

Conclusões

Eu sinceramente compraria um tapete de dança melhor, se eu conseguisse encontrar um por aqui. Os problemas que eu descrevi mostram o quão mal esses dispositivos foram planejados e testados.

O arquivo de patch que eu disponibilizei aqui é bem experimental e haveria um certo trabalho para transformá-lo em algo acessível para a maioria dos usuários.

É importante notar que apesar de estarmos alterando o código do Linux, isso de jeito nenhum significa que o problema está no Linux. Estamos apenas aproveitando o fato de o Linux ser open source para escrever uma gambiarra.

Agradecimentos

Gostaria de agradecer o Jozer Riha, que me ajudou a testar a versão 1.2 do remendo.