Update PROT_NO_ERROR_CTRL_XFER_DATA functionality with new data request scheme and adjust trigger functionality

This commit is contained in:
2020-01-07 11:16:59 -05:00
parent bf9e8e94c8
commit f5d3293a5f

View File

@@ -12,11 +12,12 @@ USB_DEVICE_DESCRIPTOR desc_buf;
struct serial_desc_args sd_args; struct serial_desc_args sd_args;
struct usb_xfer_args usb_args; struct usb_xfer_args usb_args;
int i, chunk_i; unsigned int i, chunk_i;
int size, chunk_size; unsigned int size, chunk_size;
int nak_count;
char cmd; char cmd;
void recv_serial(uint8_t *target, int len) void recv_serial(uint8_t *target, unsigned int len)
{ {
for(i = 0; i < len; i = i + 1) for(i = 0; i < len; i = i + 1)
{ {
@@ -154,11 +155,10 @@ void loop()
if(usb_args.data_len - chunk_i > ARD_BUF_SIZE) chunk_size = ARD_BUF_SIZE; if(usb_args.data_len - chunk_i > ARD_BUF_SIZE) chunk_size = ARD_BUF_SIZE;
else chunk_size = usb_args.data_len - chunk_i; else chunk_size = usb_args.data_len - chunk_i;
Serial.write((unsigned char *) &chunk_size, 2);
recv_serial(usb_data_buf, chunk_size); recv_serial(usb_data_buf, chunk_size);
Serial.write(PROT_ACK);
// i is the current data index i = 0; // current data index
i = 0;
while(i < chunk_size) while(i < chunk_size)
{ {
if(chunk_size - i > 64) size = 64; if(chunk_size - i > 64) size = 64;
@@ -188,6 +188,7 @@ void loop()
(usb_args.wValue >> 8u) & 0xFFu, (usb_args.wValue >> 8u) & 0xFFu,
usb_args.wIndex, usb_args.wIndex,
usb_args.data_len); usb_args.data_len);
if(usb_args.trigger == 1) digitalWrite(6, LOW);
if(usb_args.bmRequestType & 0x80u) if(usb_args.bmRequestType & 0x80u)
{ {
@@ -203,11 +204,18 @@ void loop()
if(Usb.regRd(rHIRQ) & bmRCVDAVIRQ) if(Usb.regRd(rHIRQ) & bmRCVDAVIRQ)
{ {
if(usb_args.trigger == 1)
{
digitalWrite(6, HIGH);
delayMicroseconds(15);
digitalWrite(6, LOW);
}
size = Usb.regRd(rRCVBC); size = Usb.regRd(rRCVBC);
Usb.bytesRd(rRCVFIFO, size, usb_data_buf); Usb.bytesRd(rRCVFIFO, size, usb_data_buf);
Usb.regWr(rHIRQ, bmRCVDAVIRQ); Usb.regWr(rHIRQ, bmRCVDAVIRQ);
Serial.write(size); Serial.write((unsigned char *) &size, 2);
Serial.write(usb_data_buf, size); Serial.write(usb_data_buf, size);
i += size; i += size;
@@ -225,7 +233,6 @@ void loop()
} }
Usb.regWr(rHXFR, tokOUTHS); Usb.regWr(rHXFR, tokOUTHS);
if(usb_args.trigger == 1) digitalWrite(6, LOW);
Serial.write(PROT_SUCCESS); Serial.write(PROT_SUCCESS);
break; break;
} }
@@ -240,7 +247,7 @@ void loop()
if(usb_args.data_len - chunk_i > ARD_BUF_SIZE) chunk_size = ARD_BUF_SIZE; if(usb_args.data_len - chunk_i > ARD_BUF_SIZE) chunk_size = ARD_BUF_SIZE;
else chunk_size = usb_args.data_len - chunk_i; else chunk_size = usb_args.data_len - chunk_i;
Serial.write(chunk_size); Serial.write((unsigned char *) &chunk_size, 2);
recv_serial(usb_data_buf, chunk_size); recv_serial(usb_data_buf, chunk_size);
i = 0; i = 0;
@@ -257,7 +264,6 @@ void loop()
} }
Usb.regWr(rHXFR, tokINHS); Usb.regWr(rHXFR, tokINHS);
if(usb_args.trigger == 1) digitalWrite(6, LOW);
Serial.write(PROT_SUCCESS); Serial.write(PROT_SUCCESS);
break; break;
} }