Working arduino control requests, still kind of clunky
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user