A usb interface emulating an Xbox 360 controller

Dependencies:   USBDevice

Support for rumble is not done yet.

Please note this is work in progress.

tested so far with LPC1769 and LPC11u35

Committer:
olyeah
Date:
Fri Sep 16 10:01:59 2016 +0000
Revision:
0:430276835afe
initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }