X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2Fgoodfet.maxusbftdi;h=67b7673e0dafef2fa90e88aa5f90dc624f02466d;hp=d25eb28acdbe0337490ebd911a51cd9663a0a87c;hb=0a6754712a364a01d149dc518f44b258a3a37cf8;hpb=ee53514febab9c7a9d341e60ba0f9b9a1dc161d7 diff --git a/client/goodfet.maxusbftdi b/client/goodfet.maxusbftdi index d25eb28..67b7673 100755 --- a/client/goodfet.maxusbftdi +++ b/client/goodfet.maxusbftdi @@ -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();