IR_SHIFT = 0x80
DR_SHIFT = 0x81
RESETTAP = 0x82
-RESETTARGET = 0x86
+RESETTARGET = 0x83
GET_REGISTER = 0x87
SET_REGISTER = 0x88
DEBUG_INSTR = 0x89
WARNING: Addresses must be word-aligned!
"""
regs = self.ARMget_registers()
+ self.ARMset_registers([0xdeadbeef for x in xrange(14)], 0xe)
output = []
count = wordcount
while (wordcount > 0):
0x02 : "force dbgrq",
0x01 : "force dbgack"
}
-
+ def ARMgetChipID(self):
+ chipid = self.ARMreadMem(SF_CHIP_ID,1)
+ return chipid[0]
+ def ARMwriteFirmware(self, firmware):
+ self.halt()
+ chipid = self.ARMgetChipID()
+ # FIXME: initialize PLL or EBI
+ self.ARMmassErase(chipid)
+ self.ARMset_regCPSR(PM_svc) # set supervisor mode
+ # FIXME: download the "flash identifier" program into target RAM
+ self.ARMsetPC(PROGGYBASE)
+ self.release()
+ # get manufacturer crap through DCC (really?? screw this...)
+ self.halt()
+ if (self.ARMget_regCPSR() & PM_svc != PM_svc):
+ raise Exception("No longer in Supervisor mode after firmware upload")
+ # FIXME: download the downloader program into target RAM
+ self.ARMsetPC(PROGGYBASE)
+ self.release()
+ # FIXME: use DCC to upload the new firmware
+ def ARMresettarget(self, delay=10):
+ return self.writecmd(0x13,RESETTARGET,2, [ delay&0xff, (delay>>8)&0xff ] )
def ARMchain0(self, address, bits=0x819684c054, data=0):
bulk = chop(address,4)
bulk.extend(chop(bits,8))
CCversions={0x0100:"cc1110",
+ 0x1100:"cc1111",
0x8500:"cc2430",
0x8900:"cc2431",
0x8100:"cc2510",
0xB500:"cc2531",
0xFF00:"CCmissing"};
CCpagesizes={0x01: 1024, #"CC1110",
+ 0x11: 1024, #"CC1111",
0x85: 2048, #"CC2430",
0x89: 2048, #"CC2431",
0x81: 1024, #"CC2510",
def CCidentstr(self):
ident=self.CCident();
chip=self.CCversions.get(ident&0xFF00);
- return "%s/r%02x" % (chip, ident&0xFF);
+ pagesize=self.CCpagesizes.get(ident>0xFF);
+ return "%s/r%0.4x/ps0x%0.4x" % (chip, ident,pagesize);
def CCident(self):
"""Get a chipcon's ID."""
self.writecmd(self.APP,0x8B,0,None);
size=self.CCpagesizes.get(chip);
if(size<10):
print "ERROR: Pagesize undefined.";
- print "chip=%02x" %chip;
+ print "chip=%0.4x" %chip;
sys.exit(1);
#return 2048;
return size;