1 /* 2 * (C) Copyright 2003 3 * Gerry Hamel, geh@ti.com, Texas Instruments 4 * 5 * (C) Copyright 2006 6 * Bryan O'Donoghue, deckard@CodeHermit.ie 7 * 8 * Based on 9 * linux/drivers/usbd/ep0.c 10 * 11 * Copyright (c) 2000, 2001, 2002 Lineo 12 * Copyright (c) 2001 Hewlett Packard 13 * 14 * By: 15 * Stuart Lynne <sl@lineo.com>, 16 * Tom Rushworth <tbr@lineo.com>, 17 * Bruce Balden <balden@lineo.com> 18 * 19 * This program is free software; you can redistribute it and/or modify 20 * it under the terms of the GNU General Public License as published by 21 * the Free Software Foundation; either version 2 of the License, or 22 * (at your option) any later version. 23 * 24 * This program is distributed in the hope that it will be useful, 25 * but WITHOUT ANY WARRANTY; without even the implied warranty of 26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27 * GNU General Public License for more details. 28 * 29 * You should have received a copy of the GNU General Public License 30 * along with this program; if not, write to the Free Software 31 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 32 * 33 */ 34 35 /* 36 * This is the builtin ep0 control function. It implements all required functionality 37 * for responding to control requests (SETUP packets). 38 * 39 * XXX 40 * 41 * Currently we do not pass any SETUP packets (or other) to the configured 42 * function driver. This may need to change. 43 * 44 * XXX 45 * 46 * As alluded to above, a simple callback cdc_recv_setup has been implemented 47 * in the usb_device data structure to facilicate passing 48 * Common Device Class packets to a function driver. 49 * 50 * XXX 51 */ 52 53 #include <common.h> 54 #include <usbdevice.h> 55 56 #if 0 57 #define dbg_ep0(lvl,fmt,args...) serial_printf("[%s] %s:%d: "fmt"\n",__FILE__,__FUNCTION__,__LINE__,##args) 58 #else 59 #define dbg_ep0(lvl,fmt,args...) 60 #endif 61 62 /* EP0 Configuration Set ********************************************************************* */ 63 64 65 /** 66 * ep0_get_status - fill in URB data with appropriate status 67 * @device: 68 * @urb: 69 * @index: 70 * @requesttype: 71 * 72 */ 73 static int ep0_get_status (struct usb_device_instance *device, 74 struct urb *urb, int index, int requesttype) 75 { 76 char *cp; 77 78 urb->actual_length = 2; 79 cp = (char*)urb->buffer; 80 cp[0] = cp[1] = 0; 81 82 switch (requesttype) { 83 case USB_REQ_RECIPIENT_DEVICE: 84 cp[0] = USB_STATUS_SELFPOWERED; 85 break; 86 case USB_REQ_RECIPIENT_INTERFACE: 87 break; 88 case USB_REQ_RECIPIENT_ENDPOINT: 89 cp[0] = usbd_endpoint_halted (device, index); 90 break; 91 case USB_REQ_RECIPIENT_OTHER: 92 urb->actual_length = 0; 93 default: 94 break; 95 } 96 dbg_ep0 (2, "%02x %02x", cp[0], cp[1]); 97 return 0; 98 } 99 100 /** 101 * ep0_get_one 102 * @device: 103 * @urb: 104 * @result: 105 * 106 * Set a single byte value in the urb send buffer. Return non-zero to signal 107 * a request error. 108 */ 109 static int ep0_get_one (struct usb_device_instance *device, struct urb *urb, 110 __u8 result) 111 { 112 urb->actual_length = 1; /* XXX 2? */ 113 ((char *) urb->buffer)[0] = result; 114 return 0; 115 } 116 117 /** 118 * copy_config 119 * @urb: pointer to urb 120 * @data: pointer to configuration data 121 * @length: length of data 122 * 123 * Copy configuration data to urb transfer buffer if there is room for it. 124 */ 125 void copy_config (struct urb *urb, void *data, int max_length, 126 int max_buf) 127 { 128 int available; 129 int length; 130 131 /*dbg_ep0(3, "-> actual: %d buf: %d max_buf: %d max_length: %d data: %p", */ 132 /* urb->actual_length, urb->buffer_length, max_buf, max_length, data); */ 133 134 if (!data) { 135 dbg_ep0 (1, "data is NULL"); 136 return; 137 } 138 length = max_length; 139 140 if (length > max_length) { 141 dbg_ep0 (1, "length: %d >= max_length: %d", length, 142 max_length); 143 return; 144 } 145 /*dbg_ep0(1, " actual: %d buf: %d max_buf: %d max_length: %d length: %d", */ 146 /* urb->actual_length, urb->buffer_length, max_buf, max_length, length); */ 147 148 if ((available = 149 /*urb->buffer_length */ max_buf - urb->actual_length) <= 0) { 150 return; 151 } 152 /*dbg_ep0(1, "actual: %d buf: %d max_buf: %d length: %d available: %d", */ 153 /* urb->actual_length, urb->buffer_length, max_buf, length, available); */ 154 155 if (length > available) { 156 length = available; 157 } 158 /*dbg_ep0(1, "actual: %d buf: %d max_buf: %d length: %d available: %d", */ 159 /* urb->actual_length, urb->buffer_length, max_buf, length, available); */ 160 161 memcpy (urb->buffer + urb->actual_length, data, length); 162 urb->actual_length += length; 163 164 dbg_ep0 (3, 165 "copy_config: <- actual: %d buf: %d max_buf: %d max_length: %d available: %d", 166 urb->actual_length, urb->buffer_length, max_buf, max_length, 167 available); 168 } 169 170 /** 171 * ep0_get_descriptor 172 * @device: 173 * @urb: 174 * @max: 175 * @descriptor_type: 176 * @index: 177 * 178 * Called by ep0_rx_process for a get descriptor device command. Determine what 179 * descriptor is being requested, copy to send buffer. Return zero if ok to send, 180 * return non-zero to signal a request error. 181 */ 182 static int ep0_get_descriptor (struct usb_device_instance *device, 183 struct urb *urb, int max, int descriptor_type, 184 int index) 185 { 186 int port = 0; /* XXX compound device */ 187 char *cp; 188 189 /*dbg_ep0(3, "max: %x type: %x index: %x", max, descriptor_type, index); */ 190 191 if (!urb || !urb->buffer || !urb->buffer_length 192 || (urb->buffer_length < 255)) { 193 dbg_ep0 (2, "invalid urb %p", urb); 194 return -1L; 195 } 196 197 /* setup tx urb */ 198 urb->actual_length = 0; 199 cp = (char*)urb->buffer; 200 201 dbg_ep0 (2, "%s", USBD_DEVICE_DESCRIPTORS (descriptor_type)); 202 203 switch (descriptor_type) { 204 case USB_DESCRIPTOR_TYPE_DEVICE: 205 { 206 struct usb_device_descriptor *device_descriptor; 207 if (! 208 (device_descriptor = 209 usbd_device_device_descriptor (device, port))) { 210 return -1; 211 } 212 /* copy descriptor for this device */ 213 copy_config (urb, device_descriptor, 214 sizeof (struct usb_device_descriptor), 215 max); 216 217 /* correct the correct control endpoint 0 max packet size into the descriptor */ 218 device_descriptor = 219 (struct usb_device_descriptor *) urb->buffer; 220 221 } 222 dbg_ep0(3, "copied device configuration, actual_length: 0x%x", urb->actual_length); 223 break; 224 225 case USB_DESCRIPTOR_TYPE_CONFIGURATION: 226 { 227 struct usb_configuration_descriptor 228 *configuration_descriptor; 229 struct usb_device_descriptor *device_descriptor; 230 if (! 231 (device_descriptor = 232 usbd_device_device_descriptor (device, port))) { 233 return -1; 234 } 235 /*dbg_ep0(2, "%d %d", index, device_descriptor->bNumConfigurations); */ 236 if (index >= device_descriptor->bNumConfigurations) { 237 dbg_ep0 (0, "index too large: %d >= %d", index, 238 device_descriptor-> 239 bNumConfigurations); 240 return -1; 241 } 242 243 if (! 244 (configuration_descriptor = 245 usbd_device_configuration_descriptor (device, 246 port, 247 index))) { 248 dbg_ep0 (0, 249 "usbd_device_configuration_descriptor failed: %d", 250 index); 251 return -1; 252 } 253 dbg_ep0(0, "attempt to copy %d bytes to urb\n",cpu_to_le16(configuration_descriptor->wTotalLength)); 254 copy_config (urb, configuration_descriptor, 255 256 cpu_to_le16(configuration_descriptor->wTotalLength), 257 max); 258 } 259 260 break; 261 262 case USB_DESCRIPTOR_TYPE_STRING: 263 { 264 struct usb_string_descriptor *string_descriptor; 265 if (!(string_descriptor = usbd_get_string (index))) { 266 serial_printf("Invalid string index %d\n", index); 267 return -1; 268 } 269 dbg_ep0(3, "string_descriptor: %p length %d", string_descriptor, string_descriptor->bLength); 270 copy_config (urb, string_descriptor, string_descriptor->bLength, max); 271 } 272 break; 273 case USB_DESCRIPTOR_TYPE_INTERFACE: 274 serial_printf("USB_DESCRIPTOR_TYPE_INTERFACE - error not implemented\n"); 275 return -1; 276 case USB_DESCRIPTOR_TYPE_ENDPOINT: 277 serial_printf("USB_DESCRIPTOR_TYPE_ENDPOINT - error not implemented\n"); 278 return -1; 279 case USB_DESCRIPTOR_TYPE_HID: 280 { 281 serial_printf("USB_DESCRIPTOR_TYPE_HID - error not implemented\n"); 282 return -1; /* unsupported at this time */ 283 #if 0 284 int bNumInterface = 285 le16_to_cpu (urb->device_request.wIndex); 286 int bAlternateSetting = 0; 287 int class = 0; 288 struct usb_class_descriptor *class_descriptor; 289 290 if (!(class_descriptor = 291 usbd_device_class_descriptor_index (device, 292 port, 0, 293 bNumInterface, 294 bAlternateSetting, 295 class)) 296 || class_descriptor->descriptor.hid.bDescriptorType != USB_DT_HID) { 297 dbg_ep0 (3, "[%d] interface is not HID", 298 bNumInterface); 299 return -1; 300 } 301 /* copy descriptor for this class */ 302 copy_config (urb, class_descriptor, 303 class_descriptor->descriptor.hid.bLength, 304 max); 305 #endif 306 } 307 break; 308 case USB_DESCRIPTOR_TYPE_REPORT: 309 { 310 serial_printf("USB_DESCRIPTOR_TYPE_REPORT - error not implemented\n"); 311 return -1; /* unsupported at this time */ 312 #if 0 313 int bNumInterface = 314 le16_to_cpu (urb->device_request.wIndex); 315 int bAlternateSetting = 0; 316 int class = 0; 317 struct usb_class_report_descriptor *report_descriptor; 318 319 if (!(report_descriptor = 320 usbd_device_class_report_descriptor_index 321 (device, port, 0, bNumInterface, 322 bAlternateSetting, class)) 323 || report_descriptor->bDescriptorType != 324 USB_DT_REPORT) { 325 dbg_ep0 (3, "[%d] descriptor is not REPORT", 326 bNumInterface); 327 return -1; 328 } 329 /* copy report descriptor for this class */ 330 /*copy_config(urb, &report_descriptor->bData[0], report_descriptor->wLength, max); */ 331 if (max - urb->actual_length > 0) { 332 int length = 333 MIN (report_descriptor->wLength, 334 max - urb->actual_length); 335 memcpy (urb->buffer + urb->actual_length, 336 &report_descriptor->bData[0], length); 337 urb->actual_length += length; 338 } 339 #endif 340 } 341 break; 342 case USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER: 343 { 344 /* If a USB device supports both a full speed and low speed operation 345 * we must send a Device_Qualifier descriptor here 346 */ 347 return -1; 348 } 349 default: 350 return -1; 351 } 352 353 354 dbg_ep0 (1, "urb: buffer: %p buffer_length: %2d actual_length: %2d tx_packetSize: %2d", 355 urb->buffer, urb->buffer_length, urb->actual_length, 356 device->bus->endpoint_array[0].tx_packetSize); 357 /* 358 if ((urb->actual_length < max) && !(urb->actual_length % device->bus->endpoint_array[0].tx_packetSize)) { 359 dbg_ep0(0, "adding null byte"); 360 urb->buffer[urb->actual_length++] = 0; 361 dbg_ep0(0, "urb: buffer_length: %2d actual_length: %2d packet size: %2d", 362 urb->buffer_length, urb->actual_length device->bus->endpoint_array[0].tx_packetSize); 363 } 364 */ 365 return 0; 366 367 } 368 369 /** 370 * ep0_recv_setup - called to indicate URB has been received 371 * @urb: pointer to struct urb 372 * 373 * Check if this is a setup packet, process the device request, put results 374 * back into the urb and return zero or non-zero to indicate success (DATA) 375 * or failure (STALL). 376 * 377 */ 378 int ep0_recv_setup (struct urb *urb) 379 { 380 /*struct usb_device_request *request = urb->buffer; */ 381 /*struct usb_device_instance *device = urb->device; */ 382 383 struct usb_device_request *request; 384 struct usb_device_instance *device; 385 int address; 386 387 dbg_ep0 (0, "entering ep0_recv_setup()"); 388 if (!urb || !urb->device) { 389 dbg_ep0 (3, "invalid URB %p", urb); 390 return -1; 391 } 392 393 request = &urb->device_request; 394 device = urb->device; 395 396 dbg_ep0 (3, "urb: %p device: %p", urb, urb->device); 397 398 399 /*dbg_ep0(2, "- - - - - - - - - -"); */ 400 401 dbg_ep0 (2, 402 "bmRequestType:%02x bRequest:%02x wValue:%04x wIndex:%04x wLength:%04x %s", 403 request->bmRequestType, request->bRequest, 404 le16_to_cpu (request->wValue), le16_to_cpu (request->wIndex), 405 le16_to_cpu (request->wLength), 406 USBD_DEVICE_REQUESTS (request->bRequest)); 407 408 /* handle USB Standard Request (c.f. USB Spec table 9-2) */ 409 if ((request->bmRequestType & USB_REQ_TYPE_MASK) != 0) { 410 if(device->device_state <= STATE_CONFIGURED){ 411 /* Attempt to handle a CDC specific request if we are 412 * in the configured state. 413 */ 414 return device->cdc_recv_setup(request,urb); 415 } 416 dbg_ep0 (1, "non standard request: %x", 417 request->bmRequestType & USB_REQ_TYPE_MASK); 418 return -1; /* Stall here */ 419 } 420 421 switch (device->device_state) { 422 case STATE_CREATED: 423 case STATE_ATTACHED: 424 case STATE_POWERED: 425 /* It actually is important to allow requests in these states, 426 * Windows will request descriptors before assigning an 427 * address to the client. 428 */ 429 430 /*dbg_ep0 (1, "request %s not allowed in this state: %s", */ 431 /* USBD_DEVICE_REQUESTS(request->bRequest), */ 432 /* usbd_device_states[device->device_state]); */ 433 /*return -1; */ 434 break; 435 436 case STATE_INIT: 437 case STATE_DEFAULT: 438 switch (request->bRequest) { 439 case USB_REQ_GET_STATUS: 440 case USB_REQ_GET_INTERFACE: 441 case USB_REQ_SYNCH_FRAME: /* XXX should never see this (?) */ 442 case USB_REQ_CLEAR_FEATURE: 443 case USB_REQ_SET_FEATURE: 444 case USB_REQ_SET_DESCRIPTOR: 445 /* case USB_REQ_SET_CONFIGURATION: */ 446 case USB_REQ_SET_INTERFACE: 447 dbg_ep0 (1, 448 "request %s not allowed in DEFAULT state: %s", 449 USBD_DEVICE_REQUESTS (request->bRequest), 450 usbd_device_states[device->device_state]); 451 return -1; 452 453 case USB_REQ_SET_CONFIGURATION: 454 case USB_REQ_SET_ADDRESS: 455 case USB_REQ_GET_DESCRIPTOR: 456 case USB_REQ_GET_CONFIGURATION: 457 break; 458 } 459 case STATE_ADDRESSED: 460 case STATE_CONFIGURED: 461 break; 462 case STATE_UNKNOWN: 463 dbg_ep0 (1, "request %s not allowed in UNKNOWN state: %s", 464 USBD_DEVICE_REQUESTS (request->bRequest), 465 usbd_device_states[device->device_state]); 466 return -1; 467 } 468 469 /* handle all requests that return data (direction bit set on bm RequestType) */ 470 if ((request->bmRequestType & USB_REQ_DIRECTION_MASK)) { 471 472 dbg_ep0 (3, "Device-to-Host"); 473 474 switch (request->bRequest) { 475 476 case USB_REQ_GET_STATUS: 477 return ep0_get_status (device, urb, request->wIndex, 478 request->bmRequestType & 479 USB_REQ_RECIPIENT_MASK); 480 481 case USB_REQ_GET_DESCRIPTOR: 482 return ep0_get_descriptor (device, urb, 483 le16_to_cpu (request->wLength), 484 le16_to_cpu (request->wValue) >> 8, 485 le16_to_cpu (request->wValue) & 0xff); 486 487 case USB_REQ_GET_CONFIGURATION: 488 serial_printf("get config %d\n", device->configuration); 489 return ep0_get_one (device, urb, 490 device->configuration); 491 492 case USB_REQ_GET_INTERFACE: 493 return ep0_get_one (device, urb, device->alternate); 494 495 case USB_REQ_SYNCH_FRAME: /* XXX should never see this (?) */ 496 return -1; 497 498 case USB_REQ_CLEAR_FEATURE: 499 case USB_REQ_SET_FEATURE: 500 case USB_REQ_SET_ADDRESS: 501 case USB_REQ_SET_DESCRIPTOR: 502 case USB_REQ_SET_CONFIGURATION: 503 case USB_REQ_SET_INTERFACE: 504 return -1; 505 } 506 } 507 /* handle the requests that do not return data */ 508 else { 509 510 511 /*dbg_ep0(3, "Host-to-Device"); */ 512 switch (request->bRequest) { 513 514 case USB_REQ_CLEAR_FEATURE: 515 case USB_REQ_SET_FEATURE: 516 dbg_ep0 (0, "Host-to-Device"); 517 switch (request-> 518 bmRequestType & USB_REQ_RECIPIENT_MASK) { 519 case USB_REQ_RECIPIENT_DEVICE: 520 /* XXX DEVICE_REMOTE_WAKEUP or TEST_MODE would be added here */ 521 /* XXX fall through for now as we do not support either */ 522 case USB_REQ_RECIPIENT_INTERFACE: 523 case USB_REQ_RECIPIENT_OTHER: 524 dbg_ep0 (0, "request %s not", 525 USBD_DEVICE_REQUESTS (request->bRequest)); 526 default: 527 return -1; 528 529 case USB_REQ_RECIPIENT_ENDPOINT: 530 dbg_ep0 (0, "ENDPOINT: %x", le16_to_cpu (request->wValue)); 531 if (le16_to_cpu (request->wValue) == USB_ENDPOINT_HALT) { 532 /*return usbd_device_feature (device, le16_to_cpu (request->wIndex), */ 533 /* request->bRequest == USB_REQ_SET_FEATURE); */ 534 /* NEED TO IMPLEMENT THIS!!! */ 535 return -1; 536 } else { 537 dbg_ep0 (1, "request %s bad wValue: %04x", 538 USBD_DEVICE_REQUESTS 539 (request->bRequest), 540 le16_to_cpu (request->wValue)); 541 return -1; 542 } 543 } 544 545 case USB_REQ_SET_ADDRESS: 546 /* check if this is a re-address, reset first if it is (this shouldn't be possible) */ 547 if (device->device_state != STATE_DEFAULT) { 548 dbg_ep0 (1, "set_address: %02x state: %s", 549 le16_to_cpu (request->wValue), 550 usbd_device_states[device->device_state]); 551 return -1; 552 } 553 address = le16_to_cpu (request->wValue); 554 if ((address & 0x7f) != address) { 555 dbg_ep0 (1, "invalid address %04x %04x", 556 address, address & 0x7f); 557 return -1; 558 } 559 device->address = address; 560 561 /*dbg_ep0(2, "address: %d %d %d", */ 562 /* request->wValue, le16_to_cpu(request->wValue), device->address); */ 563 564 return 0; 565 566 case USB_REQ_SET_DESCRIPTOR: /* XXX should we support this? */ 567 dbg_ep0 (0, "set descriptor: NOT SUPPORTED"); 568 return -1; 569 570 case USB_REQ_SET_CONFIGURATION: 571 /* c.f. 9.4.7 - the top half of wValue is reserved */ 572 device->configuration = le16_to_cpu(request->wValue) & 0xff; 573 574 /* reset interface and alternate settings */ 575 device->interface = device->alternate = 0; 576 577 /*dbg_ep0(2, "set configuration: %d", device->configuration); */ 578 /*serial_printf("DEVICE_CONFIGURED.. event?\n"); */ 579 return 0; 580 581 case USB_REQ_SET_INTERFACE: 582 device->interface = le16_to_cpu (request->wIndex); 583 device->alternate = le16_to_cpu (request->wValue); 584 /*dbg_ep0(2, "set interface: %d alternate: %d", device->interface, device->alternate); */ 585 serial_printf ("DEVICE_SET_INTERFACE.. event?\n"); 586 return 0; 587 588 case USB_REQ_GET_STATUS: 589 case USB_REQ_GET_DESCRIPTOR: 590 case USB_REQ_GET_CONFIGURATION: 591 case USB_REQ_GET_INTERFACE: 592 case USB_REQ_SYNCH_FRAME: /* XXX should never see this (?) */ 593 return -1; 594 } 595 } 596 return -1; 597 } 598