A usb interface emulating an Xbox 360 controller
Support for rumble is not done yet.
Please note this is work in progress.
tested so far with LPC1769 and LPC11u35
Xinput.cpp@0:430276835afe, 2016-09-16 (annotated)
- Committer:
- olyeah
- Date:
- Fri Sep 16 10:01:59 2016 +0000
- Revision:
- 0:430276835afe
initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
olyeah | 0:430276835afe | 1 | |
olyeah | 0:430276835afe | 2 | |
olyeah | 0:430276835afe | 3 | #include <Xinput.h> |
olyeah | 0:430276835afe | 4 | |
olyeah | 0:430276835afe | 5 | |
olyeah | 0:430276835afe | 6 | |
olyeah | 0:430276835afe | 7 | Xinput::~Xinput() { |
olyeah | 0:430276835afe | 8 | // TODO Auto-generated destructor stub |
olyeah | 0:430276835afe | 9 | } |
olyeah | 0:430276835afe | 10 | |
olyeah | 0:430276835afe | 11 | void Xinput::send_controls(void){ |
olyeah | 0:430276835afe | 12 | uint8_t TXData[20] = {0x00, // must be 0x00 |
olyeah | 0:430276835afe | 13 | 0x14, // must be 0x14 |
olyeah | 0:430276835afe | 14 | LSB(buttons), |
olyeah | 0:430276835afe | 15 | MSB(buttons), |
olyeah | 0:430276835afe | 16 | left_trigger, |
olyeah | 0:430276835afe | 17 | right_trigger, |
olyeah | 0:430276835afe | 18 | LSB(left_stick_x), |
olyeah | 0:430276835afe | 19 | MSB(left_stick_x), |
olyeah | 0:430276835afe | 20 | LSB(left_stick_y), |
olyeah | 0:430276835afe | 21 | MSB(left_stick_y), |
olyeah | 0:430276835afe | 22 | LSB(right_stick_x), |
olyeah | 0:430276835afe | 23 | MSB(right_stick_x), |
olyeah | 0:430276835afe | 24 | LSB(right_stick_y), |
olyeah | 0:430276835afe | 25 | MSB(right_stick_y), |
olyeah | 0:430276835afe | 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
olyeah | 0:430276835afe | 27 | USBDevice::write(XINPUT_TX_ENDPOINT, TXData, 20, 20); |
olyeah | 0:430276835afe | 28 | } |
olyeah | 0:430276835afe | 29 | |
olyeah | 0:430276835afe | 30 | void Xinput::update_button(uint8_t button, uint8_t status){ |
olyeah | 0:430276835afe | 31 | if(status){ |
olyeah | 0:430276835afe | 32 | buttons |= 1UL << button; |
olyeah | 0:430276835afe | 33 | } |
olyeah | 0:430276835afe | 34 | /*else{ |
olyeah | 0:430276835afe | 35 | buttons &= ~(1UL << button); |
olyeah | 0:430276835afe | 36 | }*/ |
olyeah | 0:430276835afe | 37 | } |
olyeah | 0:430276835afe | 38 | |
olyeah | 0:430276835afe | 39 | void Xinput::clear(void){ |
olyeah | 0:430276835afe | 40 | buttons = 0; |
olyeah | 0:430276835afe | 41 | left_stick_x = 0; |
olyeah | 0:430276835afe | 42 | left_stick_y = 0; |
olyeah | 0:430276835afe | 43 | left_trigger = 0; |
olyeah | 0:430276835afe | 44 | right_stick_x = 0; |
olyeah | 0:430276835afe | 45 | right_stick_y = 0; |
olyeah | 0:430276835afe | 46 | right_trigger = 0; |
olyeah | 0:430276835afe | 47 | } |
olyeah | 0:430276835afe | 48 | |
olyeah | 0:430276835afe | 49 | void Xinput::update_analog(uint8_t stick, int16_t value){ |
olyeah | 0:430276835afe | 50 | switch(stick){ |
olyeah | 0:430276835afe | 51 | case STICK_LEFT_X: |
olyeah | 0:430276835afe | 52 | left_stick_x = value; |
olyeah | 0:430276835afe | 53 | break; |
olyeah | 0:430276835afe | 54 | case STICK_LEFT_Y: |
olyeah | 0:430276835afe | 55 | left_stick_y = value; |
olyeah | 0:430276835afe | 56 | break; |
olyeah | 0:430276835afe | 57 | case STICK_RIGHT_X: |
olyeah | 0:430276835afe | 58 | right_stick_x = value; |
olyeah | 0:430276835afe | 59 | break; |
olyeah | 0:430276835afe | 60 | case STICK_RIGHT_Y: |
olyeah | 0:430276835afe | 61 | right_stick_y = value; |
olyeah | 0:430276835afe | 62 | break; |
olyeah | 0:430276835afe | 63 | default: |
olyeah | 0:430276835afe | 64 | break; |
olyeah | 0:430276835afe | 65 | } |
olyeah | 0:430276835afe | 66 | } |
olyeah | 0:430276835afe | 67 | |
olyeah | 0:430276835afe | 68 | void Xinput::update_analog(uint8_t stick, uint8_t value){ |
olyeah | 0:430276835afe | 69 | switch(stick){ |
olyeah | 0:430276835afe | 70 | case TRIGGER_LEFT: |
olyeah | 0:430276835afe | 71 | left_trigger = value; |
olyeah | 0:430276835afe | 72 | break; |
olyeah | 0:430276835afe | 73 | case TRIGGER_RIGHT: |
olyeah | 0:430276835afe | 74 | right_trigger = value; |
olyeah | 0:430276835afe | 75 | break; |
olyeah | 0:430276835afe | 76 | default: |
olyeah | 0:430276835afe | 77 | break; |
olyeah | 0:430276835afe | 78 | } |
olyeah | 0:430276835afe | 79 | } |
olyeah | 0:430276835afe | 80 | /* |
olyeah | 0:430276835afe | 81 | * |
olyeah | 0:430276835afe | 82 | Process the LED Pattern |
olyeah | 0:430276835afe | 83 | 0x00 OFF |
olyeah | 0:430276835afe | 84 | 0x01 All Blinking |
olyeah | 0:430276835afe | 85 | 0x02 1 Flashes, then on |
olyeah | 0:430276835afe | 86 | 0x03 2 Flashes, then on |
olyeah | 0:430276835afe | 87 | 0x04 3 Flashes, then on |
olyeah | 0:430276835afe | 88 | 0x05 4 Flashes, then on |
olyeah | 0:430276835afe | 89 | 0x06 1 on |
olyeah | 0:430276835afe | 90 | 0x07 2 on |
olyeah | 0:430276835afe | 91 | 0x08 3 on |
olyeah | 0:430276835afe | 92 | 0x09 4 on |
olyeah | 0:430276835afe | 93 | 0x0A Rotating (1-2-4-3) |
olyeah | 0:430276835afe | 94 | 0x0B Blinking* |
olyeah | 0:430276835afe | 95 | 0x0C Slow Blinking* |
olyeah | 0:430276835afe | 96 | 0x0D Alternating (1+4-2+3)* |
olyeah | 0:430276835afe | 97 | */ |
olyeah | 0:430276835afe | 98 | bool Xinput::read_leds(uint8_t * data){ |
olyeah | 0:430276835afe | 99 | uint32_t bytesRead = 0; |
olyeah | 0:430276835afe | 100 | bool result; |
olyeah | 0:430276835afe | 101 | result = USBDevice::readEP_NB(XINPUT_RX_ENDPOINT, data, &bytesRead, XINPUT_RX_SIZE); |
olyeah | 0:430276835afe | 102 | // if readEP_NB did not succeed, does not issue a readStart |
olyeah | 0:430276835afe | 103 | if (!result) |
olyeah | 0:430276835afe | 104 | return false; |
olyeah | 0:430276835afe | 105 | if(!readStart(XINPUT_RX_ENDPOINT, XINPUT_RX_SIZE)) |
olyeah | 0:430276835afe | 106 | return false; |
olyeah | 0:430276835afe | 107 | return result; |
olyeah | 0:430276835afe | 108 | } |
olyeah | 0:430276835afe | 109 | |
olyeah | 0:430276835afe | 110 | |
olyeah | 0:430276835afe | 111 | |
olyeah | 0:430276835afe | 112 | |
olyeah | 0:430276835afe | 113 | |
olyeah | 0:430276835afe | 114 | #define DEFAULT_CONFIGURATION (1) |
olyeah | 0:430276835afe | 115 | bool Xinput::USBCallback_setConfiguration(uint8_t configuration){ |
olyeah | 0:430276835afe | 116 | addEndpoint(XINPUT_TX_ENDPOINT, XINPUT_TX_SIZE); |
olyeah | 0:430276835afe | 117 | addEndpoint(XINPUT_RX_ENDPOINT, 20); |
olyeah | 0:430276835afe | 118 | |
olyeah | 0:430276835afe | 119 | readStart(XINPUT_RX_ENDPOINT, XINPUT_RX_SIZE); |
olyeah | 0:430276835afe | 120 | return true; |
olyeah | 0:430276835afe | 121 | } |
olyeah | 0:430276835afe | 122 | |
olyeah | 0:430276835afe | 123 | |
olyeah | 0:430276835afe | 124 | uint8_t * Xinput::configurationDesc() { |
olyeah | 0:430276835afe | 125 | static uint8_t configurationDescriptor[] = { |
olyeah | 0:430276835afe | 126 | CONFIGURATION_DESCRIPTOR_LENGTH,// bLength |
olyeah | 0:430276835afe | 127 | CONFIGURATION_DESCRIPTOR, // bDescriptorType |
olyeah | 0:430276835afe | 128 | LSB(CONFIG_DESC_SIZE), // wTotalLength (LSB) |
olyeah | 0:430276835afe | 129 | MSB(CONFIG_DESC_SIZE), // wTotalLength (MSB) |
olyeah | 0:430276835afe | 130 | NUM_INTERFACE, // bNumInterfaces |
olyeah | 0:430276835afe | 131 | DEFAULT_CONFIGURATION, // bConfigurationValue |
olyeah | 0:430276835afe | 132 | 0x00, // iConfiguration |
olyeah | 0:430276835afe | 133 | DEVICE_ATTRIBUTES, // bmAttributes |
olyeah | 0:430276835afe | 134 | DEVICE_POWER, // bMaxPower |
olyeah | 0:430276835afe | 135 | |
olyeah | 0:430276835afe | 136 | //Interface 0 |
olyeah | 0:430276835afe | 137 | 9, //bLength (length of interface descriptor 9 bytes) |
olyeah | 0:430276835afe | 138 | 4, //bDescriptorType (4 is interface) |
olyeah | 0:430276835afe | 139 | 0, //bInterfaceNumber (This is interface 0) |
olyeah | 0:430276835afe | 140 | 0, //bAlternateSetting (used to select alternate setting. notused) |
olyeah | 0:430276835afe | 141 | 2, //bNumEndpoints (this interface has 2 endpoints) |
olyeah | 0:430276835afe | 142 | 0xFF, //bInterfaceClass (Vendor Defined is 255) |
olyeah | 0:430276835afe | 143 | 0x5D, //bInterfaceSubClass |
olyeah | 0:430276835afe | 144 | 0x01, //bInterfaceProtocol |
olyeah | 0:430276835afe | 145 | 0, //iInterface (Index of string descriptor for describing this notused) |
olyeah | 0:430276835afe | 146 | //Some sort of common descriptor? I pulled this from Message Analyzer dumps of an actual controller |
olyeah | 0:430276835afe | 147 | 17,33,0,1,1,37,129,20,0,0,0,0,19,2,8,0,0, |
olyeah | 0:430276835afe | 148 | //Endpoint 1 IN |
olyeah | 0:430276835afe | 149 | 7, //bLength (length of ep1in in descriptor 7 bytes) |
olyeah | 0:430276835afe | 150 | 5, //bDescriptorType (5 is endpoint) |
olyeah | 0:430276835afe | 151 | 0x81, //bEndpointAddress (0x81 is IN1) |
olyeah | 0:430276835afe | 152 | 0x03, //bmAttributes (0x03 is interrupt no synch, usage type data) |
olyeah | 0:430276835afe | 153 | 0x20, 0x00, //wMaxPacketSize (0x0020 is 1x32 bytes) |
olyeah | 0:430276835afe | 154 | 4, //bInterval (polling interval in frames 4 frames) |
olyeah | 0:430276835afe | 155 | //Endpoint 2 OUT |
olyeah | 0:430276835afe | 156 | 7, //bLength (length of ep2out in descriptor 7 bytes) |
olyeah | 0:430276835afe | 157 | 5, //bDescriptorType (5 is endpoint) |
olyeah | 0:430276835afe | 158 | 0x02, //bEndpointAddress (0x02 is OUT2) |
olyeah | 0:430276835afe | 159 | 0x03, //bmAttributes (0x03 is interrupt no synch, usage type data) |
olyeah | 0:430276835afe | 160 | 0x20, 0x00, //wMaxPacketSize (0x0020 is 1x32 bytes) |
olyeah | 0:430276835afe | 161 | 8, //bInterval (polling interval in frames 8 frames) |
olyeah | 0:430276835afe | 162 | //Interface 1 |
olyeah | 0:430276835afe | 163 | 9, //bLength (length of interface descriptor 9 bytes) |
olyeah | 0:430276835afe | 164 | 4, //bDescriptorType (4 is interface) |
olyeah | 0:430276835afe | 165 | 1, //bInterfaceNumber (This is interface 1) |
olyeah | 0:430276835afe | 166 | 0, //bAlternateSetting (used to select alternate setting. notused) |
olyeah | 0:430276835afe | 167 | 4, //bNumEndpoints (this interface has 4 endpoints) |
olyeah | 0:430276835afe | 168 | 0xFF, //bInterfaceClass (Vendor Defined is 255) |
olyeah | 0:430276835afe | 169 | 0x5D, //bInterfaceSubClass (93) |
olyeah | 0:430276835afe | 170 | 0x03, //bInterfaceProtocol (3) |
olyeah | 0:430276835afe | 171 | 0, //iInterface (Index of string descriptor for describing this notused) |
olyeah | 0:430276835afe | 172 | //A different common descriptor? I pulled this from Message Analyzer dumps of an actual controller |
olyeah | 0:430276835afe | 173 | 27,33,0,1,1,1,131,64,1,4,32,22,133,0,0,0,0,0,0,22,5,0,0,0,0,0,0, |
olyeah | 0:430276835afe | 174 | //Endpoint 3 IN |
olyeah | 0:430276835afe | 175 | 7, //bLength (length of ep3in descriptor 7 bytes) |
olyeah | 0:430276835afe | 176 | 5, //bDescriptorType (5 is endpoint) |
olyeah | 0:430276835afe | 177 | 0x83, //bEndpointAddress (0x83 is IN3) |
olyeah | 0:430276835afe | 178 | 0x03, //bmAttributes (0x03 is interrupt no synch, usage type data) |
olyeah | 0:430276835afe | 179 | 0x20, 0x00, //wMaxPacketSize (0x0020 is 1x32 bytes) |
olyeah | 0:430276835afe | 180 | 2, //bInterval (polling interval in frames 2 frames) |
olyeah | 0:430276835afe | 181 | //Endpoint 4 OUT |
olyeah | 0:430276835afe | 182 | 7, //bLength (length of ep4out descriptor 7 bytes) |
olyeah | 0:430276835afe | 183 | 5, //bDescriptorType (5 is endpoint) |
olyeah | 0:430276835afe | 184 | 0x04, //bEndpointAddress (0x04 is OUT4) |
olyeah | 0:430276835afe | 185 | 0x03, //bmAttributes (0x03 is interrupt no synch, usage type data) |
olyeah | 0:430276835afe | 186 | 0x20, 0x00, //wMaxPacketSize (0x0020 is 1x32 bytes) |
olyeah | 0:430276835afe | 187 | 4, //bInterval (polling interval in frames 4 frames) |
olyeah | 0:430276835afe | 188 | //Endpoint 5 IN |
olyeah | 0:430276835afe | 189 | 7, //bLength (length of ep5in descriptor 7 bytes) |
olyeah | 0:430276835afe | 190 | 5, //bDescriptorType (5 is endpoint) |
olyeah | 0:430276835afe | 191 | 0x85, //bEndpointAddress (0x85 is IN5) |
olyeah | 0:430276835afe | 192 | 0x03, //bmAttributes (0x03 is interrupt no synch, usage type data) |
olyeah | 0:430276835afe | 193 | 0x20, 0x00, //wMaxPacketSize (0x0020 is 1x32 bytes) |
olyeah | 0:430276835afe | 194 | 64, //bInterval (polling interval in frames 64 frames) |
olyeah | 0:430276835afe | 195 | //Endpoint 5 OUT (shares endpoint number with previous) |
olyeah | 0:430276835afe | 196 | 7, //bLength (length of ep5out descriptor 7 bytes) |
olyeah | 0:430276835afe | 197 | 5, //bDescriptorType (5 is endpoint) |
olyeah | 0:430276835afe | 198 | 0x05, //bEndpointAddress (0x05 is OUT5) |
olyeah | 0:430276835afe | 199 | 0x03, //bmAttributes (0x03 is interrupt no synch, usage type data) |
olyeah | 0:430276835afe | 200 | 0x20, 0x00, //wMaxPacketSize (0x0020 is 1x32 bytes) |
olyeah | 0:430276835afe | 201 | 16, //bInterval (polling interval in frames 16 frames) |
olyeah | 0:430276835afe | 202 | //Interface 2 |
olyeah | 0:430276835afe | 203 | 9, //bLength (length of interface descriptor 9 bytes) |
olyeah | 0:430276835afe | 204 | 4, //bDescriptorType (4 is interface) |
olyeah | 0:430276835afe | 205 | 2, //bInterfaceNumber (This is interface 2) |
olyeah | 0:430276835afe | 206 | 0, //bAlternateSetting (used to select alternate setting. notused) |
olyeah | 0:430276835afe | 207 | 1, //bNumEndpoints (this interface has 4 endpoints) |
olyeah | 0:430276835afe | 208 | 0xFF, //bInterfaceClass (Vendor Defined is 255) |
olyeah | 0:430276835afe | 209 | 0x5D, //bInterfaceSubClass (93) |
olyeah | 0:430276835afe | 210 | 0x02, //bInterfaceProtocol (3) |
olyeah | 0:430276835afe | 211 | 0, //iInterface (Index of string descriptor for describing this notused) |
olyeah | 0:430276835afe | 212 | //Common Descriptor. Seems that these come after every interface description? |
olyeah | 0:430276835afe | 213 | 9,33,0,1,1,34,134,7,0, |
olyeah | 0:430276835afe | 214 | //Endpoint 6 IN |
olyeah | 0:430276835afe | 215 | 7, //bLength (length of ep6in descriptor 7 bytes) |
olyeah | 0:430276835afe | 216 | 5, //bDescriptorType (5 is endpoint) |
olyeah | 0:430276835afe | 217 | 0x86, //bEndpointAddress (0x86 is IN6) |
olyeah | 0:430276835afe | 218 | 0x03, //bmAttributes (0x03 is interrupt no synch, usage type data) |
olyeah | 0:430276835afe | 219 | 0x20, 0x00, //wMaxPacketSize (0x0020 is 1x32 bytes) |
olyeah | 0:430276835afe | 220 | 16, //bInterval (polling interval in frames 64 frames)+ |
olyeah | 0:430276835afe | 221 | //Interface 3 |
olyeah | 0:430276835afe | 222 | //This is the interface on which all the security handshaking takes place |
olyeah | 0:430276835afe | 223 | //We don't use this but it could be used for man-in-the-middle stuff |
olyeah | 0:430276835afe | 224 | 9, //bLength (length of interface descriptor 9 bytes) |
olyeah | 0:430276835afe | 225 | 4, //bDescriptorType (4 is interface) |
olyeah | 0:430276835afe | 226 | 3, //bInterfaceNumber (This is interface 3) |
olyeah | 0:430276835afe | 227 | 0, //bAlternateSetting (used to select alternate setting. notused) |
olyeah | 0:430276835afe | 228 | 0, //bNumEndpoints (this interface has 0 endpoints ???) |
olyeah | 0:430276835afe | 229 | 0xFF, //bInterfaceClass (Vendor Defined is 255) |
olyeah | 0:430276835afe | 230 | 0xFD, //bInterfaceSubClass (253) |
olyeah | 0:430276835afe | 231 | 0x13, //bInterfaceProtocol (19) |
olyeah | 0:430276835afe | 232 | 4, //iInterface (Computer never asks for this, but an x360 would. so include one day?) |
olyeah | 0:430276835afe | 233 | //Another interface another Common Descriptor |
olyeah | 0:430276835afe | 234 | 6,65,0,1,1,3 |
olyeah | 0:430276835afe | 235 | }; |
olyeah | 0:430276835afe | 236 | return configurationDescriptor; |
olyeah | 0:430276835afe | 237 | } |
olyeah | 0:430276835afe | 238 | |
olyeah | 0:430276835afe | 239 | |
olyeah | 0:430276835afe | 240 | uint8_t * Xinput::deviceDesc() { |
olyeah | 0:430276835afe | 241 | static uint8_t deviceDescriptor[] = { |
olyeah | 0:430276835afe | 242 | DEVICE_DESCRIPTOR_LENGTH, /* bLength */ |
olyeah | 0:430276835afe | 243 | DEVICE_DESCRIPTOR, /* bDescriptorType */ |
olyeah | 0:430276835afe | 244 | LSB(USB_VERSION_2_0), /* bcdUSB (LSB) */ |
olyeah | 0:430276835afe | 245 | MSB(USB_VERSION_2_0), /* bcdUSB (MSB) */ |
olyeah | 0:430276835afe | 246 | DEVICE_CLASS, /* bDeviceClass */ |
olyeah | 0:430276835afe | 247 | DEVICE_SUBCLASS, /* bDeviceSubClass */ |
olyeah | 0:430276835afe | 248 | DEVICE_PROTOCOL, /* bDeviceprotocol */ |
olyeah | 0:430276835afe | 249 | MAX_PACKET_SIZE_EP0, /* bMaxPacketSize0 */ |
olyeah | 0:430276835afe | 250 | (uint8_t)(LSB(VENDOR_ID)), /* idVendor (LSB) */ |
olyeah | 0:430276835afe | 251 | (uint8_t)(MSB(VENDOR_ID)), /* idVendor (MSB) */ |
olyeah | 0:430276835afe | 252 | (uint8_t)(LSB(PRODUCT_ID)), /* idProduct (LSB) */ |
olyeah | 0:430276835afe | 253 | (uint8_t)(MSB(PRODUCT_ID)), /* idProduct (MSB) */ |
olyeah | 0:430276835afe | 254 | (uint8_t)(LSB(DEVICE_VERSION)), /* bcdDevice (LSB) */ |
olyeah | 0:430276835afe | 255 | (uint8_t)(MSB(DEVICE_VERSION)), /* bcdDevice (MSB) */ |
olyeah | 0:430276835afe | 256 | STRING_OFFSET_IMANUFACTURER, /* iManufacturer */ |
olyeah | 0:430276835afe | 257 | STRING_OFFSET_IPRODUCT, /* iProduct */ |
olyeah | 0:430276835afe | 258 | STRING_OFFSET_ISERIAL, /* iSerialNumber */ |
olyeah | 0:430276835afe | 259 | 0x01 /* bNumConfigurations */ |
olyeah | 0:430276835afe | 260 | }; |
olyeah | 0:430276835afe | 261 | return deviceDescriptor; |
olyeah | 0:430276835afe | 262 | } |
olyeah | 0:430276835afe | 263 | |
olyeah | 0:430276835afe | 264 | uint8_t * Xinput::stringImanufacturerDesc() { |
olyeah | 0:430276835afe | 265 | static uint8_t stringImanufacturerDescriptor[] = { |
olyeah | 0:430276835afe | 266 | 0x16, /*bLength*/ |
olyeah | 0:430276835afe | 267 | STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ |
olyeah | 0:430276835afe | 268 | '©',0,'M',0,'i',0,'c',0,'r',0,'o',0,'s',0,'o',0,'f',0,'t',0 |
olyeah | 0:430276835afe | 269 | }; |
olyeah | 0:430276835afe | 270 | return stringImanufacturerDescriptor; |
olyeah | 0:430276835afe | 271 | } |
olyeah | 0:430276835afe | 272 | |
olyeah | 0:430276835afe | 273 | |
olyeah | 0:430276835afe | 274 | uint8_t * Xinput::stringIproductDesc() { |
olyeah | 0:430276835afe | 275 | static uint8_t stringIproductDescriptor[] = { |
olyeah | 0:430276835afe | 276 | 0x16, /*bLength*/ |
olyeah | 0:430276835afe | 277 | STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ |
olyeah | 0:430276835afe | 278 | 'C',0,'o',0,'n',0,'t',0,'r',0,'o',0,'l',0,'l',0,'e',0,'r',0 /*bString iProduct - USB DEVICE*/ |
olyeah | 0:430276835afe | 279 | }; |
olyeah | 0:430276835afe | 280 | return stringIproductDescriptor; |
olyeah | 0:430276835afe | 281 | } |
olyeah | 0:430276835afe | 282 | |
olyeah | 0:430276835afe | 283 | |
olyeah | 0:430276835afe | 284 | uint8_t * Xinput::stringIConfigurationDesc() { |
olyeah | 0:430276835afe | 285 | |
olyeah | 0:430276835afe | 286 | static uint8_t stringIconfigurationDescriptor[] = { |
olyeah | 0:430276835afe | 287 | 0xB2, /*bLength*/ |
olyeah | 0:430276835afe | 288 | STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ |
olyeah | 0:430276835afe | 289 | 0x58, 0x00, 0x62, 0x00, 0x6F, 0x00, 0x78, 0x00, 0x20, 0x00, 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, |
olyeah | 0:430276835afe | 290 | 0x75, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x65, 0x00, |
olyeah | 0:430276835afe | 291 | 0x74, 0x00, 0x68, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x20, 0x00, 0x33, 0x00, 0x2C, 0x00, 0x20, 0x00, |
olyeah | 0:430276835afe | 292 | 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x20, 0x00, |
olyeah | 0:430276835afe | 293 | 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x30, 0x00, 0x2C, 0x00, 0x20, 0x00, 0xA9, 0x00, 0x20, 0x00, |
olyeah | 0:430276835afe | 294 | 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x35, 0x00, 0x20, 0x00, 0x4D, 0x00, 0x69, 0x00, 0x63, 0x00, |
olyeah | 0:430276835afe | 295 | 0x72, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x66, 0x00, 0x74, 0x00, 0x20, 0x00, 0x43, 0x00, |
olyeah | 0:430276835afe | 296 | 0x6F, 0x00, 0x72, 0x00, 0x70, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, |
olyeah | 0:430276835afe | 297 | 0x6F, 0x00, 0x6E, 0x00, 0x2E, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x20, 0x00, |
olyeah | 0:430276835afe | 298 | 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x72, 0x00, |
olyeah | 0:430276835afe | 299 | 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2E, 0x00 |
olyeah | 0:430276835afe | 300 | }; |
olyeah | 0:430276835afe | 301 | return stringIconfigurationDescriptor; |
olyeah | 0:430276835afe | 302 | } |