diff options
Diffstat (limited to 'firmware/usbstack/core')
| -rw-r--r-- | firmware/usbstack/core/config.c | 90 | ||||
| -rw-r--r-- | firmware/usbstack/core/core.c | 197 | ||||
| -rw-r--r-- | firmware/usbstack/core/epsetup.c | 98 | ||||
| -rw-r--r-- | firmware/usbstack/core/utils.c | 102 |
4 files changed, 244 insertions, 243 deletions
diff --git a/firmware/usbstack/core/config.c b/firmware/usbstack/core/config.c index a05a508..277156d 100644 --- a/firmware/usbstack/core/config.c +++ b/firmware/usbstack/core/config.c @@ -23,58 +23,58 @@ #include <string.h> #include "usbstack/core.h" -static int usb_descriptor_fillbuf(void* buf, unsigned buflen, struct usb_descriptor_header** src) { - - uint8_t* dest = buf; +static int usb_descriptor_fillbuf(void* buf, unsigned buflen, struct usb_descriptor_header** src) +{ + uint8_t* dest = buf; - if (!src) { - return -EINVAL; - } + if (!src) { + return -EINVAL; + } - /* fill buffer from src[] until null descriptor ptr */ - for (; 0 != *src; src++) { - unsigned len = (*src)->bLength; + /* fill buffer from src[] until null descriptor ptr */ + for (; 0 != *src; src++) { + unsigned len = (*src)->bLength; - logf("len: %d", len); - - if (len > buflen) - return -EINVAL; - memcpy(dest, *src, len); - buflen -= len; - dest += len; - } - return dest - (uint8_t *)buf; + logf("len: %d", len); + + if (len > buflen) + return -EINVAL; + memcpy(dest, *src, len); + buflen -= len; + dest += len; + } + return dest - (uint8_t *)buf; } -int usb_stack_configdesc(const struct usb_config_descriptor* config, void* buf, unsigned length, struct usb_descriptor_header** desc) { - +int usb_stack_configdesc(const struct usb_config_descriptor* config, void* buf, unsigned length, struct usb_descriptor_header** desc) +{ struct usb_config_descriptor* cp = buf; - int len; + int len; + + if (length < USB_DT_CONFIG_SIZE || !desc) { + return -EINVAL; + } + + /* config descriptor first */ + *cp = *config; + + /* then interface/endpoint/class/vendor/... */ + len = usb_descriptor_fillbuf(USB_DT_CONFIG_SIZE + (uint8_t*)buf, length - USB_DT_CONFIG_SIZE, desc); + + if (len < 0) { + return len; + } - if (length < USB_DT_CONFIG_SIZE || !desc) { - return -EINVAL; - } - - /* config descriptor first */ - *cp = *config; + len += USB_DT_CONFIG_SIZE; + if (len > 0xffff) { + return -EINVAL; + } - /* then interface/endpoint/class/vendor/... */ - len = usb_descriptor_fillbuf(USB_DT_CONFIG_SIZE + (uint8_t*)buf, length - USB_DT_CONFIG_SIZE, desc); - - if (len < 0) { - return len; - } - - len += USB_DT_CONFIG_SIZE; - if (len > 0xffff) { - return -EINVAL; - } + /* patch up the config descriptor */ + cp->bLength = USB_DT_CONFIG_SIZE; + cp->bDescriptorType = USB_DT_CONFIG; + cp->wTotalLength = len; + cp->bmAttributes |= USB_CONFIG_ATT_ONE; - /* patch up the config descriptor */ - cp->bLength = USB_DT_CONFIG_SIZE; - cp->bDescriptorType = USB_DT_CONFIG; - cp->wTotalLength = len; - cp->bmAttributes |= USB_CONFIG_ATT_ONE; - - return len; + return len; } diff --git a/firmware/usbstack/core/core.c b/firmware/usbstack/core/core.c index 61b7f83..94131ac 100644 --- a/firmware/usbstack/core/core.c +++ b/firmware/usbstack/core/core.c @@ -39,26 +39,26 @@ static void bind_device_driver(struct usb_device_driver* driver); /** * Initialize usb stack. */ -void usb_stack_init(void) { +void usb_stack_init(void) +{ + int i; + logf("usb_stack_init"); - int i; - logf("usb_stack_init"); - /* init datastructures */ usbcore.controller[0] = NULL; usbcore.controller[1] = NULL; usbcore.active_controller = NULL; usbcore.device_driver = NULL; usbcore.running = false; - + memset(&device_driver_names, 0, USB_STACK_MAX_SETTINGS_NAME); - + /* init arrays */ for (i = 0; i < NUM_DRIVERS; i++) { - usbcore.device_drivers[i] = NULL; - usbcore.host_drivers[i] = NULL; + usbcore.device_drivers[i] = NULL; + usbcore.host_drivers[i] = NULL; } - + /* init controllers */ #if (USBSTACK_CAPS & CONTROLLER_DEVICE) usb_dcd_init(); @@ -77,31 +77,31 @@ void usb_stack_init(void) { * Start processing of usb stack. This function init * active usb controller. */ -void usb_stack_start(void) { - - /* are we allready running? */ - if (usbcore.running) { - logf("allready running!"); - return; - } - - if (usbcore.active_controller == NULL) { - logf("no active controller!"); - return; - } - +void usb_stack_start(void) +{ + /* are we allready running? */ + if (usbcore.running) { + logf("allready running!"); + return; + } + + if (usbcore.active_controller == NULL) { + logf("no active controller!"); + return; + } + /* forward to controller */ - logf("starting controller"); + logf("starting controller"); usbcore.active_controller->start(); usbcore.running = true; - + /* look if started controller is a device controller * and if it has a device driver bind to it */ logf("check for auto bind"); if (usbcore.active_controller->type == DEVICE) { if (usbcore.active_controller->device_driver == NULL && usbcore.device_driver != NULL) { /* bind driver */ - logf("binding..."); + logf("binding..."); bind_device_driver(usbcore.device_driver); } } @@ -111,15 +111,15 @@ void usb_stack_start(void) { * Stop processing of usb stack. This function shutsdown * active usb controller. */ -void usb_stack_stop(void) { +void usb_stack_stop(void) +{ + /* are we allready stopped? */ + if (usbcore.running == false) { + return; + } - /* are we allready stopped? */ - if (usbcore.running == false) { - return; - } - /* forward to controller */ - usbcore.active_controller->stop(); + usbcore.active_controller->stop(); usbcore.running = false; } @@ -127,8 +127,8 @@ void usb_stack_stop(void) { * Gets called by upper layers to indicate that there is * an interrupt waiting for the controller. */ -void usb_stack_irq(void) { - +void usb_stack_irq(void) +{ /* simply notify usb controller */ if (usbcore.active_controller != NULL && usbcore.active_controller->irq != NULL) { usbcore.active_controller->irq(); @@ -140,7 +140,8 @@ void usb_stack_irq(void) { * to call for maintanence. We need to check if a new device has connected, * find suitable drivers for new devices. */ -void usb_stack_work(void) { +void usb_stack_work(void) +{ /* TODO will be used with host device controllers * and needs to be called in a loop (thread) */ } @@ -153,8 +154,8 @@ void usb_stack_work(void) { * @param ctrl pointer to controller to register. * @return 0 on success else a defined error code. */ -int usb_controller_register(struct usb_controller* ctrl) { - +int usb_controller_register(struct usb_controller* ctrl) +{ if (ctrl == NULL) { return EINVAL; } @@ -220,21 +221,21 @@ int usb_controller_unregister(struct usb_controller* ctrl) { * * @param type of controller to activate. */ -void usb_controller_select(int type) { - +void usb_controller_select(int type) +{ struct usb_controller* new = NULL; /* check if a controller of the wanted type is already loaded */ if (usbcore.active_controller != NULL && (int)usbcore.active_controller->type == type) { - logf("controller already set"); - return; + logf("controller already set"); + return; } - logf("usb_controller_select"); - logf(" -> type: %d", type); + logf("usb_controller_select"); + logf(" -> type: %d", type); + + usbcore.mode = type; - usbcore.mode = type; - switch (type) { case DEVICE: new = usbcore.controller[0]; @@ -246,20 +247,20 @@ void usb_controller_select(int type) { /* if there is only one controller, stop here */ if (new == NULL) { - logf("no suitable cntrl found"); + logf("no suitable cntrl found"); return; } /* shutdown current used controller */ if (usbcore.active_controller != NULL) { - logf("shuting down old one"); + logf("shuting down old one"); usbcore.active_controller->shutdown(); } /* set and init new controller */ usbcore.active_controller = new; logf("init controller"); - usbcore.active_controller->init(); + usbcore.active_controller->init(); } int usb_stack_get_mode(void) { @@ -272,10 +273,10 @@ int usb_stack_get_mode(void) { * @param driver pointer to an usb_device_driver struct. * @return 0 on success, else a defined error code. */ -int usb_device_driver_register(struct usb_device_driver* driver) { - +int usb_device_driver_register(struct usb_device_driver* driver) +{ int i; - + if (driver == NULL) { return EINVAL; } @@ -284,109 +285,109 @@ int usb_device_driver_register(struct usb_device_driver* driver) { logf("usb_stack: register usb driver"); for (i = 0; i < NUM_DRIVERS; i++) { if (usbcore.device_drivers[i] == NULL) { - usbcore.device_drivers[i] = driver; - update_driver_names(device_driver_names); - return 0; + usbcore.device_drivers[i] = driver; + update_driver_names(device_driver_names); + return 0; } } update_driver_names(device_driver_names); - + return 0; } int usb_device_driver_bind(const char* name) { - int i; - struct usb_device_driver *tmp = NULL; - struct usb_device_driver *driver = NULL; - + int i; + struct usb_device_driver *tmp = NULL; + struct usb_device_driver *driver = NULL; + if (name == NULL) { return EINVAL; } - + /* look for driver */ logf("looking for driver %s", name); for (i = 0; i < NUM_DRIVERS; i++) { - tmp = usbcore.device_drivers[i]; - if (tmp != NULL && strcmp(name, tmp->name) == 0) { - driver = tmp; - } + tmp = usbcore.device_drivers[i]; + if (tmp != NULL && strcmp(name, tmp->name) == 0) { + driver = tmp; + } } if (driver == NULL) { - logf("no driver found"); - return ENODRIVERFOUND; + logf("no driver found"); + return ENODRIVERFOUND; } - - /* look if there is an usb controller loaded */ + + /* look if there is an usb controller loaded */ if (usbcore.active_controller == NULL) { - /* safe choosen driver and set it when controller starts */ - usbcore.device_driver = driver; - + /* safe choosen driver and set it when controller starts */ + usbcore.device_driver = driver; + } else { - + /* we need to have an active dcd controller */ if (usbcore.active_controller->type != DEVICE) { - logf("wrong type"); + logf("wrong type"); return EWRONGCONTROLLERTYPE; } - + /* bind driver to controller */ bind_device_driver(driver); } - + return 0; } void usb_device_driver_unbind(void) { - logf("usb_device_driver_unbind"); - if (usbcore.active_controller->device_driver != NULL) { - usbcore.active_controller->device_driver->unbind(); - usbcore.active_controller->device_driver = NULL; - } - - usbcore.device_driver = NULL; + logf("usb_device_driver_unbind"); + if (usbcore.active_controller->device_driver != NULL) { + usbcore.active_controller->device_driver->unbind(); + usbcore.active_controller->device_driver = NULL; + } + + usbcore.device_driver = NULL; } static void update_driver_names(unsigned char* result) { - int i; + int i; int pos = 0; - unsigned char terminator = ','; + unsigned char terminator = ','; struct usb_device_driver* dd = NULL; - + /* reset buffer, iterate through drivers and add to char array */ memset(result, 0, USB_STACK_MAX_SETTINGS_NAME); for (i = 0; i < NUM_DRIVERS; i++) { - int len; + int len; dd = usbcore.device_drivers[i]; - + if (dd != NULL) { - len = strlen(dd->name); - if (pos > 0) { - memcpy(result + pos, &terminator, 1); - pos++; - } - memcpy(result + pos, dd->name, len); - pos += len; + len = strlen(dd->name); + if (pos > 0) { + memcpy(result + pos, &terminator, 1); + pos++; + } + memcpy(result + pos, dd->name, len); + pos += len; } } } static void bind_device_driver(struct usb_device_driver* driver) { - + /* look if there is an old driver */ if (usbcore.active_controller->device_driver != NULL) { usbcore.active_controller->device_driver->unbind(); } - + /* bind driver to controller */ usbcore.active_controller->device_driver = driver; - + /* init dirver */ - driver->bind(usbcore.active_controller->controller_ops); + driver->bind(usbcore.active_controller->controller_ops); } diff --git a/firmware/usbstack/core/epsetup.c b/firmware/usbstack/core/epsetup.c index 6ae54fb..36c24e6 100644 --- a/firmware/usbstack/core/epsetup.c +++ b/firmware/usbstack/core/epsetup.c @@ -25,27 +25,27 @@ * * Naming Convention for Endpoint Names * - * - ep1, ep2, ... address is fixed, not direction or type - * - ep1in, ep2out, ... address and direction are fixed, not type - * - ep1-bulk, ep2-bulk, ... address and type are fixed, not direction - * - ep1in-bulk, ep2out-iso, ... all three are fixed - * - ep-* ... no functionality restrictions + * - ep1, ep2, ... address is fixed, not direction or type + * - ep1in, ep2out, ... address and direction are fixed, not type + * - ep1-bulk, ep2-bulk, ... address and type are fixed, not direction + * - ep1in-bulk, ep2out-iso, ... all three are fixed + * - ep-* ... no functionality restrictions * * Type suffixes are "-bulk", "-iso", or "-int". Numbers are decimal. * */ static int ep_matches(struct usb_ep* ep, struct usb_endpoint_descriptor* desc); -void usb_ep_autoconfig_reset(void) { - +void usb_ep_autoconfig_reset(void) +{ struct usb_ep* ep = NULL; if (usbcore.active_controller == NULL) { return; } - + logf("resetting endpoints"); list_for_each_entry(ep, &usbcore.active_controller->endpoints.list, list) { - logf("reset %s", ep->name); + logf("reset %s", ep->name); ep->claimed = false; } } @@ -55,48 +55,48 @@ void usb_ep_autoconfig_reset(void) { * @param desc usb descritpro to use for seraching. * @return NULL or a valid endpoint. */ -struct usb_ep* usb_ep_autoconfig(struct usb_endpoint_descriptor* desc) { - - struct usb_ep* ep = NULL; +struct usb_ep* usb_ep_autoconfig(struct usb_endpoint_descriptor* desc) +{ + struct usb_ep* ep = NULL; if (usbcore.active_controller == NULL) { - logf("active controller NULL"); + logf("active controller NULL"); return NULL; } - + list_for_each_entry(ep, &usbcore.active_controller->endpoints.list, list) { if (ep_matches (ep, desc)) { return ep; } } - + return NULL; } -static int ep_matches(struct usb_ep* ep, struct usb_endpoint_descriptor* desc) { - +static int ep_matches(struct usb_ep* ep, struct usb_endpoint_descriptor* desc) +{ uint8_t type; - const char* tmp; - uint16_t max; + const char* tmp; + uint16_t max; - /* endpoint already claimed? */ - if (ep->claimed) { - logf("!! claimed !!"); + /* endpoint already claimed? */ + if (ep->claimed) { + logf("!! claimed !!"); return 0; } /* only support ep0 for portable CONTROL traffic */ type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; if (type == USB_ENDPOINT_XFER_CONTROL) { - logf("type == control"); + logf("type == control"); return 0; } /* some other naming convention */ if (ep->name[0] != 'e') { - logf("wrong name"); + logf("wrong name"); return 0; } - + /* type-restriction: "-iso", "-bulk", or "-int". * direction-restriction: "in", "out". */ @@ -111,20 +111,20 @@ static int ep_matches(struct usb_ep* ep, struct usb_endpoint_descriptor* desc) { if (tmp[2] == 's') { // == "-iso" return 0; } - break; - case USB_ENDPOINT_XFER_BULK: - if (tmp[1] != 'b') { // != "-bulk" - return 0; - } - break; - case USB_ENDPOINT_XFER_ISOC: - if (tmp[2] != 's') { // != "-iso" - return 0; - } - } + break; + case USB_ENDPOINT_XFER_BULK: + if (tmp[1] != 'b') { // != "-bulk" + return 0; + } + break; + case USB_ENDPOINT_XFER_ISOC: + if (tmp[2] != 's') { // != "-iso" + return 0; + } + } } else { tmp = ep->name + strlen (ep->name); - } + } /* direction-restriction: "..in-..", "out-.." */ tmp--; @@ -132,7 +132,7 @@ static int ep_matches(struct usb_ep* ep, struct usb_endpoint_descriptor* desc) { if (desc->bEndpointAddress & USB_DIR_IN) { if ('n' != *tmp) { return 0; - } + } } else { if ('t' != *tmp) { return 0; @@ -147,40 +147,40 @@ static int ep_matches(struct usb_ep* ep, struct usb_endpoint_descriptor* desc) { * the usb spec fixes high speed bulk maxpacket at 512 bytes. */ max = 0x7ff & desc->wMaxPacketSize; - + switch (type) { case USB_ENDPOINT_XFER_INT: /* INT: limit 64 bytes full speed, 1024 high speed */ - if ((usbcore.active_controller->speed != USB_SPEED_HIGH) && (max > 64)) { + if ((usbcore.active_controller->speed != USB_SPEED_HIGH) && (max > 64)) { return 0; } - /* FALLTHROUGH */ + /* FALLTHROUGH */ - case USB_ENDPOINT_XFER_ISOC: + case USB_ENDPOINT_XFER_ISOC: if ((usbcore.active_controller->speed != USB_SPEED_HIGH) && (max > 1023)) { return 0; } - break; - } + break; + } - /* MATCH!! */ + /* MATCH!! */ - /* report address */ + /* report address */ desc->bEndpointAddress |= ep->ep_num; /* report (variable) full speed bulk maxpacket */ if (type == USB_ENDPOINT_XFER_BULK) { - int size = max; + 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/core/utils.c b/firmware/usbstack/core/utils.c index 2fb2695..0ec4faa 100644 --- a/firmware/usbstack/core/utils.c +++ b/firmware/usbstack/core/utils.c @@ -20,98 +20,98 @@ #include <string.h> #include "usbstack/core.h" -void into_usb_ctrlrequest(struct usb_ctrlrequest* request) { +void into_usb_ctrlrequest(struct usb_ctrlrequest* request) +{ + char* type = ""; + char* req = ""; + char* extra = 0; - char* type = ""; - char* req = ""; - char* extra = 0; - - logf("-usb request-"); + logf("-usb request-"); /* check if packet is okay */ - if (request->bRequestType == 0 && + if (request->bRequestType == 0 && request->bRequest == 0 && request->wValue == 0 && request->wIndex == 0 && request->wLength == 0) { logf(" -> INVALID <-"); return; - } - + } + switch (request->bRequestType & USB_TYPE_MASK) { - case USB_TYPE_STANDARD: - type = "standard"; - + case USB_TYPE_STANDARD: + type = "standard"; + switch (request->bRequest) { case USB_REQ_GET_STATUS: - req = "get status"; + req = "get status"; break; case USB_REQ_CLEAR_FEATURE: - req = "clear feature"; + req = "clear feature"; break; case USB_REQ_SET_FEATURE: - req = "set feature"; + req = "set feature"; break; case USB_REQ_SET_ADDRESS: - req = "set address"; + req = "set address"; break; case USB_REQ_GET_DESCRIPTOR: - req = "get descriptor"; - - switch (request->wValue >> 8) { - case USB_DT_DEVICE: - extra = "get device descriptor"; - break; - case USB_DT_DEVICE_QUALIFIER: - extra = "get device qualifier"; - break; - case USB_DT_OTHER_SPEED_CONFIG: - extra = "get other-speed config descriptor"; - case USB_DT_CONFIG: - extra = "get configuration descriptor"; - break; - case USB_DT_STRING: - extra = "get string descriptor"; - break; - case USB_DT_DEBUG: - extra = "debug"; - break; - } - break; - + req = "get descriptor"; + + switch (request->wValue >> 8) { + case USB_DT_DEVICE: + extra = "get device descriptor"; + break; + case USB_DT_DEVICE_QUALIFIER: + extra = "get device qualifier"; + break; + case USB_DT_OTHER_SPEED_CONFIG: + extra = "get other-speed config descriptor"; + case USB_DT_CONFIG: + extra = "get configuration descriptor"; + break; + case USB_DT_STRING: + extra = "get string descriptor"; + break; + case USB_DT_DEBUG: + extra = "debug"; + break; + } + break; + break; case USB_REQ_SET_DESCRIPTOR: - req = "set descriptor"; + req = "set descriptor"; break; case USB_REQ_GET_CONFIGURATION: - req = "get configuration"; + req = "get configuration"; break; case USB_REQ_SET_CONFIGURATION: - req = "set configuration"; + req = "set configuration"; break; case USB_REQ_GET_INTERFACE: - req = "get interface"; + req = "get interface"; break; case USB_REQ_SET_INTERFACE: - req = "set interface"; + req = "set interface"; break; case USB_REQ_SYNCH_FRAME: - req = "sync frame"; + req = "sync frame"; break; default: - req = "unkown"; - break; + req = "unkown"; + break; } break; case USB_TYPE_CLASS: - type = "class"; + type = "class"; break; case USB_TYPE_VENDOR: - type = "vendor"; + type = "vendor"; break; } - + logf(" -b 0x%x", request->bRequestType); logf(" -b 0x%x", request->bRequest); logf(" -b 0x%x", request->wValue); @@ -120,6 +120,6 @@ void into_usb_ctrlrequest(struct usb_ctrlrequest* request) { logf(" -> t: %s", type); logf(" -> r: %s", req); if (extra != 0) { - logf(" -> e: %s", extra); + logf(" -> e: %s", extra); } } |