#!/usr/bin/env python # GoodFET Client Application # # (C) 2009 Travis Goodspeed # # This code is ugly as sin, for bootstrapping the firmware only. # Rewrite cleanly as soon as is convenient. import sys, time, string, cStringIO, struct sys.path.append("/usr/lib/tinyos") import serial class Client: def __init__(self, *args, **kargs): print "inited\n"; def timeout(self): print "timout\n"; def serInit(self, port): """Open the serial port""" self.serialport = serial.Serial( port, 9600, parity = serial.PARITY_NONE ) #Drop DTR, which is !RST, low to begin the app. self.serialport.setDTR(0); self.serialport.flushInput() self.serialport.flushOutput() #Read and handle the initial command. time.sleep(1); client.readcmd(); #Read the first command. if(self.verb!=0x7F): print "Verb is wrong. Incorrect firmware?"; def writecmd(self, app, verb, count, data): """Write a command and some data to the GoodFET.""" self.serialport.write(chr(app)); self.serialport.write(chr(verb)); self.serialport.write(chr(count)); #print "count=%02x, len(data)=%04x" % (count,len(data)); if count!=0: for d in data: self.serialport.write(chr(d)); self.readcmd(); #Uncomment this later, to ensure a response. def readcmd(self): """Read a reply from the GoodFET.""" self.app=ord(self.serialport.read(1)); self.verb=ord(self.serialport.read(1)); self.count=ord(self.serialport.read(1)); if self.count>0: self.data=self.serialport.read(self.count); #print "%02x %02x %02x" % (self.app, self.verb, self.count); #Monitor stuff def peekbyte(self,address): """Read a byte of memory from the monitor.""" self.data=[address&0xff,address>>8]; self.writecmd(0,0x02,2,self.data); #self.readcmd(); return ord(self.data[0]); def peekword(self,address): """Read a word of memory from the monitor.""" return self.peekbyte(address)+(self.peekbyte(address+1)<<8); def pokebyte(self,address,value): """Set a byte of memory by the monitor.""" self.data=[address&0xff,address>>8,value]; self.writecmd(0,0x03,3,self.data); return ord(self.data[0]); def monitortest(self): """Self-test several functions through the monitor.""" print "Performing self-test."; if self.peekword(0x0c00)!=0x0c04: print "ERROR Fetched wrong value from 0x0c04."; self.pokebyte(0x0021,0); #Drop LED if self.peekbyte(0x0021)!=0: print "ERROR, P1OUT not cleared."; self.pokebyte(0x0021,1); #Light LED print "Self-test complete."; def spisetup(self): """Moved the FET into the SPI application.""" print "Initializing SPI."; self.writecmd(1,0x10,0,self.data); #SPI/SETUP #self.readcmd(); def spitrans8(self,byte): """Read and write 8 bits by SPI.""" self.data=[byte]; self.writecmd(1,0,1,self.data); #SPI exchange #self.readcmd(); if self.app!=1 or self.verb!=0: print "Error in SPI transaction; app=%02x, verb=%02x" % (self.app, self.verb); return ord(self.data[0]); client=Client(); client.serInit("/dev/ttyUSB0") client.monitortest(); client.spisetup(); while 1: print "%02x" % client.spitrans8(5); time.sleep(0.1);