more wip
Change-Id: Ic9ac625f8cc9375dfbdb5bda8d19004036508499
diff --git a/system/dev/usb/dwc2-device/dwc2-device.c b/system/dev/usb/dwc2-device/dwc2-device.c
index eff4a5f..37fea8e 100644
--- a/system/dev/usb/dwc2-device/dwc2-device.c
+++ b/system/dev/usb/dwc2-device/dwc2-device.c
@@ -65,16 +65,11 @@
deptsiz.xfersize = ep->txn_length - ep->txn_offset;
}
}
-printf("deptsiz.xfersize = %u deptsiz.pktcnt = %u\n", deptsiz.xfersize, deptsiz.pktcnt);
*deptsiz_reg = deptsiz;
/* IN endpoint */
if (is_in) {
-// dwc_interrupts_t gintsts = {0};
-// gintsts.nptxfempty = 1;
-// regs->gintsts = gintsts;
-printf("enable nptxfempty\n");
regs->gintmsk.nptxfempty = 1;
}
@@ -86,6 +81,7 @@
}
static void do_setup_status_phase(dwc_usb_t* dwc, bool is_in) {
+printf("do_setup_status_phase is_in: %d\n", is_in);
dwc_endpoint_t* ep = &dwc->eps[0];
dwc->ep0_state = EP0_STATE_STATUS;
@@ -103,10 +99,18 @@
printf("dwc_ep0_complete_request\n");
dwc_endpoint_t* ep = &dwc->eps[0];
- if (dwc->ep0_state == EP0_STATE_DATA_IN) {
+ if (dwc->ep0_state == EP0_STATE_STATUS) {
+ ep->txn_offset = 0;
+ ep->txn_length = 0;
+ } else if ( ep->txn_length == 0) {
+printf("dwc_otg_ep_start_transfer ???\n");
+// dwc_otg_ep_start_transfer(ep);
+ } else if (dwc->ep0_state == EP0_STATE_DATA_IN) {
if (ep->txn_offset >= ep->txn_length) {
do_setup_status_phase(dwc, false);
}
+ } else {
+ do_setup_status_phase(dwc, true);
}
#if 0
@@ -437,7 +441,7 @@
void dwc_handle_reset_irq(dwc_usb_t* dwc) {
dwc_regs_t* regs = dwc->regs;
- zxlogf(INFO, "dwc_handle_reset_irq\n");
+ printf("\nUSB RESET\n");
dwc->ep0_state = EP0_STATE_DISCONNECTED;
@@ -521,7 +525,7 @@
if (grxstsp.epnum != 0)
- grxstsp.epnum = 2;
+ grxstsp.epnum = 2; // ??????
/* Get pointer to EP structure */
// ep = &pcd->dwc_eps[status.b.epnum].dwc_ep;
@@ -600,7 +604,7 @@
if (diepint.xfercompl) {
printf("diepint.xfercompl\n");
/* Disable the NP Tx FIFO Empty Interrrupt */
- regs->gintmsk.nptxfempty = 1;
+ regs->gintmsk.nptxfempty = 0;
/* Clear the bit in DIEPINTn for this interrupt */
regs->depin[epnum].diepint.xfercompl = 1;
/* Complete the transfer */
diff --git a/system/dev/usb/dwc2-device/dwc2.c b/system/dev/usb/dwc2-device/dwc2.c
index 1e9f146..7297824 100644
--- a/system/dev/usb/dwc2-device/dwc2.c
+++ b/system/dev/usb/dwc2-device/dwc2.c
@@ -170,6 +170,7 @@
dwc_interrupts_t interrupts = regs->gintsts;
dwc_interrupts_t mask = regs->gintmsk;
+/*
printf("dwc_handle_irq:");
if (interrupts.modemismatch) printf(" modemismatch");
if (interrupts.otgintr) printf(" otgintr");
@@ -203,13 +204,13 @@
if (interrupts.sessreqintr) printf(" sessreqintr");
if (interrupts.wkupintr) printf(" wkupintr");
printf("\n");
-
+*/
// clear interrupt
uint32_t gotgint = regs->gotgint;
regs->gotgint = gotgint;
// acknowledge interrupts
-printf("interrupts: %08x mask: %08x ack: %08x\n", interrupts.val, mask.val, interrupts.val & mask.val);
+//printf("interrupts: %08x mask: %08x ack: %08x\n", interrupts.val, mask.val, interrupts.val & mask.val);
interrupts.val &= mask.val;
regs->gintsts = interrupts;
@@ -225,32 +226,26 @@
if (interrupts.enumdone) {
dwc_handle_enumdone_irq(dwc);
}
-//#ifndef ENABLE_MPI
if (interrupts.inepintr) {
dwc_handle_inepintr_irq(dwc);
}
if (interrupts.outepintr) {
dwc_handle_outepintr_irq(dwc);
}
-//#endif
if (interrupts.nptxfempty) {
dwc_handle_nptxfempty_irq(dwc);
}
-
-#if 0 // ENABLE_MPI
- sleep(1);
- dwc_handle_outepintr_irq(dwc);
- dwc_handle_inepintr_irq(dwc);
-#endif
}
+
+//#define POLL 1
+
// Thread to handle interrupts.
static int dwc_irq_thread(void* arg) {
dwc_usb_t* dwc = (dwc_usb_t*)arg;
-//sleep(2);
-
while (1) {
+#ifndef POLL
zx_status_t wait_res = zx_interrupt_wait(dwc->irq_handle, NULL);
if (wait_res != ZX_OK) {
zxlogf(ERROR, "dwc_usb: irq wait failed, retcode = %d\n", wait_res);
@@ -258,6 +253,7 @@
dwc_handle_irq(dwc);
usleep(2000); // this is terrible
+#endif
dwc_handle_irq(dwc);
}