From 19a85313de2d066eff09387bade41a016ad2a6a2 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sat, 19 Sep 2009 05:06:27 +0200 Subject: [PATCH] further pfusch :) as usual, see difflog for details --- usb/core/core.c | 10 ++++++++++ usb/host/ohci.c | 26 +++++++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/usb/core/core.c b/usb/core/core.c index b1d0474..87000fe 100644 --- a/usb/core/core.c +++ b/usb/core/core.c @@ -40,6 +40,7 @@ #include "../lib/list.h" #include "../../malloc.h" #include "../../bootmii_ppc.h" //printf +#include "../../string.h" //memset /** * Initialize USB stack. @@ -262,6 +263,7 @@ u16 usb_submit_irp(usb_irp *irp) u8 runloop = 1; u16 restlength = irp->len; char *td_buf_ptr = irp->buffer; + char mybuf[64]; //u8 togl=irp->dev->epTogl[(irp->endpoint & 0x7F)]; u8 togl = irp->dev->epTogl[(irp->endpoint & 0x7F)]; @@ -282,6 +284,7 @@ u16 usb_submit_irp(usb_irp *irp) td->pid = USB_PID_SETUP; td->buffer = irp->buffer; td->actlen = 8; /* control message are always 8 bytes */ + memcpy(mybuf, td->buffer, td->actlen); togl = 0; td->togl = togl; /* start with data0 */ @@ -290,7 +293,11 @@ u16 usb_submit_irp(usb_irp *irp) else togl = 0; /**** send token ****/ + printf("togl: %d\n", togl); hcdi_enqueue(td); +#if 0 + memcpy(td->buffer, mybuf, td->actlen); +#endif /***************** Data Stage ***********************/ /** @@ -348,6 +355,7 @@ u16 usb_submit_irp(usb_irp *irp) } /**** send token ****/ + printf("togl: %d\n", togl); hcdi_enqueue(td); /* pruefe ob noch weitere Pakete vom Device abgeholt werden muessen */ @@ -373,6 +381,7 @@ u16 usb_submit_irp(usb_irp *irp) td->pid = USB_PID_IN; } /**** send token ****/ + printf("togl: %d\n", togl); hcdi_enqueue(td); free(td); @@ -417,6 +426,7 @@ u16 usb_submit_irp(usb_irp *irp) else togl = 0; /**** send token ****/ + printf("togl: %d\n", togl); hcdi_enqueue(td); free(td); } diff --git a/usb/host/ohci.c b/usb/host/ohci.c index 4201b42..bd3793c 100644 --- a/usb/host/ohci.c +++ b/usb/host/ohci.c @@ -57,8 +57,9 @@ static struct general_td *allocate_general_td(size_t bsize) if(bsize == 0) { td->cbp = td->be = ACCESS_LE(0); } else { - td->cbp = ACCESS_LE(virt_to_phys(memalign(16, bsize))); //memailgn required here? - //td->cbp = ACCESS_LE(virt_to_phys(malloc(bsize))); + //td->cbp = ACCESS_LE(virt_to_phys(memalign(16, bsize))); //memailgn required here? + td->cbp = ACCESS_LE(virt_to_phys(malloc(bsize))); + memset(phys_to_virt(ACCESS_LE(td->cbp)), 0, bsize); td->be = ACCESS_LE(ACCESS_LE(td->cbp) + bsize - 1); } return td; @@ -180,11 +181,13 @@ u8 hcdi_enqueue(usb_transfer_descriptor *td) { u32 tmptdbuffer; static struct endpoint_descriptor dummyconfig; + memset(&dummyconfig, 0, 16); dummyconfig.flags = ACCESS_LE(OHCI_ENDPOINT_GENERAL_FORMAT); dummyconfig.headp = dummyconfig.tailp = dummyconfig.nexted = ACCESS_LE(0); printf( "===========================\n" "===========================\n"); + printf("td->buffer(1): 0x%08X\n", (void*)td->buffer); sync_before_read(&hcca_oh0, 256); printf("done head (nach sync): 0x%08X\n", ACCESS_LE(hcca_oh0.done_head)); printf("HCCA->frame_no: %d\nhcca->hccapad1: %d\n", @@ -210,11 +213,12 @@ u8 hcdi_enqueue(usb_transfer_descriptor *td) { break; } tmptd->flags |= ACCESS_LE((td->togl) ? OHCI_TD_TOGGLE_1 : OHCI_TD_TOGGLE_0); + //tmptd->flags |= ACCESS_LE(OHCI_TD_TOGGLE_1); printf("tmptd hexdump (before) 0x%08X:\n", tmptd); hexdump(tmptd, sizeof(struct general_td)); //save buffer adress here; HC may change tmptd->cbp - tmptdbuffer = phys_to_virt(ACCESS_LE(tmptd->cbp)); + tmptdbuffer = (u32) phys_to_virt(ACCESS_LE(tmptd->cbp)); printf("tmptd->cbp hexdump (before) 0x%08X:\n", phys_to_virt(ACCESS_LE(tmptd->cbp))); hexdump((void*) phys_to_virt(ACCESS_LE(tmptd->cbp)), td->actlen); @@ -240,21 +244,18 @@ u8 hcdi_enqueue(usb_transfer_descriptor *td) { set32(OHCI0_HC_CONTROL, OHCI_CTRL_CLE); write32(OHCI0_HC_COMMAND_STATUS, OHCI_CLF); - printf("+++++++++++++++++++++++++++++\n"); + //printf("+++++++++++++++++++++++++++++\n"); /* spin until the controller is done with the control list */ - u32 current = read32(OHCI0_HC_CTRL_CURRENT_ED); - printf("current: 0x%08X\n", current); + //printf("current: 0x%08X\n", current); //don't use this quirk stuff here! -#if 0 - while(!current) { - udelay(2); - current = read32(OHCI0_HC_CTRL_CURRENT_ED); +#if 1 + while(!read32(OHCI0_HC_CTRL_CURRENT_ED)) { } #endif udelay(20000); - current = read32(OHCI0_HC_CTRL_CURRENT_ED); + u32 current = read32(OHCI0_HC_CTRL_CURRENT_ED); printf("current: 0x%08X\n", current); printf("+++++++++++++++++++++++++++++\n"); udelay(20000); @@ -275,12 +276,15 @@ u8 hcdi_enqueue(usb_transfer_descriptor *td) { sync_before_read(&hcca_oh0, 256); printf("done head (nach sync): 0x%08X\n", ACCESS_LE(hcca_oh0.done_head)); + printf("td->buffer(1): 0x%08X\n", (void*)td->buffer); struct general_td* donetd = phys_to_virt(ACCESS_LE(hcca_oh0.done_head)&~1); sync_before_read(donetd, 16); printf("done head hexdump: 0x%08X\n", donetd); hexdump((void*) donetd, 16); + printf("td->buffer(2): 0x%08X\n", (void*)td->buffer); sync_before_read((void*) phys_to_virt(ACCESS_LE(tmptd->cbp)), td->actlen); + printf("td->buffer: 0x%08X\np2v(A_L(tmptd->cbp: 0x%08X\ntd->actlen: %d\n", (void*) (td->buffer), phys_to_virt(ACCESS_LE(tmptd->cbp)), td->actlen); (void) memcpy((void*) (td->buffer), phys_to_virt(ACCESS_LE(tmptd->cbp)), td->actlen); write32(OHCI0_HC_CONTROL, read32(OHCI0_HC_CONTROL)&~OHCI_CTRL_CLE); -- 2.25.1