X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETMAXUSB.py;h=ede1026621b8e21160608f27521622d0d0ef9373;hp=65844d79da9b3def59753657aed77123827e9c72;hb=f7fdc48f01ada713d5034763a2f3395fe2a7c51b;hpb=90b5c7d99bdbf0f07e7a1306189e851d57bedad4 diff --git a/client/GoodFETMAXUSB.py b/client/GoodFETMAXUSB.py index 65844d7..ede1026 100644 --- a/client/GoodFETMAXUSB.py +++ b/client/GoodFETMAXUSB.py @@ -203,7 +203,36 @@ bmHXFRDNIRQ =0x80 class GoodFETMAXUSB(GoodFET): MAXUSBAPP=0x40; + usbverbose=True; + def service_irqs(self): + """Handle USB interrupt events.""" + epirq=self.rreg(rEPIRQ); + usbirq=self.rreg(rUSBIRQ); + + + #Are we being asked for setup data? + if(epirq&bmSUDAVIRQ): #Setup Data Requested + self.wreg(rEPIRQ,bmSUDAVIRQ); #Clear the bit + self.do_SETUP(); + if(epirq&bmOUT1DAVIRQ): #OUT1-OUT packet + self.do_OUT1(); + self.wreg(rEPIRQ,bmOUT1DAVIRQ); #Clear the bit *AFTER* servicing. + if(epirq&bmIN3BAVIRQ): #IN3-IN packet + self.do_IN3(); + #self.wreg(rEPIRQ,bmIN3BAVIRQ); #Clear the bit + if(epirq&bmIN2BAVIRQ): #IN2 packet + self.do_IN2(); + #self.wreg(rEPIRQ,bmIN2BAVIRQ); #Clear the bit + #else: + # print "No idea how to service this IRQ: %02x" % epirq; + def do_IN2(self): + """Overload this.""" + def do_IN3(self): + """Overload this.""" + def do_OUT1(self): + """Overload this.""" + if self.usbverbose: print "Ignoring an OUT1 interrupt."; 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" % ( @@ -258,7 +287,7 @@ class GoodFETMAXUSB(GoodFET): ashex=""; for foo in toret: ashex=ashex+(" %02x"%ord(foo)); - print "GET %02x==%s" % (reg,ashex); + if self.usbverbose: print "GET %02x==%s" % (reg,ashex); return toret; def readbytesAS(self,reg,length): """Peek some bytes from a register, acking prior transfer.""" @@ -268,8 +297,29 @@ class GoodFETMAXUSB(GoodFET): ashex=""; for foo in toret: ashex=ashex+(" %02x"%ord(foo)); - print "GET %02x==%s" % (reg,ashex); + if self.usbverbose: print "GETAS %02x==%s" % (reg,ashex); return toret; + def fifo_ep3in_tx(self,data): + """Sends the data out of EP3 in 64-byte chunks.""" + #Wait for the buffer to be free before starting. + while not(self.rreg(rEPIRQ)&bmIN3BAVIRQ): pass; + + count=len(data); + pos=0; + while count>0: + #Send 64-byte chunks or the remainder. + c=min(count,64); + self.writebytes(rEP3INFIFO, + data[pos:pos+c]); + self.wregAS(rEP3INBC,c); + count=count-c; + pos=pos+c; + + #Wait for the buffer to be free before continuing. + while not(self.rreg(rEPIRQ)&bmIN3BAVIRQ): pass; + + return; + 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 @@ -385,13 +435,13 @@ class GoodFETMAXUSB(GoodFET): data=""; if type(tosend)==str: data=chr((reg<<3)|3)+tosend; - print "PUT %02x:=%s (0x%02x bytes)" % (reg,tosend,len(data)) + if self.usbverbose: print "PUT %02x:=%s (0x%02x bytes)" % (reg,tosend,len(data)) else: data=[(reg<<3)|3]+tosend; ashex=""; for foo in tosend: ashex=ashex+(" %02x"%foo); - print "PUT %02x:=%s (0x%02x bytes)" % (reg,ashex,len(data)) + if self.usbverbose: print "PUT %02x:=%s (0x%02x bytes)" % (reg,ashex,len(data)) self.writecmd(self.MAXUSBAPP,0x00,len(data),data); def usb_connect(self): """Connect the USB port.""" @@ -566,8 +616,48 @@ class GoodFETMAXUSBHost(GoodFETMAXUSB): for c in self.xfrdata[2:len(self.xfrdata)]: if c>0: toret=toret+chr(c); return toret; +class GoodFETMAXUSBDevice(GoodFETMAXUSB): + + 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]); -class GoodFETMAXUSBHID(GoodFETMAXUSB): + 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=ord(self.strDesc[ord(SUD[wValueL])][0]); + ddata=self.strDesc[ord(SUD[wValueL])]; + elif desctype==GD_HID: + #Don't know how to do this yet. + pass; + elif desctype==GD_REPORT: + desclen=self.CD[25]; + ddata=self.RepD; + #TODO Configuration, String, Hid, and Report + + if desclen>0: + #Reduce desclen if asked for fewer bytes. + desclen=min(reqlen,desclen); + #Send those bytes. + self.writebytes(rEP0FIFO,ddata[0:desclen]); + self.wregAS(rEP0BC,desclen); + 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; + configval=ord(SUD[wValueL]); + if(configval>0): + self.SETBIT(rUSBIEN,bmSUSPIE); + self.rregAS(rFNADDR); +class GoodFETMAXUSBHID(GoodFETMAXUSBDevice): """This is an example HID keyboard driver, loosely based on the MAX3420 examples.""" def hidinit(self): @@ -612,14 +702,15 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): """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.rregAS(rFNADDR); + # # 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); elif setuptype==SR_GET_INTERFACE: self.get_interface(SUD); else: print "Stalling Unknown standard setup request type %02x" % setuptype; - self.STALL_EP0(SUD); def get_interface(self,SUD): @@ -736,41 +827,7 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): 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; - configval=ord(SUD[wValueL]); - if(configval>0): - self.SETBIT(rUSBIEN,bmSUSPIE); - self.rregAS(rFNADDR); + def get_status(self,SUD): """Get the USB Setup Status.""" testbyte=ord(SUD[bmRequestType]) @@ -795,19 +852,8 @@ class GoodFETMAXUSBHID(GoodFETMAXUSB): self.STALL_EP0(SUD); else: self.STALL_EP0(SUD); - def service_irqs(self): - """Handle USB interrupt events.""" - - epirq=self.rreg(rEPIRQ); - usbirq=self.rreg(rUSBIRQ); - - #Are we being asked for setup data? - if(epirq&bmSUDAVIRQ): #Setup Data Requested - self.wreg(rEPIRQ,bmSUDAVIRQ); #Clear the bit - self.do_SETUP(); - if(epirq&bmIN3BAVIRQ): #EN3-IN packet - self.do_IN3(); - + + typephase=0; typestring=" Python does USB HID!";