summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam D. Jones <[email protected]>2019-09-27 21:59:45 -0400
committerWilliam D. Jones <[email protected]>2019-09-27 21:59:45 -0400
commit030560792d1d2d6a2d4febf1c54f9735cddc7aca (patch)
tree40d1e29ef73620114766801564897a9c88e86f6c
parent3ac43076da7acf8e8e83086bf895e0b2c5f8105e (diff)
dcd_msp430x5xx: Implement dcd_set_address.
-rw-r--r--src/portable/ti/msp430x5xx/dcd_msp430x5xx.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c b/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
index c52cf5505..66b7ab293 100644
--- a/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
+++ b/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c
@@ -50,6 +50,7 @@ typedef struct {
uint16_t queued_len;
uint16_t max_size;
bool short_packet;
+ bool zlp_sent;
} xfer_ctl_t;
xfer_ctl_t xfer_status[8][2];
@@ -171,7 +172,11 @@ void dcd_int_disable (uint8_t rhport)
void dcd_set_address (uint8_t rhport, uint8_t dev_addr)
{
(void) rhport;
- (void) dev_addr;
+
+ USBFUNADR = dev_addr;
+
+ // Response with status after changing device address
+ dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0);
}
void dcd_set_config (uint8_t rhport, uint8_t config_num)
@@ -212,6 +217,7 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t
xfer->total_len = total_bytes;
xfer->queued_len = 0;
xfer->short_packet = false;
+ xfer->zlp_sent = false;
if(epnum == 0)
{
@@ -260,7 +266,8 @@ static void transmit_packet(uint8_t ep_num)
if(ep_num == 0)
{
- if(xfer->total_len == xfer->queued_len)
+ bool zlp = (xfer->total_len == 0);
+ if((!zlp && (xfer->total_len == xfer->queued_len)) || xfer->zlp_sent)
{
dcd_event_xfer_complete(0, ep_num, xfer->queued_len, XFER_RESULT_SUCCESS, true);
return;
@@ -271,6 +278,10 @@ static void transmit_packet(uint8_t ep_num)
uint8_t xfer_size = (xfer->max_size < xfer->total_len) ? xfer->max_size : remaining;
xfer->queued_len += xfer_size;
+ if(xfer->total_len == 0)
+ {
+ xfer->zlp_sent = true;
+ }
volatile uint8_t * ep0in_buf = &USBIEP0BUF;
for(int i = 0; i < xfer_size; i++)