X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETMAXUSB.py;h=c20a74830ee660f6fd21710293d1d6850bb84dd6;hp=af95558d39974329cea2ed74ad90acbe804c2178;hb=f4a366d95f96109559f0903611d7103c50cde3f7;hpb=8054b4395579a672cb6401b1ac89b38be9c13743;ds=sidebyside diff --git a/client/GoodFETMAXUSB.py b/client/GoodFETMAXUSB.py index af95558..c20a748 100644 --- a/client/GoodFETMAXUSB.py +++ b/client/GoodFETMAXUSB.py @@ -203,6 +203,7 @@ bmHXFRDNIRQ =0x80 class GoodFETMAXUSB(GoodFET): MAXUSBAPP=0x40; + usbverbose=False; def service_irqs(self): """Handle USB interrupt events.""" @@ -231,7 +232,7 @@ class GoodFETMAXUSB(GoodFET): """Overload this.""" def do_OUT1(self): """Overload this.""" - print "Ignoring an OUT1 interrupt."; + 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" % ( @@ -244,6 +245,8 @@ class GoodFETMAXUSB(GoodFET): def MAXUSBsetup(self): """Move the FET into the MAXUSB application.""" self.writecmd(self.MAXUSBAPP,0x10,0,self.data); #MAXUSB/SETUP + self.writecmd(self.MAXUSBAPP,0x10,0,self.data); #MAXUSB/SETUP + self.writecmd(self.MAXUSBAPP,0x10,0,self.data); #MAXUSB/SETUP print "Connected to MAX342x Rev. %x" % (self.rreg(rREVISION)); self.wreg(rPINCTL,0x18); #Set duplex and negative INT level. @@ -286,7 +289,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.""" @@ -296,8 +299,29 @@ class GoodFETMAXUSB(GoodFET): ashex=""; for foo in toret: ashex=ashex+(" %02x"%ord(foo)); - print "GETAS %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 @@ -370,7 +394,7 @@ class GoodFETMAXUSB(GoodFET): self.wreg(rHIRQ,bmRCVDAVIRQ); #Clear IRQ xfrlen=xfrlen+pktsize; #Add byte count to total transfer length. - print "%i / %i" % (xfrlen,xfrsize) + #print "%i / %i" % (xfrlen,xfrsize) #Packet is complete if: # 1. The device sent a short packet, ?', # LeftShift + '', # LeftCtrl & LeftShift + ' abc'], # LeftAlt + 'Dvorak' :[ ' axje.uidchtnmbrl\'poygk,qf;1234567890\n\t []/=\\\\s-`wvz', + '''        ''', # LeftCtrl + ' AXJE UIDCHTNMBRL"POYGK='a' and a<='z': - return ord(a)-ord('a')+4; - elif a>='A' and a<='Z': - return ord(a)-ord('A')+4; - elif a==' ': - return 0x2C; #space - else: - return 0; #key-up + if type(ascii)!=str: + return (0,0); # Send NoEvent if not passed a character + if ascii==' ': + return (0,0x2C); # space + for modset in self.keymap(): + keycode=modset.find(ascii); + if keycode != -1: + modifier = self.keymap().index(modset) + return (modifier, keycode); + return (0,0); def type_IN3(self): - """Type next letter in buffer.""" - if self.typepos>=len(self.typestring): - self.typeletter(0); - elif self.typephase==0: - self.typephase=1; - self.typeletter(0); - else: - typephase=0; - self.typeletter(self.typestring[self.typepos]); - self.typepos=self.typepos+1; - return; + """Type next letter in buffer.""" + string=self.typestring(); + if self.typepos>=len(string): + self.typeletter(0); # Send NoEvent to indicate key-up + exit(0); + self.typepos=0; # Repeat typestring forever! + # This would be a great place to enable a typethrough mode so the host operator can control the target + else: + if self.usbverbose: + sys.stdout.write(string[self.typepos]); + sys.stdout.flush(); + self.typeletter(string[self.typepos]); + self.typepos+=1; + return; 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); + mod=0; + if type(key)==str: + (mod, key) = self.asc2hid(key); + self.wreg(rEP3INFIFO,mod); self.wreg(rEP3INFIFO,0); - self.wreg(rEP3INFIFO,self.asc2hid(key)); + self.wreg(rEP3INFIFO,key); self.wreg(rEP3INBC,3); def do_IN3(self): """Handle IN3 event.""" #Don't bother clearing interrupt flag, that's done by sending the reply. - self.type_IN3(); + if self.OsLastConfigType != -1: # Wait for some configuration before stuffing keycodes down the pipe + self.type_IN3();