diff options
Diffstat (limited to 'firmware/usbstack')
-rw-r--r-- | firmware/usbstack/controller.h | 6 | ||||
-rw-r--r-- | firmware/usbstack/core/epsetup.c | 19 | ||||
-rw-r--r-- | firmware/usbstack/drivers/device/usb_serial.c | 56 | ||||
-rw-r--r-- | firmware/usbstack/drivers/device/usb_storage.c | 85 | ||||
-rw-r--r-- | firmware/usbstack/drivers/device/usb_storage.h | 1 |
5 files changed, 103 insertions, 64 deletions
diff --git a/firmware/usbstack/controller.h b/firmware/usbstack/controller.h index d626899f70..4e742035e6 100644 --- a/firmware/usbstack/controller.h +++ b/firmware/usbstack/controller.h @@ -38,14 +38,14 @@ struct usb_controller { struct usb_dcd_controller_ops { /* endpoint management */ - int (*enable)(struct usb_ep* ep); + int (*enable)(struct usb_ep* ep, struct usb_endpoint_descriptor* desc); int (*disable)(struct usb_ep* ep); int (*set_halt)(struct usb_ep* ep, bool hald); - + /* transmitting */ int (*send)(struct usb_ep* ep, struct usb_response* req); int (*receive)(struct usb_ep* ep, struct usb_response* res); - + /* ep0 */ struct usb_ep* ep0; }; diff --git a/firmware/usbstack/core/epsetup.c b/firmware/usbstack/core/epsetup.c index 338285e8c3..702108a1cb 100644 --- a/firmware/usbstack/core/epsetup.c +++ b/firmware/usbstack/core/epsetup.c @@ -164,23 +164,6 @@ static int ep_matches(struct usb_ep* ep, struct usb_endpoint_descriptor* desc) } /* MATCH!! */ - - /* report address */ - desc->bEndpointAddress |= ep->ep_num; - - /* report (variable) full speed bulk maxpacket */ - if (type == USB_ENDPOINT_XFER_BULK) { - int size = max; - - /* min() doesn't work on bitfields with gcc-3.5 */ - if (size > 64) { - size = 64; - } - desc->wMaxPacketSize = size; - } - - /* save desc in endpoint */ - ep->desc = desc; - + return 1; } diff --git a/firmware/usbstack/drivers/device/usb_serial.c b/firmware/usbstack/drivers/device/usb_serial.c index 7750ccb8b7..7299dc6765 100644 --- a/firmware/usbstack/drivers/device/usb_serial.c +++ b/firmware/usbstack/drivers/device/usb_serial.c @@ -81,7 +81,7 @@ static struct usb_interface_descriptor serial_bulk_interface_desc = { .iInterface = GS_DATA_STR_ID, }; -static struct usb_endpoint_descriptor serial_fullspeed_in_desc = { +static struct usb_endpoint_descriptor serial_fs_in_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_IN, @@ -89,7 +89,7 @@ static struct usb_endpoint_descriptor serial_fullspeed_in_desc = { .wMaxPacketSize = 8, }; -static struct usb_endpoint_descriptor serial_fullspeed_out_desc = { +static struct usb_endpoint_descriptor serial_fs_out_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_OUT, @@ -110,10 +110,34 @@ static struct usb_qualifier_descriptor serial_qualifier_desc = { .bNumConfigurations = 1, }; -struct usb_descriptor_header *serial_bulk_fullspeed_function[] = { +struct usb_descriptor_header *serial_fs_function[] = { (struct usb_descriptor_header *) &serial_bulk_interface_desc, - (struct usb_descriptor_header *) &serial_fullspeed_in_desc, - (struct usb_descriptor_header *) &serial_fullspeed_out_desc, + (struct usb_descriptor_header *) &serial_fs_in_desc, + (struct usb_descriptor_header *) &serial_fs_out_desc, + NULL, +}; + +/* USB 2.0 */ +static struct usb_endpoint_descriptor serial_hs_in_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = 512, +}; + +static struct usb_endpoint_descriptor serial_hs_out_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = 512, +}; + +struct usb_descriptor_header *serial_hs_function[] = { + (struct usb_descriptor_header *) &serial_bulk_interface_desc, + (struct usb_descriptor_header *) &serial_hs_in_desc, + (struct usb_descriptor_header *) &serial_hs_out_desc, NULL, }; @@ -126,11 +150,11 @@ struct usb_response res; static int config_buf(uint8_t *buf, uint8_t type, unsigned index); static int set_config(int config); - struct device { struct usb_ep* in; struct usb_ep* out; uint32_t used_config; + struct usb_descriptor_header** descriptors; }; static struct device dev; @@ -153,14 +177,14 @@ void usb_serial_driver_bind(void* controler_ops) /* serach and asign endpoints */ usb_ep_autoconfig_reset(); - dev.in = usb_ep_autoconfig(&serial_fullspeed_in_desc); + dev.in = usb_ep_autoconfig(&serial_fs_in_desc); if (!dev.in) { goto autoconf_fail; } dev.in->claimed = true; logf("usb serial: in: %s", dev.in->name); - dev.out = usb_ep_autoconfig(&serial_fullspeed_out_desc); + dev.out = usb_ep_autoconfig(&serial_fs_out_desc); if (!dev.out) { goto autoconf_fail; } @@ -180,7 +204,7 @@ void usb_serial_driver_bind(void* controler_ops) return; autoconf_fail: - logf("failed to find endpoiunts"); + logf("failed to find endpoints"); } int usb_serial_driver_request(struct usb_ctrlrequest* request) @@ -252,15 +276,13 @@ int usb_serial_driver_request(struct usb_ctrlrequest* request) void usb_serial_driver_speed(enum usb_device_speed speed) { switch (speed) { - case USB_SPEED_LOW: - case USB_SPEED_FULL: - logf("usb serial: using fullspeed"); - break; case USB_SPEED_HIGH: logf("usb serial: using highspeed"); + dev.descriptors = serial_hs_function; break; default: - logf("speed: hmm"); + logf("usb serial: using fullspeed"); + dev.descriptors = serial_fs_function; break; } } @@ -274,7 +296,7 @@ static int config_buf(uint8_t *buf, uint8_t type, unsigned index) /* TODO check index*/ - len = usb_stack_configdesc(&serial_bulk_config_desc, buf, BUFFER_SIZE, serial_bulk_fullspeed_function); + len = usb_stack_configdesc(&serial_bulk_config_desc, buf, BUFFER_SIZE, dev.descriptors); if (len < 0) { return len; } @@ -288,9 +310,9 @@ static int set_config(int config) /* enable endpoints */ logf("setup %s", dev.in->name); - ops->enable(dev.in); + ops->enable(dev.in, (struct usb_endpoint_descriptor*)dev.descriptors[1]); logf("setup %s", dev.out->name); - ops->enable(dev.out); + ops->enable(dev.out, (struct usb_endpoint_descriptor*)dev.descriptors[2]); /* store config */ logf("using config %d", config); diff --git a/firmware/usbstack/drivers/device/usb_storage.c b/firmware/usbstack/drivers/device/usb_storage.c index 38c2b97eb0..3db379c1df 100644 --- a/firmware/usbstack/drivers/device/usb_storage.c +++ b/firmware/usbstack/drivers/device/usb_storage.c @@ -31,17 +31,9 @@ struct usb_device_driver usb_storage_driver = { .request = usb_storage_driver_request, .suspend = NULL, .resume = NULL, - .speed = NULL, + .speed = usb_storage_driver_speed, }; -struct device { - struct usb_ep* in; - struct usb_ep* out; - struct usb_ep* intr; -}; - -static struct device dev; - /*-------------------------------------------------------------------------*/ #define PROTO_BULK 0x50 // Bulk only @@ -92,8 +84,31 @@ static struct usb_interface_descriptor storage_interface_desc = { .iInterface = 0, }; -/* endpoint I -> bulk in */ -static struct usb_endpoint_descriptor storage_bulk_in_desc = { +static struct usb_endpoint_descriptor storage_fs_bulk_in_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = 64, +}; + +static struct usb_endpoint_descriptor storage_fs_bulk_out_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + .bEndpointAddress = USB_DIR_OUT, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = 64, +}; + +struct usb_descriptor_header *storage_fs_function[] = { + (struct usb_descriptor_header *) &storage_interface_desc, + (struct usb_descriptor_header *) &storage_fs_bulk_in_desc, + (struct usb_descriptor_header *) &storage_fs_bulk_out_desc, + NULL, +}; + +/* USB 2.0 */ +static struct usb_endpoint_descriptor storage_hs_bulk_in_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_IN, @@ -101,8 +116,7 @@ static struct usb_endpoint_descriptor storage_bulk_in_desc = { .wMaxPacketSize = 512, }; -/* endpoint II -> bulk out */ -static struct usb_endpoint_descriptor storage_bulk_out_desc = { +static struct usb_endpoint_descriptor storage_hs_bulk_out_desc = { .bLength = USB_DT_ENDPOINT_SIZE, .bDescriptorType = USB_DT_ENDPOINT, .bEndpointAddress = USB_DIR_OUT, @@ -110,10 +124,10 @@ static struct usb_endpoint_descriptor storage_bulk_out_desc = { .wMaxPacketSize = 512, }; -struct usb_descriptor_header *storage_fullspeed_function[] = { +struct usb_descriptor_header *storage_hs_function[] = { (struct usb_descriptor_header *) &storage_interface_desc, - (struct usb_descriptor_header *) &storage_bulk_in_desc, - (struct usb_descriptor_header *) &storage_bulk_out_desc, + (struct usb_descriptor_header *) &storage_hs_bulk_in_desc, + (struct usb_descriptor_header *) &storage_hs_bulk_out_desc, NULL, }; @@ -126,6 +140,15 @@ struct usb_response res; static int config_buf(uint8_t *buf, uint8_t type, unsigned index); static int set_config(int config); +struct device { + struct usb_ep* in; + struct usb_ep* out; + struct usb_ep* intr; + struct usb_descriptor_header** descriptors; +}; + +static struct device dev; + /*-------------------------------------------------------------------------*/ void usb_storage_driver_init(void) @@ -144,14 +167,14 @@ void usb_storage_driver_bind(void* controler_ops) /* serach and asign endpoints */ usb_ep_autoconfig_reset(); - dev.in = usb_ep_autoconfig(&storage_bulk_in_desc); + dev.in = usb_ep_autoconfig(&storage_fs_bulk_in_desc); if (!dev.in) { goto autoconf_fail; } dev.in->claimed = true; logf("usb storage: in: %s", dev.in->name); - dev.out = usb_ep_autoconfig(&storage_bulk_out_desc); + dev.out = usb_ep_autoconfig(&storage_fs_bulk_out_desc); if (!dev.out) { goto autoconf_fail; } @@ -234,6 +257,20 @@ int usb_storage_driver_request(struct usb_ctrlrequest* request) return ret; } +void usb_storage_driver_speed(enum usb_device_speed speed) +{ + switch (speed) { + case USB_SPEED_HIGH: + logf("usb storage: using highspeed"); + dev.descriptors = storage_hs_function; + break; + default: + logf("usb storage: using fullspeed"); + dev.descriptors = storage_fs_function; + break; + } +} + /*-------------------------------------------------------------------------*/ /* S/GET CONFIGURATION helpers */ @@ -241,12 +278,8 @@ static int config_buf(uint8_t *buf, uint8_t type, unsigned index) { int len; - /* only one configuration */ - if (index != 0) { - return -EINVAL; - } - - len = usb_stack_configdesc(&storage_config_desc, buf, BUFFER_SIZE, storage_fullspeed_function); + len = usb_stack_configdesc(&storage_config_desc, buf, BUFFER_SIZE, dev.descriptors); + logf("result %d", len); if (len < 0) { return len; } @@ -258,9 +291,9 @@ static int set_config(int config) { /* enable endpoints */ logf("setup %s", dev.in->name); - ops->enable(dev.in); + ops->enable(dev.in, (struct usb_endpoint_descriptor*)dev.descriptors[1]); logf("setup %s", dev.out->name); - ops->enable(dev.out); + ops->enable(dev.out, (struct usb_endpoint_descriptor*)dev.descriptors[2]); /* setup buffers */ diff --git a/firmware/usbstack/drivers/device/usb_storage.h b/firmware/usbstack/drivers/device/usb_storage.h index f148d4228c..ff4b187064 100644 --- a/firmware/usbstack/drivers/device/usb_storage.h +++ b/firmware/usbstack/drivers/device/usb_storage.h @@ -27,5 +27,6 @@ void usb_storage_driver_init(void); void usb_storage_driver_bind(void* controller_ops); int usb_storage_driver_request(struct usb_ctrlrequest* req); +void usb_storage_driver_speed(enum usb_device_speed speed); #endif /*_STORGAGE_H_*/ |