summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Gilling <konkers@android.com>2011-02-17 20:40:57 -0800
committerErik Gilling <konkers@android.com>2011-03-08 14:36:25 -0800
commitf3572d731495a784029e746721b3100dca6d1aca (patch)
tree55aa0b336f6522cec4dc1c86f919386a1ffd73c8
parent51f17515b983385dd8db453e8d36732818b2232e (diff)
downloadarduino-f3572d731495a784029e746721b3100dca6d1aca.tar.gz
hack for accessory support
Change-Id: I3938ab854083d65efb31176080d5c859b1154d42
-rw-r--r--USB_Host_Shield/Max3421e.cpp1
-rw-r--r--USB_Host_Shield/Usb.cpp37
-rw-r--r--USB_Host_Shield/Usb.h1
3 files changed, 39 insertions, 0 deletions
diff --git a/USB_Host_Shield/Max3421e.cpp b/USB_Host_Shield/Max3421e.cpp
index 9531fe7..7b0f603 100644
--- a/USB_Host_Shield/Max3421e.cpp
+++ b/USB_Host_Shield/Max3421e.cpp
@@ -194,6 +194,7 @@ void MAX3421E::busprobe( void )
vbusState = SE1;
break;
case( bmSE0 ): //disconnected state
+ regWr( rMODE, bmDPPULLDN|bmDMPULLDN|bmHOST|bmSEPIRQ);
vbusState = SE0;
break;
}//end switch( bus_sample )
diff --git a/USB_Host_Shield/Usb.cpp b/USB_Host_Shield/Usb.cpp
index 197f8cd..3449113 100644
--- a/USB_Host_Shield/Usb.cpp
+++ b/USB_Host_Shield/Usb.cpp
@@ -159,6 +159,43 @@ byte USB::inTransfer( byte addr, byte ep, unsigned int nbytes, char* data, unsig
}
}//while( 1 )
}
+
+int USB::newInTransfer( byte addr, byte ep, unsigned int nbytes, char* data, unsigned int nak_limit )
+{
+ byte rcode;
+ byte pktsize;
+ byte maxpktsize = devtable[ addr ].epinfo[ ep ].MaxPktSize;
+ unsigned int xfrlen = 0;
+ regWr( rHCTL, devtable[ addr ].epinfo[ ep ].rcvToggle ); //set toggle value
+ while( 1 ) { // use a 'return' to exit this loop
+ rcode = dispatchPkt( tokIN, ep, nak_limit ); //IN packet to EP-'endpoint'. Function takes care of NAKS.
+ if( rcode ) {
+ return -1; //should be 0, indicating ACK. Else return error code.
+ }
+ /* check for RCVDAVIRQ and generate error if not present */
+ /* the only case when absense of RCVDAVIRQ makes sense is when toggle error occured. Need to add handling for that */
+ if(( regRd( rHIRQ ) & bmRCVDAVIRQ ) == 0 ) {
+ return -1; //receive error
+ }
+ pktsize = regRd( rRCVBC ); //number of received bytes
+ data = bytesRd( rRCVFIFO, pktsize, data );
+ regWr( rHIRQ, bmRCVDAVIRQ ); // Clear the IRQ & free the buffer
+ xfrlen += pktsize; // add this packet's byte count to total transfer length
+ /* The transfer is complete under two conditions: */
+ /* 1. The device sent a short packet (L.T. maxPacketSize) */
+ /* 2. 'nbytes' have been transferred. */
+ if (( pktsize < maxpktsize ) || (xfrlen >= nbytes )) { // have we transferred 'nbytes' bytes?
+ if( regRd( rHRSL ) & bmRCVTOGRD ) { //save toggle value
+ devtable[ addr ].epinfo[ ep ].rcvToggle = bmRCVTOG1;
+ }
+ else {
+ devtable[ addr ].epinfo[ ep ].rcvToggle = bmRCVTOG0;
+ }
+ return xfrlen;
+ }
+ }//while( 1 )
+}
+
/* OUT transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */
/* Handles NAK bug per Maxim Application Note 4000 for single buffer transfer */
/* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */
diff --git a/USB_Host_Shield/Usb.h b/USB_Host_Shield/Usb.h
index 2d912b8..5b27296 100644
--- a/USB_Host_Shield/Usb.h
+++ b/USB_Host_Shield/Usb.h
@@ -121,6 +121,7 @@ class USB : public MAX3421E {
byte ctrlData( byte addr, byte ep, unsigned int nbytes, char* dataptr, boolean direction, unsigned int nak_limit = USB_NAK_LIMIT );
byte ctrlStatus( byte ep, boolean direction, unsigned int nak_limit = USB_NAK_LIMIT );
byte inTransfer( byte addr, byte ep, unsigned int nbytes, char* data, unsigned int nak_limit = USB_NAK_LIMIT );
+ int newInTransfer( byte addr, byte ep, unsigned int nbytes, char* data, unsigned int nak_limit = USB_NAK_LIMIT);
byte outTransfer( byte addr, byte ep, unsigned int nbytes, char* data, unsigned int nak_limit = USB_NAK_LIMIT );
byte dispatchPkt( byte token, byte ep, unsigned int nak_limit = USB_NAK_LIMIT );
void Task( void );