A compilation of code from different sources to provide support for a Playstation 3 controller via bluetooth on the m3pi.
Fork of mbed_TANK_PS3 by
Diff: AutoEvents.cpp
- Revision:
- 1:ae49669c5e92
- Parent:
- 0:44619612f575
diff -r 44619612f575 -r ae49669c5e92 AutoEvents.cpp --- a/AutoEvents.cpp Tue Jul 05 08:25:40 2011 +0000 +++ b/AutoEvents.cpp Sun Dec 30 05:16:28 2012 +0000 @@ -31,70 +31,30 @@ #include "USBHost.h" #include "Utils.h" -#include "ps3.h" +#include "ps3BT.h" #define AUTOEVT(_class,_subclass,_protocol) (((_class) << 16) | ((_subclass) << 8) | _protocol) -#define AUTO_KEYBOARD AUTOEVT(CLASS_HID,1,1) -#define AUTO_MOUSE AUTOEVT(CLASS_HID,1,2) -//#define AUTO_PS3 AUTOEVT(CLASS_HID,0,0) - -u8 auto_mouse[4]; // buttons,dx,dy,scroll -u8 auto_keyboard[8]; // modifiers,reserved,keycode1..keycode6 -u8 auto_joystick[4]; // x,y,buttons,throttle -//u8 auto_ps3[48]; - - - void AutoEventCallback(int device, int endpoint, int status, u8* data, int len, void* userData) { - int evt = (int)userData; - switch (evt) - { - case AUTO_KEYBOARD: - printf("AUTO_KEYBOARD "); - break; - case AUTO_MOUSE: - printf("AUTO_MOUSE "); - break; -// case AUTO_PS3: -// printf("AUTO_PS3 "); -// ParsePs3Report(data,len); -// break; - default: - printf("HUH "); - } - //printfBytes("data",data,len); USBInterruptTransfer(device,endpoint,data,len,AutoEventCallback,userData); } // Establish transfers for interrupt events void AddAutoEvent(int device, InterfaceDescriptor* id, EndpointDescriptor* ed) { - printf("message from endpoint %02X\r\n",ed->bEndpointAddress); - printf("Class Sub Proto: %02X %02X %02X\r\n",id->bInterfaceClass,id->bInterfaceSubClass,id->bInterfaceProtocol); + //printf("message from endpoint %02X\r\n",ed->bEndpointAddress); + //printf("Class Sub Proto: %02X %02X %02X\r\n",id->bInterfaceClass,id->bInterfaceSubClass,id->bInterfaceProtocol); //if ((ed->bmAttributes & 3) != ENDPOINT_INTERRUPT || !(ed->bEndpointAddress & 0x80)) // return; // Make automatic interrupt enpoints for known devices u32 evt = AUTOEVT(id->bInterfaceClass,id->bInterfaceSubClass,id->bInterfaceProtocol); - printf("Evt: %08X \r\n",evt); + //printf("Evt: %08X \r\n",evt); u8* dst = 0; int len; switch (evt) { - case AUTO_MOUSE: - dst = auto_mouse; - len = sizeof(auto_mouse); - break; - case AUTO_KEYBOARD: - dst = auto_keyboard; - len = sizeof(auto_keyboard); - break; -// case AUTO_PS3: -// printf("PS3 event ? \r\n"); -// dst = auto_ps3; -// len = sizeof(auto_ps3); default: printf("Interrupt endpoint %02X %08X\r\n",ed->bEndpointAddress,evt); break; @@ -116,7 +76,7 @@ for (int j = 2; j < le; j += 2) *dst++ = buffer[j]; *dst = 0; - printf("%d:%s\r\n",i,(const char*)buffer); + printf("%d:%s\n",i,(const char*)buffer); } // Walk descriptors and create endpoints for a given device @@ -154,121 +114,13 @@ return 0; } -/* -int StartPS3Event(int device, int configuration, int interfaceNumber) -{ - - printf("StartPS3Event \r\n"); - - EndpointDescriptor* ep; - - u8 buf[4]; - buf[0] = 0x42; - buf[1] = 0x0c; - buf[2] = 0x00; - buf[3] = 0x00; - - u8 buf2[8]; - u8 buf3[8]; - - buf2[0] = 0x01; - buf2[1] = 0x00; - buf2[2] = 0x00; - buf2[3] = 0x02; - buf2[4] = 0x72; - buf2[5] = 0xAD; - buf2[6] = 0xF3; - buf2[7] = 0x5B; - - - - - int result; - int err; - - u8 buffer[255]; - err = GetDescriptor(device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,255); - if (err < 0) - return err; - - - - //configure the device - //err = USBControlTransfer(device, HOST_TO_DEVICE|REQUEST_TYPE_STANDARD|RECIPIENT_DEVICE, SET_CONFIGURATION, 1, 0, 0, 0, 0, 0 ); - err = SetConfiguration(device,1); - printf("set config result = %d\r\n", err); - - // get Mac address - //err = USBControlTransfer(device, HOST_TO_DEVICE|REQUEST_TYPE_CLASS|RECIPIENT_DEVICE, HID_REQUEST_GET_REPORT, 0x03f5, 0, buf3, sizeof(buf3), 0, 0 ); - //printf("get Mac to %02X:%02X:%02X:%02X:%02X:%02X , result = %d\r\n", buf3[2], buf3[3], buf3[4], buf3[5], buf3[6], buf3[7], err); - - // set Mac address - err = USBControlTransfer(device, HOST_TO_DEVICE|REQUEST_TYPE_CLASS|RECIPIENT_INTERFACE, HID_REQUEST_SET_REPORT, 0x03f5, 0, buf2, sizeof(buf2), 0, 0 ); - printf("set Mac to %02X:%02X:%02X:%02X:%02X:%02X , result = %d\r\n", buf2[2], buf2[3], buf2[4], buf2[5], buf2[6], buf2[7], err); - - // get Mac address - //err = USBControlTransfer(device, HOST_TO_DEVICE|REQUEST_TYPE_CLASS|RECIPIENT_DEVICE, HID_REQUEST_GET_REPORT, 0x03f5, 0, buf3, sizeof(buf3), 0, 0 ); - //printf("get Mac to %02X:%02X:%02X:%02X:%02X:%02X , result = %d\r\n", buf3[2], buf3[3], buf3[4], buf3[5], buf3[6], buf3[7], err); - - err = USBControlTransfer(device, HOST_TO_DEVICE|REQUEST_TYPE_CLASS|RECIPIENT_INTERFACE, HID_REQUEST_SET_REPORT, 0x03f4,0, buf, sizeof(buf), 0, 0 ); - printf("set report result = %d\r\n", err); - //USBTransfer(device,0,DEVICE_TO_HOST,buf,sizeof(buf),0,0); - - int len = buffer[2] | (buffer[3] << 8); - u8* d = buffer; - u8* end = d + len; - while (d < end) - { - if (d[1] == DESCRIPTOR_TYPE_INTERFACE) - { - InterfaceDescriptor* id = (InterfaceDescriptor*)d; - if (id->bInterfaceNumber == interfaceNumber) - { - d += d[0]; - while (d < end && d[1] != DESCRIPTOR_TYPE_INTERFACE) - { - if (d[1] == DESCRIPTOR_TYPE_ENDPOINT) - ep = (EndpointDescriptor*)d; - - if (ep->bEndpointAddress == 0x02) { - printf("PS3 input endpoint (0x02) found\r\n"); - - } - if (ep->bEndpointAddress == 0x81) { - printf("PS3 output endpoint (0x81) found\r\n"); - AddAutoEvent(device,id,(EndpointDescriptor*)d); - } - d += d[0]; - } - } - } - d += d[0]; - } - return 0; -} -*/ - -// Implemented in main.cpp -int OnDiskInsert(int device); - -// Implemented in TestShell.cpp +// Implemented in BTRuntime.cpp int OnBluetoothInsert(int device); void OnLoadDevice(int device, DeviceDescriptor* deviceDesc, InterfaceDescriptor* interfaceDesc) { printf("LoadDevice %d %02X:%02X:%02X\r\n",device,interfaceDesc->bInterfaceClass,interfaceDesc->bInterfaceSubClass,interfaceDesc->bInterfaceProtocol); char s[128]; - u8 my_mac[6] = {0x00, 0x1B, 0xDC, 0x04, 0xDA, 0xF0}; // mac address of my Bluetooth device - - u8 buf2[6]; - - buf2[0] = 0x00; - buf2[1] = 0x1E; - buf2[2] = 0x35; - buf2[3] = 0x2E; - buf2[4] = 0xD5; - buf2[5] = 0x1D; - for (int i = 1; i < 3; i++) { @@ -279,33 +131,12 @@ switch (interfaceDesc->bInterfaceClass) { - case CLASS_MASS_STORAGE: - if (interfaceDesc->bInterfaceSubClass == 0x06 && interfaceDesc->bInterfaceProtocol == 0x50) - OnDiskInsert(device); // it's SCSI! - break; case CLASS_WIRELESS_CONTROLLER: if (interfaceDesc->bInterfaceSubClass == 0x01 && interfaceDesc->bInterfaceProtocol == 0x01) OnBluetoothInsert(device); // it's bluetooth! break; - case CLASS_HID: - printf("idVendor = %04X idProduct = %04X \r\n",deviceDesc->idVendor,deviceDesc->idProduct); - //printf("device = %d configuration = %d interfaceNumber = %d\r\n", device, configuration, interfaceNumber); - //if (deviceDesc->idVendor == 0x054C && deviceDesc->idProduct == 0x0268) StartPS3Event(device,1,0); - if (deviceDesc->idVendor == 0x054C && deviceDesc->idProduct == 0x0268) { - Ps3USB _Ps3USB(device,1,0); - - _Ps3USB.SetPair(my_mac); - _Ps3USB.Enable(); - _Ps3USB.Led(1); - _Ps3USB.Rumble(0x20,0xff,0x20,0xff); - _Ps3USB.ShowPair(); - - } - else StartAutoEvent(device,1,0); - break; default: - printf("Not yet supported \r\n"); - //StartAutoEvent(device,1,0); + StartAutoEvent(device,1,0); break; } } \ No newline at end of file