Controle do PS3 no Android

Esse artigo tem como objetivo configurar o controle de seu PlayStation no seu celular com Android. Mas pra quê? Para que você possa desfrutar ao máximo os jogos disponíveis para o seu celular e... usar alguns emuladores.

[ Hits: 27.060 ]

Por: Hudson Moreira Guimaraes dos Santos em 19/09/2011


Compilando o programa de configuração do controle



Chegou a hora de programar um pouco.

Antes disso precisamos instalar as bibliotecas para uso do recurso da "usb", portanto você vai precisar das bibliotecas libusb-dev e libusb-0.1-4. Execute em seu terminal:

sudo apt-get install libusb-dev libusb-0.1-4

Depois da biblioteca instalada, abra um editor de sua preferência e salve o seguinte código:

/*
* sixpair.c version 2007-04-18
* Para compilar use : gcc -o sixpair sixpair.c -lusb
* link de origem desse codigo font https://github.com/otubo/misc/blob/master/sixpair.c
* fiz pocas modificacoes... testado e compilado em uma maquina com Ubuntu 11.04 e kernel 2.6.38-11-generic-pae
*/


#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <usb.h>

#define VENDOR 0x054c
#define PRODUCT 0x0268

#define USB_DIR_IN 0x80
#define USB_DIR_OUT 0

void fatal(char *msg) { perror(msg); exit(1); }

void show_master(usb_dev_handle *devh, int itfnum) {
  printf("Mestre Bluetooth atual: ");
  unsigned char msg[8];
  int res = usb_control_msg
    (devh, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
     0x01, 0x03f5, itfnum, (void*)msg, sizeof(msg), 5000);
  if ( res < 0 ) { perror("USB_REQ_GET_CONFIGURATION"); return; }
  printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
msg[2], msg[3], msg[4], msg[5], msg[6], msg[7]);
}

void set_master(usb_dev_handle *devh, int itfnum, int mac[6]) {
  printf("Configuracao BD_ADDR mestre para %02x:%02x:%02x:%02x:%02x:%02x\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  char msg[8]= { 0x01, 0x00, mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] };
  int res = usb_control_msg
    (devh,
     USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
     0x09,
     0x03f5, itfnum, msg, sizeof(msg),
     5000);
  if ( res < 0 ) fatal("USB_REQ_SET_CONFIGURATION");
}

void process_device(int argc, char **argv, struct usb_device *dev,
    struct usb_config_descriptor *cfg, int itfnum) {
  int mac[6], have_mac=0;

  usb_dev_handle *devh = usb_open(dev);
  if ( ! devh ) fatal("usb_open");

  usb_detach_kernel_driver_np(devh, itfnum);

  int res = usb_claim_interface(devh, itfnum);
  if ( res < 0 ) fatal("usb_claim_interface");

  show_master(devh, itfnum);

  if ( argc >= 2 ) {
    if ( sscanf(argv[1], "%x:%x:%x:%x:%x:%x",
&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]) != 6 ) {

      printf("usage: %s [<bd_addr of master>]\n", argv[0]);
      exit(1);
    }
  } else {
    FILE *f = popen("hcitool dev", "r");
    if ( !f ||
fscanf(f, "%*s\n%*s %x:%x:%x:%x:%x:%x",
&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]) != 6 ) {
      printf("Não eh possivel recuperar BD_ADDR local a partir de `hcitool dev`.\n");
      printf("Por favor ativar o Bluetooth ou especificar um endereco manualmente.\n");
      exit(1);
    }
    pclose(f);
  }
    
  set_master(devh, itfnum, mac);

  usb_close(devh);
}

int main(int argc, char *argv[]) {  

  usb_init();
  if ( usb_find_busses() < 0 ) fatal("usb_find_busses");
  if ( usb_find_devices() < 0 ) fatal("usb_find_devices");
  struct usb_bus *busses = usb_get_busses();
  if ( ! busses ) fatal("usb_get_busses");

  int found = 0;

  struct usb_bus *bus;
  for ( bus=busses; bus; bus=bus->next ) {
    struct usb_device *dev;
    for ( dev=bus->devices; dev; dev=dev->next) {
      struct usb_config_descriptor *cfg;
      for ( cfg = dev->config;
       cfg < dev->config + dev->descriptor.bNumConfigurations;
       ++cfg ) {
   int itfnum;
   for ( itfnum=0; itfnum<cfg->bNumInterfaces; ++itfnum ) {
     struct usb_interface *itf = &cfg->interface[itfnum];
     struct usb_interface_descriptor *alt;
     for ( alt = itf->altsetting;
      alt < itf->altsetting + itf->num_altsetting;
      ++alt ) {
       if ( dev->descriptor.idVendor == VENDOR &&
       dev->descriptor.idProduct == PRODUCT &&
       alt->bInterfaceClass == 3 ) {
         process_device(argc, argv, dev, cfg, itfnum);
         ++found;
       }
     }
   }
      }
    }
  }

  if ( ! found ) printf("Nenhu controle usb encontrado.\n");
  return 0;

}

Por fim, compile:

gcc -o sixpair sixpair.c -lusb

Página anterior     Próxima página

Páginas do artigo
   1. Preparando o celular
   2. Compilando o programa de configuração do controle
   3. Configurando o controle e finalizando
Outros artigos deste autor

Asterisk - Monitorando ligações gravadas através de página em PHP

Leitura recomendada

Diversão e Entretenimento no Linux

Mupen64plus, o melhor emulador de Nintendo 64 disponível para GNU/Linux

Garena no Wine

MSX: os bons tempos estão de volta II

Criando um servidor de Counter Strike 1.6 + AdminMod + MetaMod + StatsMe

  
Comentários
[1] Comentário enviado por levi linux em 19/09/2011 - 12:51h

Muito bom o artigo, principalmente a parte da demonstração.
Só uma pergunta, esse source foi escrito por você?
Parabéns!!!

[2] Comentário enviado por julio_hoffimann em 19/09/2011 - 20:26h

Oi Hudson, parabéns!

Para quem curte jogar, com certeza fica bem melhor com o controle do PS3. Rsrs.

Abraço!

[3] Comentário enviado por hudyfx em 19/09/2011 - 23:44h

ola amigos do Vol, que bom que vo6 gostaram do artigo :)
e respondendo a pergunta do @levi_linux, não foi eu que desenvolvi o código, na verdade existe dezenas de versões desse código espalhadas por ai na net... peguei uma delas e alterei algumas coisas... (maravilhas do software livre rsrsrs)
vc vai encontrar programas similares para outros sistemas operacionais... mas no Linux não tem comparação é muito melhor, um exemplo disso esta no tamanho do executável, o sixpair.c que oriento a compilar tem apenas 12KB de tamanho. Agora... um programa que faz a mesma coisa no windows tem no minimo 10MB quase 10240 vezes maior (fora as dependências monstruosas )...
mais informações no site:
http://www.dancingpixelstudios.com/sixaxiscontroller/instructions.html
falowww

[4] Comentário enviado por levi linux em 20/09/2011 - 11:27h

Muito obrigado pelos esclarecimentos Hudson. Realmente uma das muitas maravilhas do open source.
Vlw!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts