Advertisement
xerpi

wii ps3 bt

Jan 16th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <gccore.h>
  6. #include <wiiuse/wpad.h>
  7. #include <bte/bte.h>
  8. #include <bte/bd_addr.h>
  9. #include "l2cap.h"
  10. #include "btpbuf.h"
  11. #include "hci.h"
  12.  
  13. /* MAC1: 00:06:F7:4F:97:5C */
  14. /* MAC2: 00:24:33:63:4B:6B */
  15.  
  16.  
  17. int run = 1;
  18. void *xfb = NULL;
  19. err_t err;
  20. GXRModeObj *rmode = NULL;
  21. void init_video();
  22. void print_mac(uint8_t *mac);
  23. void WiiPowerPressed();
  24. /*err_t l2cap_connect_ind(struct l2cap_pcb *npcb,
  25.                          struct bd_addr *bdaddr,
  26.                          u16_t psm,
  27.                          err_t (* l2ca_connect_ind)(void *arg, struct l2cap_pcb *pcb, err_t err))
  28. */
  29. err_t l2ca_connect_ind_ctrl(void *arg, struct l2cap_pcb *pcb, err_t err);
  30. err_t l2ca_connect_ind_data(void *arg, struct l2cap_pcb *pcb, err_t err);
  31. err_t l2ca_recv_ctrl(void *arg, struct l2cap_pcb *pcb, struct pbuf *p, err_t err);
  32. err_t l2ca_recv_data(void *arg, struct l2cap_pcb *pcb, struct pbuf *p, err_t err);
  33. err_t l2ca_disconnect_ind_ctrl(void *arg, struct l2cap_pcb *newpcb, err_t err);
  34. err_t l2ca_disconnect_ind_data(void *arg, struct l2cap_pcb *newpcb, err_t err);
  35. s32 read_local_addr_cb(s32 result,void *userdata);
  36. struct l2cap_pcb *l2cap_ctrl, *l2cap_data;
  37. struct bd_addr ps3_bdaddr = {.addr = {0x6B, 0x4B, 0x63, 0x33, 0x24, 0x00}};
  38.  
  39.  
  40.  
  41. int main(int argc, char **argv)
  42. {
  43.     SYS_SetPowerCallback(WiiPowerPressed);
  44.     iosCreateHeap(4096);
  45.     //l2cap_init();
  46.     //l2cap_reset_all();
  47.     //BTE_Init();
  48.     WPAD_Init();
  49.     init_video();
  50.     usleep(100*1000);
  51.     printf("ps3 controller to Wii:\n");
  52.  
  53.  
  54.     /// Trying with l2cap_connect_ind
  55.  
  56.     if((l2cap_ctrl = l2cap_new()) == NULL) {
  57.         printf("error creating l2cap_ctrl\n");
  58.     } else {
  59.         l2cap_arg(l2cap_ctrl, &ps3_bdaddr);
  60.         err_t err = l2cap_connect_ind(l2cap_ctrl, &ps3_bdaddr, HIDP_CONTROL_CHANNEL, l2ca_connect_ind_ctrl);
  61.         if (err == ERR_OK) {
  62.             printf("connect l2cap_ctrl done\n");  
  63.         } else {
  64.             l2cap_close(l2cap_ctrl);
  65.             printf("error connect l2cap_ctrl");
  66.         }
  67.     }
  68.    
  69.     if((l2cap_data = l2cap_new()) == NULL) {
  70.         printf("error creating l2cap_data\n");
  71.     } else {
  72.         l2cap_arg(l2cap_data, &ps3_bdaddr);
  73.         //l2cap_recv(l2cap_data, l2ca_recv_data);
  74.         //l2cap_disconnect_ind(l2cap_data, l2ca_disconnect_ind_data);
  75.         err_t err = l2cap_connect_ind(l2cap_data, &ps3_bdaddr, HIDP_DATA_CHANNEL, l2ca_connect_ind_data);
  76.         if (err == ERR_OK) {
  77.             printf("connect l2cap_data done\n");  
  78.         } else {
  79.             l2cap_close(l2cap_data);
  80.             printf("error connect l2cap_data");
  81.         }
  82.     }
  83.    
  84.     printf("main\n");
  85.     while(run) {
  86.         WPAD_ScanPads();
  87.         u32 pressed = WPAD_ButtonsDown(0);
  88.         if (pressed & WPAD_BUTTON_A) {
  89.        
  90.         }
  91.         if (pressed & WPAD_BUTTON_HOME) run = 0;
  92.         usleep(10*1000);
  93.         VIDEO_WaitVSync();
  94.     }
  95.     printf("\nexiting...");
  96.     exit(0);
  97.     return 0;
  98. }
  99.  
  100. err_t l2ca_connect_ind_ctrl(void *arg, struct l2cap_pcb *pcb, err_t err)
  101. {
  102.     printf("CTRL incoming connection:\n");
  103.     if (arg == NULL) {
  104.         printf("NULL arg\n");
  105.         return -3;
  106.     }
  107.     struct bd_addr *bdaddr = (struct bd_addr *)arg;
  108.     unsigned char enable[] ATTRIBUTE_ALIGN(32) = {
  109.         0x53, /* HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_FEATURE */
  110.         0xf4, 0x42, 0x03, 0x00, 0x00 };
  111.        
  112.     unsigned char setleds[] ATTRIBUTE_ALIGN(32) = {
  113.         0x52, /* HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_OUTPUT */
  114.         0x01,
  115.         0x00, 0x00, 0x00, 0x00, 0x00,
  116.         0x00, 0x00, 0x00, 0x00, 0x1E,
  117.         0xff, 0x27, 0x10, 0x00, 0x32,
  118.         0xff, 0x27, 0x10, 0x00, 0x32,
  119.         0xff, 0x27, 0x10, 0x00, 0x32,
  120.         0xff, 0x27, 0x10, 0x00, 0x32,
  121.         0x00, 0x00, 0x00, 0x00, 0x00,
  122.     };
  123.     const unsigned char ledpattern[7] ATTRIBUTE_ALIGN(32) = {
  124.         0x02, 0x04, 0x08, 0x10,
  125.         0x12, 0x14, 0x18 };
  126.  
  127.     l2cap_recv(l2cap_ctrl, l2ca_recv_ctrl);
  128.     l2cap_disconnect_ind(l2cap_ctrl, l2ca_disconnect_ind_ctrl);
  129.  
  130.     struct pbuf *p_enable = btpbuf_alloc(PBUF_RAW, sizeof(enable), PBUF_RAM);
  131.     memcpy(p_enable->payload, enable, sizeof(enable));
  132.     int i;
  133.     for (i = 0; i< sizeof(enable); ++i) {
  134.         printf(", 0x%X", ((unsigned char*)p_enable->payload)[i]);  
  135.     }
  136.    // err_t e = l2ca_datawrite(pcb, p_enable);
  137.     l2cap_write(bdaddr,p_enable,sizeof(enable));
  138.     //printf("\ndatawrite returned: %d\n", e);
  139.     btpbuf_free(p_enable);
  140.    
  141.    
  142.    
  143.     struct pbuf *p_setleds = btpbuf_alloc(PBUF_RAW, sizeof(setleds), PBUF_RAM);
  144.     setleds[11] = ledpattern[1];
  145.     memcpy(p_setleds->payload, setleds, sizeof(setleds));
  146.     //l2ca_datawrite(pcb, p_setleds);
  147.     l2cap_write(bdaddr, p_setleds,sizeof(setleds));
  148.    
  149.     btpbuf_free(p_setleds);
  150.     printf("sent stuff\n");
  151. /*
  152.     // enable reporting
  153.     send(client[i].ctrl, enable, sizeof(enable), 0);
  154.     recv(client[i].ctrl, buf, sizeof(buf), 0);
  155.  
  156.     //set LEDs
  157.     if (i < 7)
  158.         setleds[11] = ledpattern[i];
  159.     send(client[i].ctrl, setleds, sizeof(setleds), 0);
  160.     recv(client[i].ctrl, buf, sizeof(buf), 0);
  161. */
  162.     return 1;
  163. }
  164.  
  165. err_t l2ca_connect_ind_data(void *arg, struct l2cap_pcb *pcb, err_t err)
  166. {
  167.     printf("DATA incoming connection:\n");
  168.    
  169.     return 1;
  170. }
  171.  
  172.  
  173. err_t l2ca_recv_ctrl(void *arg, struct l2cap_pcb *pcb, struct pbuf *p, err_t err)
  174. {
  175.     printf("CTRL data received!:\n");
  176.    
  177.     return 1;
  178. }
  179.  
  180. err_t l2ca_recv_data(void *arg, struct l2cap_pcb *pcb, struct pbuf *p, err_t err)
  181. {
  182.     printf("DATA data received!:\n");
  183.    
  184.     return 1;
  185. }
  186.  
  187. err_t l2ca_disconnect_ind_ctrl(void *arg, struct l2cap_pcb *newpcb, err_t err)
  188. {
  189.     printf("DISCONNECT CTRL!\n");
  190.    
  191.     return 1;
  192. }
  193.  
  194. err_t l2ca_disconnect_ind_data(void *arg, struct l2cap_pcb *newpcb, err_t err)
  195. {
  196.     printf("DISCONNECT DATA!\n");
  197.    
  198.     return 1;
  199. }
  200.  
  201. void print_mac(uint8_t *mac)
  202. {
  203.     printf("%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  204. }
  205.  
  206. void WiiPowerPressed()
  207. {
  208.     run = 0;  
  209. }
  210.  
  211. void init_video()
  212. {
  213.     VIDEO_Init();
  214.     rmode = VIDEO_GetPreferredMode(NULL);
  215.     xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
  216.     console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
  217.     VIDEO_Configure(rmode);
  218.     VIDEO_SetNextFramebuffer(xfb);
  219.     VIDEO_SetBlack(FALSE);
  220.     VIDEO_Flush();
  221.     VIDEO_WaitVSync();
  222.     if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
  223.     printf("\x1b[2;0H");
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement