more changes to TX test code
[goodfet] / client / goodfet.maxusbftdi
index d25eb28..67b7673 100755 (executable)
@@ -10,7 +10,7 @@ import time;
 
 from GoodFETMAXUSB import *;
 
-class GoodFETMAXUSBFTDI(GoodFETMAXUSB):
+class GoodFETMAXUSBFTDI(GoodFETMAXUSBDevice):
     """This emulates the FTDI USB to Serial chips."""
     def hidinit(self):
         """Initialize a USB FTDI device."""
@@ -24,6 +24,7 @@ class GoodFETMAXUSBFTDI(GoodFETMAXUSB):
         print "Starting a FTDI device.  This won't return.";
         while 1:
             self.service_irqs();
+            #self.typeletter_empty();
     def do_SETUP(self):
         """Handle USB Enumeration"""
         
@@ -99,14 +100,13 @@ class GoodFETMAXUSBFTDI(GoodFETMAXUSB):
             print "Bullshitting a value for the latency timer."
             #Send some sort of reply.
             self.wreg(rEP0FIFO,0x01);
-            self.wreg(rEP0FIFO,0x00);
-            self.wregAS(rEP0BC,2);
+            #self.wreg(rEP0FIFO,0x00);
+            self.wregAS(rEP0BC,1);
             #Don't send reply twice.
             return;
             
         
-        print "Blindly accepting vendor request";
-        #self.wreg(rEP0FIFO,0);
+        print "Blindly accepting unhandled vendor request %02x" % request;
         self.wregAS(rEP0BC,0);
     def std_request(self,SUD):
         """Handles a standard setup request."""
@@ -135,14 +135,15 @@ class GoodFETMAXUSBFTDI(GoodFETMAXUSB):
 #Device Descriptor
     DD=[0x12,                  # bLength = 18d
         0x01,                  # bDescriptorType = Device (1)
-        0x00,0x01,             # bcdUSB(L/H) USB spec rev (BCD)
+        0x10,0x01,             # bcdUSB(L/H) USB spec rev (BCD)
        0x00,0x00,0x00,         # bDeviceClass, bDeviceSubClass, bDeviceProtocol
        0x40,                   # bMaxPacketSize0 EP0 is 64 bytes
        0x03,0x04,              # idVendor(L/H)--FTDI is 0403
-       0x01,0x60,              # idProduct(L/H)--6001
-       0x34,0x12,              # bcdDevice--1234
+       0x72,0x83,              # idProduct(L/H)--6001
+       0x01,0x00,              # bcdDevice--1234
        1,2,3,                  # iManufacturer, iProduct, iSerialNumber
-       1];
+       1                       # One configuration.
+        ];
 #Configuration Descriptor
     CD=[0x09,                  # bLength
        0x02,                   # bDescriptorType = Config
@@ -161,28 +162,20 @@ class GoodFETMAXUSBFTDI(GoodFETMAXUSB):
        0xFF,                   # bInterfaceClass = FF=vendor
        0xFF,0xFF,              # bInterfaceSubClass, bInterfaceProtocol
        0x02,                   # iInterface
-# HID Descriptor--It's at CD[18]
-       # 0x09,                 # bLength
-       # 0x21,                 # bDescriptorType = HID
-       # 0x10,0x01,            # bcdHID(L/H) Rev 1.1
-       # 0x00,                 # bCountryCode (none)
-       # 0x01,                 # bNumDescriptors (one report descriptor)
-       # 0x22,                 # bDescriptorType       (report)
-       # 43,0,                   # CD[25]: wDescriptorLength(L/H) (report descriptor size is 43 bytes)
-# Endpoint Descriptor
+# IN Endpoint Descriptor
        0x07,                   # bLength
        0x05,                   # bDescriptorType (Endpoint)
        0x83,                   # bEndpointAddress (EP3-IN)             
-       0x02,                   # bmAttributes  (interrupt)
+        0x02,                  # bmAttributes  (bulk)
        64,0,                   # wMaxPacketSize (64)
-       10,
-# Endpoint Descriptor
+       00,
+# OUT Endpoint Descriptor
        0x07,                   # bLength
        0x05,                   # bDescriptorType (Endpoint)
        0x01,                   # bEndpointAddress (EP1-OUT)            
-       0x02,                   # bmAttributes  (interrupt)
+        0x02,                  # bmAttributes  (bulk)
        64,0,                   # wMaxPacketSize (64)
-       10];
+       00];
     strDesc=[
 # STRING descriptor 0--Language string
 "\x04\x03\x09\x04",
@@ -198,57 +191,8 @@ class GoodFETMAXUSBFTDI(GoodFETMAXUSB):
 # STRING descriptor 3 - Serial Number ID
 "\x14\x03S\x00/\x00N\x00 \x003\x004\x002\x000\x00E\x00"
 ];
-    RepD=[
-        0x05,0x01,             # Usage Page (generic desktop)
-       0x09,0x06,              # Usage (keyboard)
-       0xA1,0x01,              # Collection
-       0x05,0x07,              #   Usage Page 7 (keyboard/keypad)
-       0x19,0xE0,              #   Usage Minimum = 224
-       0x29,0xE7,              #   Usage Maximum = 231
-       0x15,0x00,              #   Logical Minimum = 0
-       0x25,0x01,              #   Logical Maximum = 1
-       0x75,0x01,              #   Report Size = 1
-       0x95,0x08,              #   Report Count = 8
-       0x81,0x02,              #  Input(Data,Variable,Absolute)
-       0x95,0x01,              #   Report Count = 1
-       0x75,0x08,              #   Report Size = 8
-       0x81,0x01,              #  Input(Constant)
-       0x19,0x00,              #   Usage Minimum = 0
-       0x29,0x65,              #   Usage Maximum = 101
-       0x15,0x00,              #   Logical Minimum = 0,
-       0x25,0x65,              #   Logical Maximum = 101
-       0x75,0x08,              #   Report Size = 8
-       0x95,0x01,              #   Report Count = 1
-       0x81,0x00,              #  Input(Data,Variable,Array)
-       0xC0]
-    def send_descriptor(self,SUD):
-        """Send the USB descriptors based upon the setup data."""
-        desclen=0;
-        reqlen=ord(SUD[wLengthL])+256*ord(SUD[wLengthH]); #16-bit length
-        desctype=ord(SUD[wValueH]);
-        
-        if desctype==GD_DEVICE:
-            desclen=self.DD[0];
-            ddata=self.DD;
-        elif desctype==GD_CONFIGURATION:
-            desclen=self.CD[2];
-            ddata=self.CD;
-        elif desctype==GD_STRING:
-            desclen=self.strDesc[ord(SUD[wValueL])][0];
-            ddata=self.strDesc[ord(SUD[wValueL])];
-        elif desctype==GD_REPORT:
-            desclen=self.CD[25];
-            ddata=self.RepD;
-        
-        #TODO Configuration, String, Hid, and Report
-        
-        if desclen>0:
-            sendlen=min(reqlen,desclen);
-            self.writebytes(rEP0FIFO,ddata);
-            self.wregAS(rEP0BC,sendlen);
-        else:
-            print "Stalling in send_descriptor() for lack of handler for %02x." % desctype;
-            self.STALL_EP0(SUD);
+
+
     def set_configuration(self,SUD):
         """Set the configuration."""
         bmSUSPIE=0x10;
@@ -292,19 +236,21 @@ class GoodFETMAXUSBFTDI(GoodFETMAXUSB):
             self.do_SETUP();
         elif(epirq&bmIN3BAVIRQ): #EN3-IN packet
             self.do_IN3();
+            #self.wreg(rEPIRQ,bmIN3BAVIRQ); #Clear the bit
         elif(epirq&bmOUT1DAVIRQ): #OUT1-OUT packet
             self.do_OUT1();
-            self.wreg(rEPIRQ,bmOUT1DAVIRQ); #Clear the bit *AFTER* servicing.
+            self.wregAS(rEPIRQ,bmOUT1DAVIRQ); #Clear the bit *AFTER* servicing.
+        #else:
+        #    self.do_IN3();
     
-    
-    typestring="GoodFET emulates FTDI properly, if you can read this!";
+    typestring="GoodFET emulates FTDI properly, if you can read this!\n";
     typepos=0;
     
     def type_IN3(self):
         """Type next letter in buffer."""
         if self.typepos>=len(self.typestring):
             self.typepos=0;
-            self.typeletter(0);
+            self.typeletter(' ');
         else:
             self.typeletter(self.typestring[self.typepos]);
             self.typepos=self.typepos+1;
@@ -312,23 +258,22 @@ class GoodFETMAXUSBFTDI(GoodFETMAXUSB):
     def typeletter(self,key):
         """Type a letter on IN3.  Zero for keyup."""
         if type(key)==str: key=ord(key);
-        #Send a key-up.
-        self.wreg(rEP3INFIFO,0);
-        self.wreg(rEP3INFIFO,0);
+        
+        self.wreg(rEP3INFIFO,0x01);      #Modem Status
+        self.wreg(rEP3INFIFO,0x00);      #Line Status
         self.wreg(rEP3INFIFO,key);
-        self.wreg(rEP3INBC,3);
+        self.wregAS(rEP3INBC,3);
     def do_IN3(self):
         """Handle IN3 input event."""
         #Don't bother clearing interrupt flag, that's done by sending the reply.
-        #print "Got an input event, sending back some garbage that might be right.";
         self.type_IN3();
     def do_OUT1(self):
         """Handle an OUT1 output event."""
         print "Got an output event, printing the result.";
         l=self.rreg(rEP1OUTBC);
-        frame=self.readbytes(rEP1OUTFIFO,l);
-        print "FTDI OUT: %s" % frame;
-
+        frame=self.readbytesAS(rEP1OUTFIFO,l);
+        print "FTDI OUT: %s" % frame[1:len(frame)];
+        #self.type_IN3();
 
 #Initialize FET and set baud rate
 client=GoodFETMAXUSBFTDI();