X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETMAXUSB.py;h=65844d79da9b3def59753657aed77123827e9c72;hp=30fb06e430b05a66f9f864f5c4a30cf212222337;hb=3ce193dd33e5e9e4c16989d85b8fb15715b139de;hpb=35580fd76085fbc1c80000097cbd72e34ad5edee diff --git a/client/GoodFETMAXUSB.py b/client/GoodFETMAXUSB.py index 30fb06e..65844d7 100644 --- a/client/GoodFETMAXUSB.py +++ b/client/GoodFETMAXUSB.py @@ -90,7 +90,7 @@ GD_STRING =0x03 # Get device descriptor: String GD_HID =0x21 # Get descriptor: HID GD_REPORT =0x22 # Get descriptor: Report -# SETUP packet offsets +# SETUP packet header offsets bmRequestType =0 bRequest =1 wValueL =2 @@ -203,6 +203,16 @@ bmHXFRDNIRQ =0x80 class GoodFETMAXUSB(GoodFET): MAXUSBAPP=0x40; + + def setup2str(self,SUD): + """Converts the header of a setup packet to a string.""" + return "bmRequestType=0x%02x, bRequest=0x%02x, wValue=0x%04x, wIndex=0x%04x, wLength=0x%04x" % ( + ord(SUD[0]), ord(SUD[1]), + ord(SUD[2])+(ord(SUD[3])<<8), + ord(SUD[4])+(ord(SUD[5])<<8), + ord(SUD[6])+(ord(SUD[7])<<8) + ); + def MAXUSBsetup(self): """Move the FET into the MAXUSB application.""" self.writecmd(self.MAXUSBAPP,0x10,0,self.data); #MAXUSB/SETUP @@ -250,6 +260,16 @@ class GoodFETMAXUSB(GoodFET): ashex=ashex+(" %02x"%ord(foo)); print "GET %02x==%s" % (reg,ashex); return toret; + def readbytesAS(self,reg,length): + """Peek some bytes from a register, acking prior transfer.""" + data=[(reg<<3)|1]+range(0,length); + self.writecmd(self.MAXUSBAPP,0x00,len(data),data); + toret=self.data[1:len(self.data)]; + ashex=""; + for foo in toret: + ashex=ashex+(" %02x"%ord(foo)); + print "GET %02x==%s" % (reg,ashex); + return toret; def ctl_write_nd(self,request): """Control Write with no data stage. Assumes PERADDR is set and the SUDFIFO contains the 8 setup bytes. Returns with @@ -318,9 +338,11 @@ class GoodFETMAXUSB(GoodFET): #Very innefficient, move this to C if performance is needed. for j in range(0,pktsize): self.xfrdata=self.xfrdata+[self.rreg(rRCVFIFO)]; + xfrsize=self.xfrdata[0]; self.wreg(rHIRQ,bmRCVDAVIRQ); #Clear IRQ xfrlen=xfrlen+pktsize; #Add byte count to total transfer length. + print "%i / %i" % (xfrlen,xfrsize) #Packet is complete if: # 1. The device sent a short packet, 0: toret=toret+chr(c); return toret; @@ -540,7 +572,9 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): MAX3420 examples.""" def hidinit(self): """Initialize a USB HID device.""" + self.usb_disconnect(); self.usb_connect(); + self.hidrun(); def hidrun(self): @@ -555,7 +589,8 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): SUD=self.readbytes(rSUDFIFO,8); #Parse the SETUP packet - print "Handling a setup packet type 0x%02x" % ord(SUD[bmRequestType]); + print "Handling a setup packet of %s" % self.setup2str(SUD); + setuptype=(ord(SUD[bmRequestType])&0x60); if setuptype==0x00: self.std_request(SUD); @@ -565,19 +600,19 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): self.vendor_request(SUD); else: print "Unknown request type 0x%02x." % ord(SUD[bmRequestType]) - self.STALL_EP0(); + self.STALL_EP0(SUD); def class_request(self,SUD): """Handle a class request.""" print "Stalling a class request."; - self.STALL_EP0(); + self.STALL_EP0(SUD); def vendor_request(self,SUD): print "Stalling a vendor request."; - self.STALL_EP0(); + self.STALL_EP0(SUD); def std_request(self,SUD): """Handles a standard setup request.""" setuptype=ord(SUD[bRequest]); if setuptype==SR_GET_DESCRIPTOR: self.send_descriptor(SUD); - elif setuptype==SR_SET_FEATURE: self.feature(1); + #elif setuptype==SR_SET_FEATURE: self.feature(1); elif setuptype==SR_SET_CONFIGURATION: self.set_configuration(SUD); elif setuptype==SR_GET_STATUS: self.get_status(SUD); elif setuptype==SR_SET_ADDRESS: self.rregAS(rFNADDR); @@ -585,7 +620,7 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): else: print "Stalling Unknown standard setup request type %02x" % setuptype; - self.STALL_EP0(); + self.STALL_EP0(SUD); def get_interface(self,SUD): """Handles a setup request for SR_GET_INTERFACE.""" @@ -593,9 +628,9 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): self.wreg(rEP0FIFO,0); self.wregAS(rEP0BC,1); else: - self.STALL_EP0(); + self.STALL_EP0(SUD); - #Device Descriptor +#Device Descriptor DD=[0x12, # bLength = 18d 0x01, # bDescriptorType = Device (1) 0x00,0x01, # bcdUSB(L/H) USB spec rev (BCD) @@ -606,7 +641,7 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): 0x34,0x12, # bcdDevice--1234 1,2,3, # iManufacturer, iProduct, iSerialNumber 1]; - #Configuration Descriptor +#Configuration Descriptor CD=[0x09, # bLength 0x02, # bDescriptorType = Config 0x22,0x00, # wTotalLength(L/H) = 34 bytes @@ -728,7 +763,7 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): self.wregAS(rEP0BC,sendlen); else: print "Stalling in send_descriptor() for lack of handler for %02x." % desctype; - self.STALL_EP0(); + self.STALL_EP0(SUD); def set_configuration(self,SUD): """Set the configuration.""" bmSUSPIE=0x10; @@ -757,9 +792,9 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): self.wreg(rEP0FIFO,0x00); #Second byte is always zero. self.wregAS(rEP0BC,2); else: - self.STALL_EP0(); + self.STALL_EP0(SUD); else: - self.STALL_EP0(); + self.STALL_EP0(SUD); def service_irqs(self): """Handle USB interrupt events."""