diff options
| author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2007-09-17 23:06:23 +0000 |
|---|---|---|
| committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2007-09-17 23:06:23 +0000 |
| commit | 2077cebca00f57061b6a2c0ba41ab24cc97f3596 (patch) | |
| tree | 92c085016a806e5c4e9f23b28c8e378f7de8c4e0 /firmware/drivers | |
| parent | 689d5fd4462c8b2069278e9c1c7ee054aae0b946 (diff) | |
| download | rockbox-2077cebca00f57061b6a2c0ba41ab24cc97f3596.zip rockbox-2077cebca00f57061b6a2c0ba41ab24cc97f3596.tar.gz rockbox-2077cebca00f57061b6a2c0ba41ab24cc97f3596.tar.bz2 rockbox-2077cebca00f57061b6a2c0ba41ab24cc97f3596.tar.xz | |
* implement strstr
* clean up usb_arcotg_dcd_enable
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14740 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
| -rw-r--r-- | firmware/drivers/usb/arcotg_dcd.c | 184 |
1 files changed, 90 insertions, 94 deletions
diff --git a/firmware/drivers/usb/arcotg_dcd.c b/firmware/drivers/usb/arcotg_dcd.c index b08f7ee..124742c 100644 --- a/firmware/drivers/usb/arcotg_dcd.c +++ b/firmware/drivers/usb/arcotg_dcd.c @@ -523,29 +523,83 @@ int usb_arcotg_dcd_enable(struct usb_ep* ep, max = desc->wMaxPacketSize; retval = -EINVAL; - /* check the max package size validate for this endpoint */ - /* Refer to USB2.0 spec table 9-13. */ + /* check the max package size validate for this endpoint + * Refer to USB2.0 spec table 9-13, */ switch (desc->bmAttributes & 0x03) { case USB_ENDPOINT_XFER_BULK: + if (strstr(ep->name, "-iso") || strstr(ep->name, "-int")) { + goto en_done; + } + mult = 0; zlt = 1; + + switch (arcotg_dcd.speed) { + case USB_SPEED_HIGH: + if ((max == 128) || (max == 256) || (max == 512)) { + break; + } + default: + switch (max) { + case 4: + case 8: + case 16: + case 32: + case 64: + break; + default: + case USB_SPEED_LOW: + goto en_done; + } + } break; case USB_ENDPOINT_XFER_INT: + if (strstr(ep->name, "-iso")) { /* bulk is ok */ + goto en_done; + } + mult = 0; zlt = 1; - break; - case USB_ENDPOINT_XFER_ISOC: + switch (arcotg_dcd.speed) { + case USB_SPEED_HIGH: + if (max <= 1024) { + break; + } + case USB_SPEED_FULL: + if (max <= 64) { + break; + } + default: + if (max <= 8) { + break; + } + goto en_done; + } break; - case USB_ENDPOINT_XFER_CONTROL: - zlt = 1; + case USB_ENDPOINT_XFER_ISOC: + if (strstr(ep->name, "-bulk") || strstr(ep->name, "-int")) { + goto en_done; + } + mult = (unsigned char) (1 +((desc->wMaxPacketSize >> 11) & 0x03)); + zlt = 0; + + switch (arcotg_dcd.speed) { + case USB_SPEED_HIGH: + if (max <= 1024) { + break; + } + case USB_SPEED_FULL: + if (max <= 1023) { + break; + } + default: + goto en_done; + } break; - } -#if 0 - switch (ep->desc->bmAttributes & 0x03) { - case USB_ENDPOINT_XFER_BULK: - if (strstr(ep->ep.name, "-iso") || strstr(ep->ep.name, "-int")) { + case USB_ENDPOINT_XFER_CONTROL: + if (strstr(ep->name, "-iso") || strstr(ep->name, "-int")) { goto en_done; } mult = 0; @@ -553,11 +607,10 @@ int usb_arcotg_dcd_enable(struct usb_ep* ep, switch (arcotg_dcd.speed) { case USB_SPEED_HIGH: - if ((max == 128) || (max == 256) || (max == 512)) { - break; - } - default: + case USB_SPEED_FULL: switch (max) { + case 1: + case 2: case 4: case 8: case 16: @@ -565,85 +618,27 @@ int usb_arcotg_dcd_enable(struct usb_ep* ep, case 64: break; default: - + case USB_SPEED_LOW: - + goto en_done; - + } - + } - + break; - + case USB_ENDPOINT_XFER_INT: - + if (strstr(ep->ep.name, "-iso")) /* bulk is ok */ - + goto en_done; - + mult = 0; - + zlt = 1; - + switch (udc->gadget.speed) { - + case USB_SPEED_HIGH: - + if (max <= 1024) - + break; - + case USB_SPEED_FULL: - + if (max <= 64) - + break; - + default: - + if (max <= 8) - + break; - + goto en_done; - + } - + break; - + case USB_ENDPOINT_XFER_ISOC: - + if (strstr(ep->ep.name, "-bulk") || strstr(ep->ep.name, "-int")) - + goto en_done; - + mult = (unsigned char) - + (1 + ((le16_to_cpu(desc->wMaxPacketSize) >> 11) & 0x03)); - + zlt = 0; - + switch (udc->gadget.speed) { - + case USB_SPEED_HIGH: - + if (max <= 1024) - + break; - + case USB_SPEED_FULL: - + if (max <= 1023) - + break; - + default: - + goto en_done; - + } - + break; - + case USB_ENDPOINT_XFER_CONTROL: - + if (strstr(ep->ep.name, "-iso") || strstr(ep->ep.name, "-int")) - + goto en_done; - + mult = 0; - + zlt = 1; - + switch (udc->gadget.speed) { - + case USB_SPEED_HIGH: - + case USB_SPEED_FULL: - + switch (max) { - + case 1: - + case 2: - + case 4: - + case 8: - + case 16: - + case 32: - + case 64: - + break; - + default: - + goto en_done; - + } - + case USB_SPEED_LOW: - + switch (max) { - + case 1: - + case 2: - + case 4: - + case 8: - + break; - + default: - + goto en_done; - + } - + default: - + goto en_done; - + } - + break; - + - + default: - + goto en_done; - + } -#endif + goto en_done; + } + case USB_SPEED_LOW: + switch (max) { + case 1: + case 2: + case 4: + case 8: + break; + default: + goto en_done; + } + default: + goto en_done; + } + break; + + default: + goto en_done; + } + /* here initialize variable of ep */ ep->maxpacket = max; @@ -690,6 +685,7 @@ int usb_arcotg_dcd_enable(struct usb_ep* ep, (desc->bEndpointAddress & USB_DIR_IN) ? "in" : "out", val); logf(" maxpacket %d", max); +en_done: return retval; } |