Working arduino control requests, still kind of clunky

This commit is contained in:
2019-12-31 00:19:06 -05:00
parent 578699bbc3
commit a215788cbc
7 changed files with 257 additions and 138 deletions

View File

@@ -14,7 +14,7 @@
#ifndef _SPI_H_INCLUDED
#define _SPI_H_INCLUDED
#include "../../../../../../../../../opt/arduino-1.8.10/hardware/arduino/avr/cores/arduino/Arduino.h"
#include "Arduino.h"
// SPI_HAS_TRANSACTION means SPI has beginTransaction(), endTransaction(),
// usingInterrupt(), and SPISetting(clock, bitOrder, dataMode)

View File

@@ -4,10 +4,11 @@
#include "ard_protocol.h"
USB Usb;
USB_DEVICE_DESCRIPTOR desc_buf;
uint8_t state, rcode, addr = 1;
uint8_t usb_data_buf[ARD_BUF_SIZE];
uint8_t desc_buf_val = 0;
USB_DEVICE_DESCRIPTOR desc_buf;
struct serial_desc_args sd_args;
struct usb_xfer_args usb_args;
@@ -15,7 +16,7 @@ int i, chunk_i;
int size, chunk_size;
char cmd;
void recv_args(uint8_t *target, int len)
void recv_serial(uint8_t *target, int len)
{
for(i = 0; i < len; i = i + 1)
{
@@ -26,6 +27,26 @@ void recv_args(uint8_t *target, int len)
}
}
void get_dev_descriptor()
{
if(!desc_buf_val)
{
Usb.getDevDescr(addr, 0, sizeof(USB_DEVICE_DESCRIPTOR), (uint8_t * ) & desc_buf);
desc_buf_val = 1;
}
}
uint8_t send_usb(uint8_t *buf, uint8_t len)
{
Usb.bytesWr(rSNDFIFO, len, buf);
Usb.regWr(rSNDBC, len);
Usb.regWr(rHXFR, tokOUT);
while(!(Usb.regRd(rHIRQ) & bmHXFRDNIRQ));
Usb.regWr(rHIRQ, bmHXFRDNIRQ);
return (Usb.regRd(rHRSL) & 0x0f);
}
uint8_t respond_rcode()
{
if(rcode)
@@ -37,15 +58,6 @@ uint8_t respond_rcode()
else return 0;
}
uint8_t send_data(uint8_t *buf, uint8_t len)
{
Usb.bytesWr(rSNDFIFO, len, buf);
Usb.regWr(rSNDBC, len);
Usb.regWr(rHXFR, tokOUT);
while(!(Usb.regRd(rHIRQ) & bmHXFRDNIRQ));
Usb.regWr(rHIRQ, bmHXFRDNIRQ);
return (Usb.regRd(rHRSL) & 0x0f);
}
void setup()
{
@@ -65,13 +77,18 @@ void loop()
state = Usb.getUsbTaskState();
}
if(state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE)
{
desc_buf_val = 0;
}
if(Serial.available() > 0)
{
cmd = (char) Serial.read();
switch(cmd)
{
case PROT_PARTIAL_CTRL_XFER:
recv_args((uint8_t *) &usb_args, sizeof(struct usb_xfer_args));
recv_serial((uint8_t * ) & usb_args, sizeof(struct usb_xfer_args));
Serial.write(PROT_ACK);
rcode = Usb.ctrlReq_SETUP(addr, 0,
@@ -95,7 +112,7 @@ void loop()
break;
case PROT_NO_ERROR_CTRL_XFER:
recv_args((uint8_t *) &usb_args, sizeof(struct usb_xfer_args));
recv_serial((uint8_t * ) & usb_args, sizeof(struct usb_xfer_args));
Serial.write(PROT_ACK);
rcode = Usb.ctrlReq_SETUP(addr, 0,
@@ -105,7 +122,6 @@ void loop()
(usb_args.wValue >> 8u) & 0xFFu,
usb_args.wIndex,
usb_args.data_len);
respond_rcode();
if(usb_args.bmRequestType & 0x80u)
{
@@ -114,12 +130,11 @@ void loop()
}
else rcode = Usb.dispatchPkt(tokOUTHS, 0, 0);
respond_rcode();
Serial.write(PROT_SUCCESS);
break;
case PROT_NO_ERROR_CTRL_XFER_DATA:
recv_args((uint8_t *) &usb_args, sizeof(struct usb_xfer_args));
recv_serial((uint8_t * ) & usb_args, sizeof(struct usb_xfer_args));
Serial.write(PROT_ACK);
rcode = Usb.ctrlReq_SETUP(addr, 0,
@@ -129,11 +144,8 @@ void loop()
(usb_args.wValue >> 8u) & 0xFFu,
usb_args.wIndex,
usb_args.data_len);
respond_rcode();
Usb.regWr(rHCTL, bmSNDTOG0);
rcode = send_data(usb_data_buf, 0);
respond_rcode();
rcode = send_usb(usb_data_buf, 0);
chunk_i = 0;
while(chunk_i < usb_args.data_len)
@@ -141,7 +153,7 @@ void loop()
if(usb_args.data_len - chunk_i > ARD_BUF_SIZE) chunk_size = ARD_BUF_SIZE;
else chunk_size = usb_args.data_len - chunk_i;
recv_args(usb_data_buf, chunk_size);
recv_serial(usb_data_buf, chunk_size);
Serial.write(PROT_ACK);
// i is the current data index
@@ -151,8 +163,7 @@ void loop()
if(chunk_size - i > 64) size = 64;
else size = chunk_size - i;
rcode = send_data(&usb_data_buf[i], size);
respond_rcode();
rcode = send_usb(&usb_data_buf[i], size);
i += size;
}
@@ -162,22 +173,89 @@ void loop()
Serial.write(PROT_SUCCESS);
break;
// case PROT_CTRL_XFER:
// recv_args((uint8_t *) &usb_args, sizeof(struct usb_xfer_args));
// if(receive_data_and_respond()) break;
//
// rcode = Usb.ctrlReq(addr, 0,
// usb_args.bmRequestType,
// usb_args.bRequest,
// usb_args.wValue & 0xFFu,
// (usb_args.wValue >> 8u) & 0xFFu,
// usb_args.wIndex,
// usb_args.data_len, usb_args.data_len,
// usb_data_buf, NULL);
// if(respond_rcode()) break;
//
// Serial.write(PROT_SUCCESS);
// break;
case PROT_CTRL_XFER:
recv_serial((uint8_t * ) & usb_args, sizeof(struct usb_xfer_args));
Serial.write(PROT_ACK);
get_dev_descriptor();
rcode = Usb.ctrlReq_SETUP(addr, 0,
usb_args.bmRequestType,
usb_args.bRequest,
usb_args.wValue & 0xFFu,
(usb_args.wValue >> 8u) & 0xFFu,
usb_args.wIndex,
usb_args.data_len);
if(usb_args.bmRequestType & 0x80u)
{
i = 0;
Usb.regWr(rHCTL, bmRCVTOG1);
while(i < usb_args.data_len)
{
Usb.regWr(rHXFR, tokIN);
while(!(Usb.regRd(rHIRQ) & bmHXFRDNIRQ));
Usb.regWr(rHIRQ, bmHXFRDNIRQ);
if(Usb.regRd(rHIRQ) & bmRCVDAVIRQ)
{
size = Usb.regRd(rRCVBC);
Usb.bytesRd(rRCVFIFO, size, usb_data_buf);
Usb.regWr(rHIRQ, bmRCVDAVIRQ);
Serial.write(size);
Serial.write(usb_data_buf, size);
i += size;
if(size != desc_buf.bMaxPacketSize0) break;
}
else
{
rcode = (Usb.regRd(rHRSL) & 0x0f);
if(rcode == hrNAK) continue;
Serial.write(PROT_FAIL_USB);
Serial.write(rcode);
break;
}
}
Usb.regWr(rHXFR, tokOUTHS);
Serial.write(PROT_SUCCESS);
break;
}
else
{
chunk_i = 0;
Usb.regWr(rHCTL, bmSNDTOG0);
rcode = send_usb(usb_data_buf, 0);
while(chunk_i < usb_args.data_len)
{
if(usb_args.data_len - chunk_i > ARD_BUF_SIZE) chunk_size = ARD_BUF_SIZE;
else chunk_size = usb_args.data_len - chunk_i;
recv_serial(usb_data_buf, chunk_size);
Serial.write(PROT_ACK);
i = 0;
while(i < chunk_size)
{
if(chunk_size - i > desc_buf.bMaxPacketSize0) size = desc_buf.bMaxPacketSize0;
else size = chunk_size - i;
rcode = send_usb(&usb_data_buf[i], size);
i += size;
}
chunk_i += chunk_size;
}
Usb.regWr(rHXFR, tokINHS);
Serial.write(PROT_SUCCESS);
break;
}
case PROT_RESET:
Serial.write(PROT_ACK);
@@ -189,7 +267,7 @@ void loop()
break;
case PROT_SERIAL_DESC:
recv_args((uint8_t *) &sd_args, sizeof(struct serial_desc_args));
recv_serial((uint8_t * ) & sd_args, sizeof(struct serial_desc_args));
Serial.write(PROT_ACK);
state = Usb.getUsbTaskState();
@@ -199,7 +277,7 @@ void loop()
break;
}
Usb.getDevDescr(addr, 0, sizeof(USB_DEVICE_DESCRIPTOR), (uint8_t *) &desc_buf);
get_dev_descriptor();
if(desc_buf.idVendor != sd_args.dev_idVendor ||
desc_buf.idProduct != sd_args.dev_idProduct)
{