More fixes, and a bit of SRQ.

This commit is contained in:
Nathan Conrad
2019-09-18 21:31:38 -04:00
parent 99d03fcaee
commit 9a726dc7ed
3 changed files with 150 additions and 41 deletions

View File

@@ -371,6 +371,7 @@ static bool handle_devMsgOut(uint8_t rhport, void *data, size_t len, size_t pack
len = usbtmc_state.transfer_size_remaining;
usbtmcd_app_msg_data(rhport,data, len, atEnd);
usbtmc_state.transfer_size_remaining -= len;
usbtmc_state.transfer_size_sent += len;
if(atEnd)
{
@@ -476,11 +477,12 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
case STATE_RCV:
TU_VERIFY(handle_devMsgOut(rhport, usbtmc_state.ep_bulk_out_buf, xferred_bytes, xferred_bytes));
TU_VERIFY(usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_out, usbtmc_state.ep_bulk_out_buf, USBTMCD_MAX_PACKET_SIZE));
return true;
case STATE_ABORTING_BULK_OUT:
TU_VERIFY(false);
return false; // Shold be stalled by now...
return false; // Should be stalled by now...
case STATE_TX_REQUESTED:
case STATE_TX_INITIATED:
case STATE_ABORTING_BULK_IN:
@@ -516,32 +518,32 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
case STATE_TX_INITIATED:
if(usbtmc_state.transfer_size_remaining >=sizeof(usbtmc_state.ep_bulk_in_buf))
{
{
TRACE("IN TX continuing\r\n");
memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, sizeof(usbtmc_state.ep_bulk_in_buf));
usbtmc_state.devInBuffer += sizeof(usbtmc_state.devInBuffer);
usbtmc_state.transfer_size_remaining -= sizeof(usbtmc_state.devInBuffer);
memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, sizeof(usbtmc_state.ep_bulk_in_buf));
usbtmc_state.devInBuffer += sizeof(usbtmc_state.devInBuffer);
usbtmc_state.transfer_size_remaining -= sizeof(usbtmc_state.devInBuffer);
usbtmc_state.transfer_size_sent += sizeof(usbtmc_state.devInBuffer);
TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,sizeof(usbtmc_state.devInBuffer)));
}
else // last packet
{
TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,sizeof(usbtmc_state.devInBuffer)));
}
else // last packet
{
TRACE("IN TX last packet\r\n");
size_t packetLen = usbtmc_state.transfer_size_remaining;
memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, usbtmc_state.transfer_size_remaining);
while((packetLen % 4) != 0)
{
size_t packetLen = usbtmc_state.transfer_size_remaining;
memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, usbtmc_state.transfer_size_remaining);
while((packetLen % 4) != 0)
{
usbtmc_state.ep_bulk_in_buf[packetLen] = 0u;
packetLen++;
}
packetLen++;
}
usbtmc_state.transfer_size_sent += sizeof(usbtmc_state.transfer_size_remaining);
usbtmc_state.transfer_size_remaining = 0;
usbtmc_state.devInBuffer = NULL;
TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,(uint16_t)packetLen));
usbtmc_state.transfer_size_remaining = 0;
usbtmc_state.devInBuffer = NULL;
TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,(uint16_t)packetLen));
if(((packetLen % USBTMCD_MAX_PACKET_SIZE) != 0) || (packetLen == 0 ))
{
usbtmc_state.state = STATE_TX_SHORTED;
}
}
}
return true;
case STATE_ABORTING_BULK_IN:
@@ -554,7 +556,7 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
/* Done. :)*/
TRACE("IN shorted\r\n");
usbtmc_state.state = STATE_ABORTING_BULK_IN_ABORTED;
return true;
return true;
default:
TRACE("IN unknown\r\n");
TU_ASSERT(false);
@@ -667,7 +669,7 @@ bool usbtmcd_control_request(uint8_t rhport, tusb_control_request_t const * requ
usbtmc_state.lastBulkInTag == (request->wValue & 0xf7u))
{
rsp.USBTMC_status = USBTMC_STATUS_SUCCESS;
usbtmc_state.transfer_size_remaining = 0;
usbtmc_state.transfer_size_remaining = 0;
// Check if we've queued a short packet
usbtmc_state.state = ((usbtmc_state.transfer_size_sent % USBTMCD_MAX_PACKET_SIZE) != 0) ?
STATE_ABORTING_BULK_IN : STATE_ABORTING_BULK_IN_SHORTED;