From f508d39c0a2c145a5a9e0ee8aab63b7b5bcd61c7 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Wed, 23 Sep 2009 04:41:11 +0200 Subject: [PATCH] fullspeed devices will be detected now --- usb/core/core.c | 16 +++++++++++----- usb/core/core.h | 3 ++- usb/core/usb.c | 2 +- usb/host/ohci.c | 11 ++++++++--- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/usb/core/core.c b/usb/core/core.c index 0f30731..2028251 100644 --- a/usb/core/core.c +++ b/usb/core/core.c @@ -86,13 +86,16 @@ void usb_periodic() * for the core. usb_add_device expected that * the device answers to address zero. */ -struct usb_device *usb_add_device() +struct usb_device *usb_add_device(u8 lowspeed) { struct usb_device *dev = (struct usb_device *) malloc(sizeof(struct usb_device)); dev->conf = (struct usb_conf *) malloc(sizeof(struct usb_conf)); dev->address = 0; - /* send at first time only 8 bytes */ - dev->bMaxPacketSize0 = 8; + dev->fullspeed = lowspeed ? 0 : 1; + /* send at first time only 8 bytes for lowspeed devices + * 64 bytes for fullspeed + */ + dev->bMaxPacketSize0 = lowspeed ? 8 : 64; dev->epSize[0] = 64; dev->epSize[1] = 64; @@ -156,10 +159,12 @@ struct usb_device *usb_add_device() /* print device info */ lsusb(dev); +#if 0 /* select configuration */ ret = usb_set_configuration(dev, dev->conf->bConfigurationValue); printf("=============\nusb_set_configuration(ret: %d) %d\n", ret, dev->conf->bConfigurationValue); printf("=============\nusb_get_configuration: %d\n", usb_get_configuration(dev)); +#endif #if 0 u8 buf[8]; @@ -202,7 +207,7 @@ void lsusb(struct usb_device *dev) printf("iProduct(0x%02X): \"%s\"\n", dev->iProduct, dev->iProduct ? usb_get_string_simple(dev, dev->iProduct) : "no String"); printf("iSerialNumber(0x%02X): \"%s\"\n", dev->iSerialNumber, dev->iSerialNumber ? usb_get_string_simple(dev, dev->iSerialNumber) : "no String"); printf("bNumConfigurations 0x%02X\n", dev->bNumConfigurations); - + u8 c, i, e; struct usb_conf *conf = dev->conf; for(c=0; c <= dev->bNumConfigurations; c++) { @@ -241,7 +246,7 @@ void lsusb(struct usb_device *dev) ed = ed->next; } //endpoint - + ifs = ifs->next; } //interface @@ -515,6 +520,7 @@ struct usb_transfer_descriptor *usb_create_transfer_descriptor(struct usb_irp * td->iso = 0; td->state = USB_TRANSFER_DESCR_NONE; td->maxp = irp->epsize; + td->fullspeed = irp->dev->fullspeed; return td; } diff --git a/usb/core/core.h b/usb/core/core.h index b8149d3..b906bf2 100644 --- a/usb/core/core.h +++ b/usb/core/core.h @@ -165,6 +165,7 @@ struct usb_irp { struct usb_transfer_descriptor { u8 devaddress; u8 endpoint; + u8 fullspeed; // TODO: zusammenfassen! u8 pid; @@ -192,7 +193,7 @@ void usb_periodic(); u8 usb_next_address(); -struct usb_device *usb_add_device(); +struct usb_device *usb_add_device(u8 lowspeed); u8 usb_remove_device(struct usb_device *dev); u8 usb_register_driver(struct usb_driver *driver); void usb_probe_driver(); diff --git a/usb/core/usb.c b/usb/core/usb.c index c0ff3fb..dd21166 100644 --- a/usb/core/usb.c +++ b/usb/core/usb.c @@ -111,7 +111,7 @@ s8 usb_control_msg(struct usb_device *dev, u8 requesttype, u8 request, struct usb_irp *irp = (struct usb_irp*)malloc(sizeof(struct usb_irp)); irp->dev = dev; irp->endpoint = 0; - + irp->epsize = dev->bMaxPacketSize0; irp->type = USB_CTRL; diff --git a/usb/host/ohci.c b/usb/host/ohci.c index f18785c..db83e0f 100644 --- a/usb/host/ohci.c +++ b/usb/host/ohci.c @@ -314,8 +314,12 @@ u8 hcdi_enqueue(const struct usb_transfer_descriptor *td) { memset(edhead, 0, sizeof(struct endpoint_descriptor)); edhead->flags = LE(OHCI_ENDPOINT_GENERAL_FORMAT); edhead->headp = edhead->tailp = edhead->nexted = LE(0); - edhead->flags |= LE(OHCI_ENDPOINT_LOW_SPEED | - OHCI_ENDPOINT_SET_DEVICE_ADDRESS(td->devaddress) | + if(td->fullspeed) { + edhead->flags |= LE(OHCI_ENDPOINT_FULL_SPEED); + } else { + edhead->flags |= LE(OHCI_ENDPOINT_LOW_SPEED); + } + edhead->flags |= LE(OHCI_ENDPOINT_SET_DEVICE_ADDRESS(td->devaddress) | OHCI_ENDPOINT_SET_ENDPOINT_NUMBER(td->endpoint) | OHCI_ENDPOINT_SET_MAX_PACKET_SIZE(td->maxp)); edhead->tdcount = 0; @@ -479,7 +483,8 @@ static void setup_port(u32 reg, u8 from_init) printf("loop done\n"); #endif - (void) usb_add_device(); + /* returns usb_device struct */ + (void) usb_add_device((read32(reg) & RH_PS_LSDA) >> 8); } } -- 2.25.1