X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2Fgoodfet.bsl;h=b51fce2581676314872ef0c36e16e231bb15fa70;hp=6c8ee5038c58481f7d5ffb494825dbfb1afaeb77;hb=d08bfd3c7cdc687fd68ba9025702c262665e52d3;hpb=7e2e3f1a4091ba1ca11982f0ba2b09809e298d94 diff --git a/client/goodfet.bsl b/client/goodfet.bsl index 6c8ee50..b51fce2 100755 --- a/client/goodfet.bsl +++ b/client/goodfet.bsl @@ -14,7 +14,7 @@ # JTAG programmer. import sys, time, string, cStringIO, struct -sys.path.append("/usr/lib/tinyos") +#sys.path.append("/usr/lib/tinyos") #We no longer require TinyOS. import serial, os, glob #forked from TinyOS Telos version. @@ -260,7 +260,9 @@ class LowLevel: ERR_CMD_FAILED = "Command failed, is not defined or is not allowed" ERR_BSL_SYNC = "Bootstrap loader synchronization error" ERR_FRAME_NUMBER = "Frame sequence number error." - + + z1 = 0; + def calcChecksum(self, data, length): """Calculates a checksum of "data".""" checksum = 0 @@ -312,8 +314,10 @@ class LowLevel: timeout = self.timeout ) if DEBUG: sys.stderr.write("using serial port %r\n" % self.serialport.portstr) - self.SetRSTpin() #enable power - self.SetTESTpin() #enable power + + if not self.z1: + self.SetRSTpin() #enable power + self.SetTESTpin() #enable power self.serialport.flushInput() self.serialport.flushOutput() @@ -523,6 +527,83 @@ class LowLevel: self.telosI2CWriteByte( 0x90 | (addr << 1) ) self.telosI2CWriteByte( cmdbyte ) self.telosI2CStop() + def writepicROM(self, address, data): + ''' Writes data to @address''' + for i in range(7,-1,-1): + self.picROMclock((address >> i) & 0x01) + self.picROMclock(0) + recbuf = 0 + for i in range(7,-1,-1): + s = ((data >> i) & 0x01) + #print s + if i < 1: + r = not self.picROMclock(s, True) + else: + r = not self.picROMclock(s) + recbuf = (recbuf << 1) + r + + self.picROMclock(0, True) + #k = 1 + #while not self.serial.getCTS(): + # pass + #time.sleep(0.1) + return recbuf + + def readpicROM(self, address): + ''' reads a byte from @address''' + for i in range(7,-1,-1): + self.picROMclock((address >> i) & 0x01) + self.picROMclock(1) + recbuf = 0 + r = 0 + for i in range(7,-1,-1): + r = self.picROMclock(0) + recbuf = (recbuf << 1) + r + self.picROMclock(r) + #time.sleep(0.1) + return recbuf + + def picROMclock(self, masterout, slow = False): + #print "setting masterout to "+str(masterout) + self.serialport.setRTS(masterout) + self.serialport.setDTR(1) + #time.sleep(0.02) + self.serialport.setDTR(0) + if slow: + time.sleep(0.02) + return self.serialport.getCTS() + + def picROMfastclock(self, masterout): + #print "setting masterout to "+str(masterout) + self.serialport.setRTS(masterout) + self.serialport.setDTR(1) + self.serialport.setDTR(0) + time.sleep(0.02) + return self.serialport.getCTS() + + def bslResetZ1(self, invokeBSL=0): + ''' + Applies BSL entry sequence on RST/NMI and TEST/VPP pins + Parameters: + invokeBSL = 1: complete sequence + invokeBSL = 0: only RST/NMI pin accessed + + By now only BSL mode is accessed + ''' + + if DEBUG > 1: sys.stderr.write("* bslReset(invokeBSL=%s)\n" % invokeBSL) + if invokeBSL: + #sys.stderr.write("in Z1 bsl reset...\n") + time.sleep(0.1) + self.writepicROM(0xFF, 0xFF) + time.sleep(0.1) + #sys.stderr.write("z1 bsl reset done...\n") + else: + #sys.stderr.write("in Z1 reset...\n") + time.sleep(0.1) + self.writepicROM(0xFF, 0xFE) + time.sleep(0.1) + #sys.stderr.write("z1 reset done...\n") def telosBReset(self,invokeBSL=0): # "BSL entry sequence at dedicated JTAG pins" @@ -564,6 +645,12 @@ class LowLevel: if self.telosI2C: self.telosBReset(invokeBSL) return + + if self.z1: + if DEBUG > 1: sys.stderr.write("* entering bsl with z1\n") + self.bslResetZ1(invokeBSL) + return + if DEBUG > 1: sys.stderr.write("* bslReset(invokeBSL=%s)\n" % invokeBSL) self.SetRSTpin(1) #power suply @@ -574,8 +661,8 @@ class LowLevel: self.SetTESTpin(0) self.SetRSTpin(0) self.SetTESTpin(1) - self.SetRSTpin(0) #RST pin: GND + if invokeBSL: self.SetTESTpin(1) #TEST pin: GND self.SetTESTpin(0) #TEST pin: Vcc @@ -1138,19 +1225,29 @@ class BootStrapLoader(LowLevel): raise BSLException, "programming without data not possible" def actionFromweb(self): """Grab GoodFET firmware from the web, then flash it.""" - print "Grabbing %x firmware." % self.dev_id; - print "%s" % firmware[self.dev_id]; - fn="/tmp/.goodfet.hex" - os.system("curl %s >%s" % (firmware[self.dev_id],fn)) + # print "Grabbing %x firmware." % self.dev_id; + # print "%s" % firmware[self.dev_id]; + # fn="/tmp/.goodfet.hex" + # os.system("curl %s >%s" % (firmware[self.dev_id],fn)) - fw=Memory(fn); - #fw.loadIhex(open(fn,"rb")); + # fw=Memory(fn); + # #fw.loadIhex(open(fn,"rb")); + + # sys.stderr.write("Program ...\n") + # sys.stderr.flush() + # self.programData(fw, self.ACTION_PROGRAM | self.ACTION_VERIFY) + # sys.stderr.write("%i bytes programmed.\n" % self.byteCtr) + # sys.stderr.flush() + + + print """ +The --fromweb feature is temporarily disabled, pending a rewrite. +Please grab a copy of the appropriate .hex from +http://goodfet.sf.net/dist/ and flash it like so: + +goodfet.bsl -e -p foo.hex +""" - sys.stderr.write("Program ...\n") - sys.stderr.flush() - self.programData(fw, self.ACTION_PROGRAM | self.ACTION_VERIFY) - sys.stderr.write("%i bytes programmed.\n" % self.byteCtr) - sys.stderr.flush() def actionVerify(self): """Verify programmed data""" @@ -1283,10 +1380,13 @@ General options: --swap-reset-test, and --telos-latch --telosb Implies options --swap-reset-test, --telos-i2c, --no-BSL-download, and --speed=38400 + --apimote Implies --swap-reset-test --goodfet10 --goodfet20 --goodfet30 + --goodthopter Same as GF30. --tmote Identical operation to --telosb + --z1 Bootstrap a Z1 --no-BSL-download Do not download replacement BSL (disable automatic) --force-BSL-download Download replacement BSL even if not needed (the one in the device would have the required features) @@ -1386,10 +1486,18 @@ def main(itest=1): bsl.invertRST = 1 bsl.invertTEST = itest - if(os.environ.get("platform")=='telosb'): + if(os.environ.get("board")=='telosb' or + os.environ.get("board")=='telosbbt' or + os.environ.get("platform")=='telosb'): bsl.swapRSTTEST = 1 bsl.telosI2C = 1 mayuseBSL = 0 + if(os.environ.get("board")=='z1' or + os.environ.get("board")=='zolertiaz1'): + bsl.z1 = 1 + if(os.environ.get("board")=='apimote' or os.environ.get("board")=='apimote1'): + bsl.swapRSTTEST = 1; + if comPort is None and os.environ.get("GOODFET")!=None: glob_list = glob.glob(os.environ.get("GOODFET")); @@ -1428,7 +1536,8 @@ def main(itest=1): "swap-reset-test", "telos-latch", "telos-i2c", "telos", "telosb", "tmote","no-BSL-download", "force-BSL-download", "slow", "dumpivt", "dumpinfo", "fromweb", - "goodfet40", "goodfet30", "goodfet20", "goodfet10", + "goodfet40", "goodfet30", "goodthopter", "goodfet20", "goodfet10", + "z1", "nhbadge", "nhbadgeb", "goodfet" ] ) @@ -1576,7 +1685,7 @@ def main(itest=1): elif o in ("--goodfet20", ): bsl.invertRST = 1 bsl.invertTEST = 1 - elif o in ("--goodfet30", ): + elif o in ("--goodfet30", "--goodfet31", "--goodthopter" ): bsl.invertRST = 1 bsl.invertTEST = 0 elif o in ("--goodfet40", ): @@ -1585,6 +1694,8 @@ def main(itest=1): elif o in ("--goodfet", ): bsl.invertRST = 1 bsl.invertTEST = 1 + elif o in ("--apimote",): + bsl.swapRSTTEST = 1; elif o in ("--nhbadge", "--nhbadgeb" ): bsl.invertRST = 1 bsl.invertTEST = 1 @@ -1598,6 +1709,9 @@ def main(itest=1): bsl.telosI2C = 1 mayuseBSL = 0 speed = 38400 + elif o in ("--z1", ): + bsl.z1 = 1 + speed = 38400 elif o in ("--no-BSL-download", ): mayuseBSL = 0 elif o in ("--force-BSL-download", ):