Pular para o conteúdo

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.
Hudson Moreira Guimaraes dos Santos hudyfx
Hits: 30.334 Categoria: Linux Subcategoria: Jogos
  • Indicar
  • Impressora
  • Denunciar

Parte 2: 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

   1. Preparando o celular
   2. Compilando o programa de configuração do controle
   3. Configurando o controle e finalizando

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

DOOM clássico (quase) vanilla e um pouco melhorado

Usando Wine com desempenho máximo para jogos

Instalar Minecraft, League of Legends e Fortnite no Linux

Jogos no Linux

Rodando Ragnarok (bro) no Linux

#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

Entre na sua conta para comentar.