summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilliam D. Jones <[email protected]>2019-09-29 02:22:09 -0400
committerWilliam D. Jones <[email protected]>2019-09-29 02:22:09 -0400
commit2247f132ca00667253630f833459f0129eb75f11 (patch)
tree362b41245ecf5b8ca4d03379a8d0e5eb02f1fb11 /src
parentea0e799df6594fa6644575493547f41994c9be27 (diff)
Implement dcd_edpt_xfer for nonzero endpoints.
Diffstat (limited to 'src')
-rw-r--r--src/portable/ti/msp430x5xx/dcd_msp430x5xx.c56
1 files changed, 53 insertions, 3 deletions
diff --git a/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c b/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
index edb707963..3950a6204 100644
--- a/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
+++ b/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
@@ -226,6 +226,9 @@ bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)
return false;
}
+ xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);
+ xfer->max_size = desc_edpt->wMaxPacketSize.size;
+
// Buffer allocation scheme:
// For simplicity, only single buffer for now, since tinyusb currently waits
// for an xfer to complete before scheduling another one. This means only
@@ -243,17 +246,23 @@ bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)
// Double buffering equation:
// x_addr = 256 * (epnum - 1) + 128 * dir
// y_addr = x_addr + 64
+ // Address is right-shifted by 3 to fit into 8 bits.
- ep_regs_t ep_regs = EP_REGS(epnum, dir);
uint8_t buf_base = (128 * (epnum - 1) + 64 * dir) >> 3;
// IN and OUT EP registers have the same structure.
+ ep_regs_t ep_regs = EP_REGS(epnum, dir);
+ // FIXME: I was able to get into a situation where OUT EP 3 would stall
+ // while debugging, despite stall code never being called. It appears
+ // these registers don't get cleared on reset, being part of RAM.
+ // Investigate and see if I can duplicate.
ep_regs[SIZXY] = desc_edpt->wMaxPacketSize.size;
ep_regs[BCTX] |= NAK;
ep_regs[BBAX] = buf_base;
- ep_regs[CNF] &= ~TOGGLE; // ISO xfers not supported on MSP430, so no need
- // to gate DATA0/1 and frame behavior.
+ ep_regs[CNF] &= ~TOGGLE; // ISO xfers not supported on MSP430,
+ // so no need to gate DATA0/1 and frame
+ // behavior.
ep_regs[CNF] |= (UBME | USBIIE);
USBKEYPID = USBKEY;
@@ -300,6 +309,21 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t
USBIEPIFG |= BIT0;
}
}
+ else
+ {
+ ep_regs_t ep_regs = EP_REGS(epnum, dir);
+
+ ep_regs[CNF] &= ~TOGGLE; // Bulk and int begin on DATA0.
+
+ if(dir == TUSB_DIR_OUT)
+ {
+ ep_regs[BCTX] &= ~NAK;
+ }
+ else
+ {
+ USBIEPIFG |= (1 << epnum);
+ }
+ }
return true;
}
@@ -438,6 +462,32 @@ void __attribute__ ((interrupt(USB_UBM_VECTOR))) USB_UBM_ISR(void)
receive_packet(0);
break;
+ case USBVECINT_INPUT_ENDPOINT1:
+ case USBVECINT_INPUT_ENDPOINT2:
+ case USBVECINT_INPUT_ENDPOINT3:
+ case USBVECINT_INPUT_ENDPOINT4:
+ case USBVECINT_INPUT_ENDPOINT5:
+ case USBVECINT_INPUT_ENDPOINT6:
+ case USBVECINT_INPUT_ENDPOINT7:
+ {
+ uint8_t ep = ((curr_vector - USBVECINT_INPUT_ENDPOINT1) >> 1) + 1;
+ transmit_packet(ep);
+ }
+ break;
+
+ case USBVECINT_OUTPUT_ENDPOINT1:
+ case USBVECINT_OUTPUT_ENDPOINT2:
+ case USBVECINT_OUTPUT_ENDPOINT3:
+ case USBVECINT_OUTPUT_ENDPOINT4:
+ case USBVECINT_OUTPUT_ENDPOINT5:
+ case USBVECINT_OUTPUT_ENDPOINT6:
+ case USBVECINT_OUTPUT_ENDPOINT7:
+ {
+ uint8_t ep = ((curr_vector - USBVECINT_OUTPUT_ENDPOINT1) >> 1) + 1;
+ receive_packet(ep);
+ }
+ break;
+
default:
while(true);
break;