summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilliam D. Jones <[email protected]>2019-09-29 02:43:05 -0400
committerWilliam D. Jones <[email protected]>2019-09-29 02:43:05 -0400
commit838b431faca79e0bd9d627a79b6905010769551c (patch)
treece9eaac2e4e8f172bff928fab2753703c3590392 /src
parent2247f132ca00667253630f833459f0129eb75f11 (diff)
dcd_msp430x5xx: Implement transmit_packet for nonzero endpoints. Untested.
Diffstat (limited to 'src')
-rw-r--r--src/portable/ti/msp430x5xx/dcd_msp430x5xx.c56
1 files changed, 35 insertions, 21 deletions
diff --git a/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c b/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
index 3950a6204..da68074e7 100644
--- a/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
+++ b/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
@@ -382,31 +382,31 @@ static void transmit_packet(uint8_t ep_num)
{
xfer_ctl_t * xfer = XFER_CTL_BASE(ep_num, TUSB_DIR_IN);
- if(ep_num == 0)
+ // First, determine whether we should even send a packet or finish
+ // up the xfer.
+ bool zlp = (xfer->total_len == 0); // By necessity, xfer->total_len will
+ // equal xfer->queued_len for ZLPs.
+ // Of course a ZLP is a short packet.
+ if((!zlp && (xfer->total_len == xfer->queued_len)) || xfer->short_packet)
{
- // First, determine whether we should even send a packet or finish
- // up the xfer.
- bool zlp = (xfer->total_len == 0); // By necessity, xfer->total_len will
- // equal xfer->queued_len for ZLPs.
- // Of course a ZLP is a short packet.
- if((!zlp && (xfer->total_len == xfer->queued_len)) || xfer->short_packet)
- {
- dcd_event_xfer_complete(0, ep_num, xfer->queued_len, XFER_RESULT_SUCCESS, true);
- return;
- }
+ dcd_event_xfer_complete(0, ep_num, xfer->queued_len, XFER_RESULT_SUCCESS, true);
+ return;
+ }
- // Then actually commit to transmit a packet.
- uint8_t * base = (xfer->buffer + xfer->queued_len);
- uint16_t remaining = xfer->total_len - xfer->queued_len;
- uint8_t xfer_size = (xfer->max_size < xfer->total_len) ? xfer->max_size : remaining;
+ // Then actually commit to transmit a packet.
+ uint8_t * base = (xfer->buffer + xfer->queued_len);
+ uint16_t remaining = xfer->total_len - xfer->queued_len;
+ uint8_t xfer_size = (xfer->max_size < xfer->total_len) ? xfer->max_size : remaining;
- xfer->queued_len += xfer_size;
- if(xfer_size < xfer->max_size)
- {
- // Next "xfer complete interrupt", the transfer will end.
- xfer->short_packet = true;
- }
+ xfer->queued_len += xfer_size;
+ if(xfer_size < xfer->max_size)
+ {
+ // Next "xfer complete interrupt", the transfer will end.
+ xfer->short_packet = true;
+ }
+ if(ep_num == 0)
+ {
volatile uint8_t * ep0in_buf = &USBIEP0BUF;
for(int i = 0; i < xfer_size; i++)
{
@@ -416,6 +416,20 @@ static void transmit_packet(uint8_t ep_num)
USBIEPCNT_0 = (USBIEPCNT_0 & 0xF0) + xfer_size;
USBIEPCNT_0 &= ~NAK;
}
+ else
+ {
+ ep_regs_t ep_regs = EP_REGS(ep_num, TUSB_DIR_IN);
+ uint16_t in_buf_base = USBSTABUFF + (ep_regs[BBAX] << 3);
+
+ volatile uint8_t * ep_buf = (volatile uint8_t *) (in_buf_base);
+ for(int i = 0; i < xfer_size; i++)
+ {
+ ep_buf[i] = base[i];
+ }
+
+ ep_regs[BCTX] = (ep_regs[BCTX] & 0xF0) + xfer_size;
+ ep_regs[BCTX] &= ~NAK;
+ }
}
static void handle_setup_packet(void)