From b89d4dcf5ed30bc7aca7cf7dd30b098592afd2f1 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Tue, 22 Sep 2009 08:09:48 +0200 Subject: [PATCH] bleh, somehow the last character of a STRING do not receive :/ --- usb/Makefile | 2 + usb/core/core.c | 84 +++++++++++++++++++++++-------- usb/core/core.h | 28 +++++++---- usb/core/usb.c | 131 +++++++++++++++++++++++++++++++++--------------- usb/core/usb.h | 5 +- usb/host/ohci.c | 18 +++---- 6 files changed, 184 insertions(+), 84 deletions(-) diff --git a/usb/Makefile b/usb/Makefile index fb7d8bf..ddd11fb 100644 --- a/usb/Makefile +++ b/usb/Makefile @@ -3,9 +3,11 @@ CFLAGS += -Wno-unused-parameter #debug flags; DU = Debug USB #CFLAGS += -D _DU_OHCI_F #fire @ u/h/ohci.c +CFLAGS += -D _DU_OHCI_F_HALT #halted @ u/h/ohci.c #CFLAGS += -D _DU_OHCI_Q #enqueue @ u/h/ohci.c #CFLAGS += -D _DU_OHCI_RH #roothub @ u/h/ohci.c CFLAGS += -D _DU_CORE #@ u/c/core.c +#CFLAGS += -D _DU_CORE_ADD #@ u/c/core.c CFLAGS += -D _DU_USB #@ u/c/usb.c OBJS += usb/host/ohci.o usb/core/core.o usb/core/usb.o \ diff --git a/usb/core/core.c b/usb/core/core.c index 56a0b57..5c54b48 100644 --- a/usb/core/core.c +++ b/usb/core/core.c @@ -106,46 +106,87 @@ usb_device *usb_add_device() memset(buf, 0, sizeof(buf)); s8 ret; - u8 dev_desc_size; memset(buf, 0, sizeof(buf)); ret = usb_get_dev_desc_simple(dev, buf, sizeof(buf)); - printf("=============\nbuf: 0x%08X\nafter usb control msg(ret: %d):\n", buf, ret); +#ifdef _DU_CORE_ADD + printf("=============\nbuf: 0x%08X\nafter usb_get_dev_desc_simple(ret: %d):\n", buf, ret); hexdump(buf, sizeof(buf)); +#endif + if(ret < 0) { + return (void*) -1; + } /* set MaxPacketSize */ - dev->bMaxPacketSize0 = (u8) buf[7]; - if(!(u8)buf[7]) { - printf("FU\n"); - return (void*)1; - } - /* save device descriptor size */ - dev_desc_size = buf[0]; u8 address = usb_next_address(); ret = usb_set_address(dev, address); dev->address = address; +#ifdef _DU_CORE_ADD printf("set address to %d\n", dev->address); +#endif memset(buf, 0, sizeof(buf)); - ret = usb_get_dev_desc(dev, buf, sizeof(buf), dev_desc_size); - printf("=============\nbuf: 0x%08X\nafter usb control msg(ret: %d):\n", buf, ret); + ret = usb_get_dev_desc(dev, buf, sizeof(buf)); +#ifdef _DU_CORE_ADD + printf("=============\nbuf: 0x%08X\nafter usb_get_dev_desc(ret: %d):\n", buf, ret); hexdump(buf, sizeof(buf)); +#endif + + char *man, *prod, *serial; + if(dev->iManufacturer) { + memset(buf, 0, sizeof(buf)); + man = usb_get_string_simple(dev, dev->iManufacturer, buf, sizeof(buf)); + printf("iManufacturer:\n"); + hexdump(buf, sizeof(buf)); + } else { + man = (char*) malloc(11); + memset(man, '\0', sizeof(man)); + strlcpy(man, "no String", 10); + } + if(dev->iProduct) { + memset(buf, 0, sizeof(buf)); + prod = usb_get_string_simple(dev, dev->iProduct, buf, sizeof(buf)); + } else { + prod = (char*) malloc(11); + memset(prod, '\0', sizeof(prod)); + strlcpy(prod, "no String", 10); + } + if(dev->iSerialNumber) { + memset(buf, 0, sizeof(buf)); + serial = usb_get_string_simple(dev, dev->iSerialNumber, buf, sizeof(buf)); + } else { + serial = (char*) malloc(11); + memset(serial, '\0', sizeof(serial)); + strlcpy(serial, "no String", 10); + } - dev->bDeviceClass = (u8) buf[4]; - dev->bDeviceSubClass = (u8) buf[5]; - dev->bDeviceProtocoll = (u8) buf[6]; - dev->idVendor = (u16) (buf[9] << 8) | (buf[8]); - dev->idProduct = (u16) (buf[11] << 8) | (buf[10]); - dev->bcdDevice = (u16) (buf[13] << 8) | (buf[12]); - printf( "bDeviceClass 0x%02X\n" + printf( "bLength 0x%02X\n" + "bDescriptorType 0x%02X\n" + "bcdUSB 0x%02X\n" + "bDeviceClass 0x%02X\n" "bDeviceSubClass 0x%02X\n" "bDeviceProtocoll 0x%02X\n" "idVendor 0x%04X\n" "idProduct 0x%04X\n" - "bcdDevice 0x%04X\n", dev->bDeviceClass, - dev->bDeviceSubClass, dev->bDeviceProtocoll, - dev->idVendor, dev->idProduct, dev->bcdDevice); + "bcdDevice 0x%04X\n" + "iManufacturer(0x%02X): \"%s\"\n" + "iProduct(0x%02X): \"%s\"\n" + "iSerialNumber(0x%02X): \"%s\"\n" + "bNumConfigurations 0x%02X\n", dev->bLength, dev->bDeviceClass, + dev->bcdUSB, dev->bDescriptorType, dev->bDeviceSubClass, + dev->bDeviceProtocoll, dev->idVendor, dev->idProduct, dev->bcdDevice, + dev->iManufacturer, man, + dev->iProduct, prod, + dev->iSerialNumber, serial, + dev->bNumConfigurations); + + memset(buf, 0, sizeof(buf)); + /* in the most cases usb devices have just one configuration descriptor */ + ret = usb_get_configuration(dev, 0, buf, sizeof(buf)); + printf("=============\nbuf: 0x%08X\nafter usb_get_configuration(ret: %d):\n", buf, ret); + hexdump(buf, sizeof(buf)); + /* usb_get_descriptor(dev, DEVICE, 0, buf, 8); @@ -376,7 +417,6 @@ u16 usb_submit_irp(usb_irp *irp) if (bmRequestType & 0x80) { /* schleife die die tds generiert */ while (runloop && (restlength > 0)) { - printf("restlength: %d\t irp->epsize: %d\n", restlength, irp->epsize); td = usb_create_transfer_descriptor(irp); td->actlen = irp->epsize; /* stop loop if all bytes are send */ diff --git a/usb/core/core.h b/usb/core/core.h index ef8a934..ede6bdc 100644 --- a/usb/core/core.h +++ b/usb/core/core.h @@ -53,16 +53,24 @@ inline static void wait_ms(int ms) typedef struct usb_device_t usb_device; struct usb_device_t { - u8 address; - u8 fullspeed; - u8 bMaxPacketSize0; - u8 bDeviceClass; - u8 bDeviceSubClass; - u8 bDeviceProtocoll; - u32 idVendor; - u32 idProduct; - u32 bcdDevice; - u8 bNumConfigurations; + u8 address; + u8 fullspeed; + + /* device descriptor */ + u8 bLength; + u8 bDescriptorType; + u16 bcdUSB; + u8 bDeviceClass; + u8 bDeviceSubClass; + u8 bDeviceProtocoll; + u8 bMaxPacketSize0; + u16 idVendor; + u16 idProduct; + u16 bcdDevice; + u8 iManufacturer; + u8 iProduct; + u8 iSerialNumber; + u8 bNumConfigurations; u8 epSize[16]; u8 epTogl[16]; diff --git a/usb/core/usb.c b/usb/core/usb.c index 0fd585b..7a495c0 100644 --- a/usb/core/usb.c +++ b/usb/core/usb.c @@ -90,44 +90,6 @@ s8 usb_close(usb_device *dev) return 0; } -/* ask first 8 bytes of device descriptor with this special - * GET Descriptor Request, when device address = 0 - */ -s8 usb_get_dev_desc_simple(usb_device *dev, u8 *buf, u8 size) -{ - if(size < 8) { - return -1; - } - usb_get_descriptor(dev, DEVICE, 0, buf, 8); - return 0; -} - -s8 usb_get_dev_desc(usb_device *dev, u8 *buf, u8 size, u8 dev_desc_size) -{ - printf("WTF SIZE: 0x%X\n", size>= dev_desc_size ? dev_desc_size : size); - usb_get_descriptor(dev, DEVICE, 0, buf, size >= dev_desc_size ? dev_desc_size : size); - return 0; -} - -s8 usb_set_address(usb_device *dev, u8 address) -{ - u8 buf[64]; - usb_control_msg(dev, 0x00, SET_ADDRESS, address, 0, 0, buf, 0); - return 0; -} - -s8 usb_set_configuration(usb_device *dev, u8 configuration) -{ - - return 0; -} - -s8 usb_set_altinterface(usb_device *dev, u8 alternate) -{ - - return 0; -} - s8 usb_reset(usb_device *dev) { @@ -178,11 +140,26 @@ s8 usb_get_string(usb_device *dev, u8 index, u8 langid, u8 *buf, u8 buflen) } -s8 usb_get_string_simple(usb_device *dev, u8 index, u8 *buf, u8 size) +char *usb_get_string_simple(usb_device *dev, u8 index, u8 *buf, u8 size) { + if(size < 8) { + return (char*) -1; + } usb_get_descriptor(dev, STRING, index, buf, (u8) 8); - usb_get_descriptor(dev, STRING, index, buf, size >= buf[0] ? (u8) buf[0] : size); - return 0; + size = size >= (buf[0]) ? (buf[0]) : size; + usb_get_descriptor(dev, STRING, index, buf, size); + + char *str = (char*)malloc((size/2)); + memset(str, '\0', (size/2)); + + u16 i; + for(i=0; i<(size/2)-1; i++) { + str[i] = buf[2+(i*2)]; + printf("%c", str[i]); + } + printf("\n"); + + return str; } s8 usb_get_descriptor(usb_device *dev, u8 type, u8 index, u8 *buf, u8 size) @@ -191,6 +168,78 @@ s8 usb_get_descriptor(usb_device *dev, u8 type, u8 index, u8 *buf, u8 size) return 0; } +/* ask first 8 bytes of device descriptor with this special + * GET Descriptor Request, when device address = 0 + */ +s8 usb_get_dev_desc_simple(usb_device *dev, u8 *buf, u8 size) +{ + if(size < 8) { + return -1; + } + usb_get_descriptor(dev, DEVICE, 0, buf, 8); + + if(!buf[7]) { + printf("FU: %d\n", buf[7]); + return -2; + } + dev->bMaxPacketSize0 = buf[7]; + return 0; +} + +s8 usb_get_dev_desc(usb_device *dev, u8 *buf, u8 size) +{ + if (size < 0x12 || usb_get_dev_desc_simple(dev, buf, size) < 0) { + return -1; + } + usb_get_descriptor(dev, DEVICE, 0, buf, size >= buf[0] ? buf[0] : size); + + dev->bLength = buf[0]; + dev->bDescriptorType = buf[1]; + dev->bcdUSB = (u16) (buf[3] << 8 | buf[2]); + dev->bDeviceClass = buf[4]; + dev->bDeviceSubClass = buf[5]; + dev->bDeviceProtocoll = buf[6]; + dev->idVendor = (u16) (buf[9] << 8) | (buf[8]); + dev->idProduct = (u16) (buf[11] << 8) | (buf[10]); + dev->bcdDevice = (u16) (buf[13] << 8) | (buf[12]); + dev->iManufacturer = buf[14]; + dev->iProduct = buf[15]; + dev->iSerialNumber = buf[16]; + dev->bNumConfigurations = buf[17]; + + return 0; +} + +s8 usb_get_configuration(usb_device *dev, u8 index, u8 *buf, u8 size) +{ + if(size < 8) { + return -1; + } + usb_get_descriptor(dev, CONFIGURATION, index, buf, 8); + usb_get_descriptor(dev, CONFIGURATION, index, buf, size >= buf[0] ? buf[0] : size); + return 0; +} + +s8 usb_set_address(usb_device *dev, u8 address) +{ + u8 buf[64]; + usb_control_msg(dev, 0x00, SET_ADDRESS, address, 0, 0, buf, 0); + return 0; +} + +s8 usb_set_configuration(usb_device *dev, u8 configuration) +{ + + return 0; +} + +s8 usb_set_altinterface(usb_device *dev, u8 alternate) +{ + + return 0; +} + + /******************* Bulk Transfer **********************/ diff --git a/usb/core/usb.h b/usb/core/usb.h index e036619..9dd0620 100644 --- a/usb/core/usb.h +++ b/usb/core/usb.h @@ -67,9 +67,10 @@ s8 usb_reset(usb_device *dev); /******************* Control Transfer **********************/ s8 usb_control_msg(usb_device *dev, u8 requesttype, u8 request, u16 value, u16 index, u16 length, u8 *buf, u16 timeout); s8 usb_get_string(usb_device *dev, u8 index, u8 langid, u8 *buf, u8 buflen); -s8 usb_get_string_simple(usb_device *dev, u8 index, u8 *buf, u8 buflen); +char *usb_get_string_simple(usb_device *dev, u8 index, u8 *buf, u8 size); s8 usb_get_dev_desc_simple(usb_device *dev, u8 *buf, u8 size); -s8 usb_get_dev_desc(usb_device *dev, u8 *buf, u8 size, u8 dev_desc_size); +s8 usb_get_configuration(usb_device *dev, u8 index, u8 *buf, u8 size); +s8 usb_get_dev_desc(usb_device *dev, u8 *buf, u8 size); s8 usb_get_descriptor(usb_device *dev, u8 type, u8 index, u8 *buf, u8 size); diff --git a/usb/host/ohci.c b/usb/host/ohci.c index fe0c67c..f07aae4 100644 --- a/usb/host/ohci.c +++ b/usb/host/ohci.c @@ -69,7 +69,7 @@ static void dbg_op_state() } } -#ifdef _DU_OHCI_Q +#ifdef _DU_OHCI_F_HALT static void dbg_td_flag(u32 flag) { printf("**************** dbg_td_flag: 0x%08X ***************\n", flag); @@ -143,7 +143,7 @@ static void general_td_fill(struct general_td *dest, const usb_transfer_descript dest->flags |= LE(OHCI_TD_SET_DELAY_INTERRUPT(7)); } -#ifdef _DU_OHCI_F +#ifdef _DU_OHCI_F_HALT static void dump_address(void *addr, u32 size, const char* str) { printf("%s hexdump (%d) @ 0x%08X:\n", str, size, addr); @@ -208,37 +208,37 @@ void hcdi_fire() if((LE(edhead->headp) & OHCI_ENDPOINT_HALTED)) { n = phys_to_virt(LE(edhead->headp)&~0xf); prev = phys_to_virt((u32)prev); -#ifdef _DU_OHCI_F +#ifdef _DU_OHCI_F_HALT printf("halted!\n"); #endif sync_before_read((void*) n, sizeof(struct general_td)); -#ifdef _DU_OHCI_F +#ifdef _DU_OHCI_F_HALT printf("n: 0x%08X\n", n); dump_address(n, sizeof(struct general_td), "n(after)"); #endif if(n->buflen > 0) { sync_before_read((void*) n->bufaddr, n->buflen); -#ifdef _DU_OHCI_F +#ifdef _DU_OHCI_F_HALT dump_address((void*) n->bufaddr, n->buflen, "n->bufaddr(after)"); #endif } -#ifdef _DU_OHCI_F +#ifdef _DU_OHCI_F_HALT dbg_td_flag(LE(n->flags)); #endif sync_before_read((void*) prev, sizeof(struct general_td)); -#ifdef _DU_OHCI_F +#ifdef _DU_OHCI_F_HALT printf("prev: 0x%08X\n", prev); dump_address(prev, sizeof(struct general_td), "prev(after)"); #endif if(prev->buflen >0) { sync_before_read((void*) prev->bufaddr, prev->buflen); -#ifdef _DU_OHCI_F +#ifdef _DU_OHCI_F_HALT dump_address((void*) prev->bufaddr, prev->buflen, "prev->bufaddr(after)"); #endif } -#ifdef _DU_OHCI_F +#ifdef _DU_OHCI_F_HALT dbg_td_flag(LE(prev->flags)); printf("halted end!\n"); #endif -- 2.25.1