X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETARM7.py;h=5a23466b373f9ec114a86f8a4c2a053d6a8bbaae;hp=fcc2d774cc6a6d8e9848fd41aa1489674d5358de;hb=ebceb79b821ebdd7a68e07ff4488789f0bf68105;hpb=cd34fb40f79423b3aef65291d6b970a06b13d2f4 diff --git a/client/GoodFETARM7.py b/client/GoodFETARM7.py index fcc2d77..5a23466 100644 --- a/client/GoodFETARM7.py +++ b/client/GoodFETARM7.py @@ -45,6 +45,8 @@ CHAIN0 = 0x93 SCANCHAIN1 = 0x94 EICE_READ = 0x95 EICE_WRITE = 0x96 +SCAN_N_SIZE = 0x9e +IR_SIZE = 0x9f IR_EXTEST = 0x0 IR_SCAN_N = 0x2 @@ -214,19 +216,23 @@ class GoodFETARM7(GoodFET): self.flags = 0xffffffff self.nothing = 0xffffffff self.stored_regs = [] + def __del__(self): try: if (self.ARMget_dbgstate()&9) == 9: self.resume() except: sys.excepthook(*sys.exc_info()) + def setup(self): """Move the FET into the JTAG ARM application.""" #print "Initializing ARM." self.writecmd(0x13,SETUP,0,self.data) + def flash(self,file): """Flash an intel hex file to code memory.""" print "Flash not implemented."; + def dump(self,fn,start=0,stop=0xffffffff): """Dump an intel hex file from code memory.""" @@ -248,48 +254,68 @@ class GoodFETARM7(GoodFET): h.write_hex_file(fn); print "Dump not implemented."; + + def ARMsetIRsize(self, size=4): + if size > 255: + raise Exception("IR size cannot be >255!!") + self.writecmd(0x13, IR_SIZE, 1, [size]) + + def ARMsetSCANsize(self, size=4): + if size > 255: + raise Exception("IR size cannot be >255!!") + self.writecmd(0x13, SCAN_N_SIZE, 1, [size]) + def ARMshift_IR(self, IR, noretidle=0): self.writecmd(0x13,IR_SHIFT,2, [IR, LSB|noretidle]) return self.data + def ARMshift_DR(self, data, bits, flags): self.writecmd(0x13,DR_SHIFT,14,[bits&0xff, flags&0xff, 0, 0, data&0xff,(data>>8)&0xff,(data>>16)&0xff,(data>>24)&0xff, (data>>32)&0xff,(data>>40)&0xff,(data>>48)&0xff,(data>>56)&0xff,(data>>64)&0xff,(data>>72)&0xff]) return self.data + def ARMshift_DR_more(self, data, bits, flags): self.writecmd(0x13,DR_SHIFT_MORE,14,[bits&0xff, flags&0xff, 0, 0, data&0xff,(data>>8)&0xff,(data>>16)&0xff,(data>>24)&0xff, (data>>32)&0xff,(data>>40)&0xff,(data>>48)&0xff,(data>>56)&0xff,(data>>64)&0xff,(data>>72)&0xff]) return self.data + def ARMwaitDBG(self, timeout=0xff): self.current_dbgstate = self.ARMget_dbgstate() while ( not ((self.current_dbgstate & 9L) == 9)): timeout -=1 self.current_dbgstate = self.ARMget_dbgstate() return timeout + def ARMident(self): """Get an ARM's ID.""" self.ARMshift_IR(IR_IDCODE,0) self.ARMshift_DR(0,32,LSB) retval = struct.unpack("> 28) partno = (ident >> 12) & 0xffff mfgid = (ident >> 1) & 0x7ff return "Chip IDCODE: 0x%x\tver: %x\tpartno: %x\tmfgid: %x" % (ident, ver, partno, mfgid); + def ARMeice_write(self, reg, val): data = chop(val,4) data.extend([reg]) retval = self.writecmd(0x13, EICE_WRITE, 5, data) return retval + def ARMeice_read(self, reg): self.writecmd(0x13, EICE_READ, 1, [reg]) retval, = struct.unpack(">8)&0xff, (val>>16)&0xff, val>>24, reg,0,0,0]) retval = struct.unpack(">sys.stderr,"Debug Status:\t%s\n" % self.statusstr() #print >>sys.stderr,"CPSR: (%s) %s"%(self.ARMget_regCPSRstr()) - #resume = ARMreleasecpu - def resettap(self): self.writecmd(0x13, RESETTAP, 0,[]) @@ -523,38 +559,6 @@ class GoodFETARM7(GoodFET): self.ARMset_register(0, r0) return(val) - ''' - def ARMreadMem(self, adr, wrdcount=1): - retval = [] - r0 = self.ARMget_register(0); # store R0 and R1 - r1 = self.ARMget_register(1); - #print >>sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR()) - self.ARMset_register(0, adr); # write address into R0 - self.ARMset_register(1, 0xdeadbeef) - for word in range(adr, adr+(wrdcount*4), 4): - #sys.stdin.readline() - self.ARM_nop(0) - self.ARM_nop(1) - self.ARMdebuginstr(ARM_READ_MEM, 0); # push LDR R1, [R0], #4 into instruction pipeline (autoincrements for consecutive reads) - self.ARM_nop(0) - self.ARMrestart() - self.ARMwaitDBG() - #print hex(self.ARMget_register(1)) - - # FIXME: this may end up changing te current debug-state. should we compare to current_dbgstate? - #print repr(self.data[4]) - if (len(self.data)>4 and self.data[4] == '\x00'): - print >>sys.stderr,("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE") - raise Exception("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE") - return (-1); - else: - retval.append( self.ARMget_register(1) ) # read memory value from R1 register - #print >>sys.stderr,("CPSR: %x\t\tR0: %x\t\tR1: %x"%(self.ARMget_regCPSR(),self.ARMget_register(0),self.ARMget_register(1))) - self.ARMset_register(1, r1); # restore R0 and R1 - self.ARMset_register(0, r0); - return retval - ''' - def ARMreadStream(self, addr, bytecount): baseaddr = addr & 0xfffffffc endaddr = ((addr + bytecount + 3) & 0xfffffffc) @@ -627,13 +631,6 @@ class GoodFETARM7(GoodFET): # FIXME: handle the rest of the wordcount here. self.ARMset_registers(regs,0xe) - '''def ARMreadStream(self, adr, bytecount): - #data = [struct.unpack(">sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR()) - for widx in xrange(len(wordarray)): - address = adr + (widx*4) - word = wordarray[widx] - self.ARMset_register(0, address); # write address into R0 - self.ARMset_register(1, word); # write address into R0 - self.ARM_nop(0) - self.ARM_nop(1) - self.ARMdebuginstr(instr, 0); # push STR R1, [R0], #4 into instruction pipeline (autoincrements for consecutive writes) - self.ARM_nop(0) - self.ARMrestart() - self.ARMwaitDBG() - #print >>sys.stderr,hex(self.ARMget_register(1)) - self.ARMset_register(1, r1); # restore R0 and R1 - self.ARMset_register(0, r0); - ''' ARMwriteMem = ARMwriteChunk def ARMwriteStream(self, addr, datastr):