From b81baa39a5ef70dfcf5aaa212d5274e4b156c618 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 21 Sep 2009 05:04:12 +0200 Subject: [PATCH] some more device info \o/ --- usb/core/core.c | 34 +++++++++++++++++++++------------- usb/host/ohci.c | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/usb/core/core.c b/usb/core/core.c index bf3fbf7..f3924c4 100644 --- a/usb/core/core.c +++ b/usb/core/core.c @@ -90,7 +90,8 @@ usb_device *usb_add_device() { usb_device *dev = (usb_device *) malloc(sizeof(usb_device)); dev->address = 0; - dev->bMaxPacketSize0 = 8; /* send at first time only 8 bytes */ + /* send at first time only 8 bytes */ + dev->bMaxPacketSize0 = 8; dev->epSize[0] = 64; dev->epSize[1] = 64; @@ -121,21 +122,28 @@ usb_device *usb_add_device() printf("=============\nbuf: 0x%08X\nafter usb control msg:\n", buf); hexdump(buf, sizeof(buf)); -#if 0 u8 devdescr_size; u8 address = usb_next_address(); - dev->bMaxPacketSize0 = (u8) buf[7] ? (u8) buf[7] : 1; //dirty? /* setup real ep0 fifo size */ - devdescr_size = (u8) buf[0]; /* save real length of device descriptor */ + + /* setup real ep0 fifo size */ + dev->bMaxPacketSize0 = (u8) buf[7]; + + /* save real length of device descriptor */ + devdescr_size = (u8) buf[0]; /* define new adress */ - /* - usb_control_msg(dev, 0x00, SET_ADDRESS, address << 8, 0, 0, buf, 8, 0); + usb_control_msg(dev, 0x00, SET_ADDRESS, address, 0, 0, buf, 8, 0); dev->address = address; - */ + printf("=============\nbuf: 0x%08X\nafter usb control msg:\n", buf); + hexdump(buf, sizeof(buf)); + printf("address: %d\n", address); + /* get complete device descriptor */ - usb_control_msg(dev, 0x80, GET_DESCRIPTOR, DEVICE<<8, 0, devdescr_size, buf, 8, - 0); + usb_control_msg(dev, 0x80, GET_DESCRIPTOR, DEVICE<<8, 0, devdescr_size, buf, 8, 0); + + printf("=============\nbuf: 0x%08X\nafter usb control msg:\n", buf); + hexdump(buf, sizeof(buf)); /* save only really neccessary values for this small usbstack */ dev->bDeviceClass = (u8) buf[4]; @@ -162,11 +170,11 @@ usb_device *usb_add_device() * bcdDevice 1.00 */ - // string descriptoren werden nicht im arbeitsspeicher gehalten -> on demand mit // entprechenden funktionen // hier muss man noch mehr abholen, konfigurationene, interfaces und endpunkte +#if 0 /* add device to device list */ element *tmp = (element *) malloc(sizeof(element)); tmp->data = (void *) dev; @@ -317,18 +325,18 @@ u16 usb_submit_irp(usb_irp *irp) /* check bit 7 of bmRequestType */ if (bmRequestType & 0x80) { /* schleife die die tds generiert */ - while (runloop) { + while (runloop || (restlength < 1)) { td = usb_create_transfer_descriptor(irp); td->actlen = irp->epsize; /* stop loop if all bytes are send */ - if (restlength <= irp->epsize) { + if (restlength < irp->epsize) { runloop = 0; td->actlen = restlength; } td->buffer = td_buf_ptr; /* move pointer for next packet */ - td_buf_ptr = td_buf_ptr + irp->epsize; + td_buf_ptr += irp->epsize; td->pid = USB_PID_IN; td->togl = togl; diff --git a/usb/host/ohci.c b/usb/host/ohci.c index 79283ae..f7501c3 100644 --- a/usb/host/ohci.c +++ b/usb/host/ohci.c @@ -202,7 +202,10 @@ static void general_td_fill(struct general_td *dest, const usb_transfer_descript case USB_PID_IN: printf("pid_in\n"); dest->flags |= LE(OHCI_TD_DIRECTION_PID_IN); - dest->flags |= LE(OHCI_TD_BUFFER_ROUNDING); + if(src->maxp > src->actlen) { + printf("round buffer!"); + dest->flags |= LE(OHCI_TD_BUFFER_ROUNDING); + } /* * let the endpoint do the togglestuff! * TODO: just temporary solution! @@ -261,16 +264,46 @@ void hcdi_fire() set32(OHCI0_HC_CONTROL, OHCI_CTRL_CLE); write32(OHCI0_HC_COMMAND_STATUS, OHCI_CLF); + struct general_td *n=0, *prev = 0, *next = 0; /* poll until edhead->headp is null */ do { sync_before_read(edhead, sizeof(struct endpoint_descriptor)); printf("edhead->headp: 0x%08X\n", LE(edhead->headp)); + + /* if halted, debug output plz. will break the transfer */ + if((LE(edhead->headp) & OHCI_ENDPOINT_HALTED)) { + n = phys_to_virt(LE(edhead->headp)&~0xf); + prev = phys_to_virt((u32)prev); + printf("halted!\n"); + + sync_before_read((void*) n, sizeof(struct general_td)); + printf("n: 0x%08X\n", n); + dump_address(n, sizeof(struct general_td), "n(after)"); + if(n->buflen > 0) { + sync_before_read((void*) n->bufaddr, n->buflen); + dump_address((void*) n->bufaddr, n->buflen, "n->bufaddr(after)"); + } + dbg_td_flag(LE(n->flags)); + + sync_before_read((void*) prev, sizeof(struct general_td)); + printf("prev: 0x%08X\n", prev); + dump_address(prev, sizeof(struct general_td), "prev(after)"); + if(prev->buflen >0) { + sync_before_read((void*) prev->bufaddr, prev->buflen); + dump_address((void*) prev->bufaddr, prev->buflen, "prev->bufaddr(after)"); + } + dbg_td_flag(LE(prev->flags)); + + printf("halted end!\n"); + return; + } + prev = (struct general_td*) (LE(edhead->headp)&~0xf); } while(LE(edhead->headp)&~0xf); - struct general_td *n = phys_to_virt(read32(OHCI0_HC_DONE_HEAD) & ~1); + n = phys_to_virt(read32(OHCI0_HC_DONE_HEAD) & ~1); printf("hc_done_head: 0x%08X\n", read32(OHCI0_HC_DONE_HEAD)); - struct general_td *prev = 0, *next = 0; + prev = 0; next = 0; /* reverse done queue */ while(virt_to_phys(n) && edhead->tdcount) { sync_before_read((void*) n, sizeof(struct general_td)); -- 2.25.1