#!/usr/bin/env python
-# GoodFET Client Application
+# GoodFET Debugger
#
# (C) 2009 Travis Goodspeed <travis at radiantmachines.com>
#
-# This code is ugly as sin, for bootstrapping the firmware only.
-# Rewrite cleanly as soon as is convenient.
+# This code is being rewritten and refactored. You've been warned!
-import sys, time, string, cStringIO, struct
-sys.path.append("/usr/lib/tinyos")
-import serial
+import sys, os, code, binascii;
+#import rlcompleter, readline;
+from GoodFET import GoodFET, getClient;
+from GoodFETConsole import GoodFETConsole;
-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]);
+from intelhex import IntelHex;
-client=Client();
-client.serInit("/dev/ttyUSB0")
+if(len(sys.argv)==1):
+ print "Usage: %s [driver|verb]\n" % sys.argv[0];
+ print "driver:= monitor | cc | avr | spi | msp430 | nrf";
+ print "verb:= scan";
+ print "";
+ print "This is an unfinished client. You probably want goodfet.$chip instead.";
+ sys.exit(1);
+
+verb=sys.argv[1];
+if verb=="scan":
+ from scanwin32 import *;
+ # INIT COMPORT SCAN
+ scan=winScan();
+ #scan.comports();
+
+ for order, port, desc, hwid in sorted(scan.comports()):
+ # Look for FTDIBUS
+ try:
+ #hwid.index('FTDI')
+ #print "*************"
+ #print "GOODFET FOUND"
+ #print "*************"
+ if hwid.index('FTDI')!=0: continue;
+ print "%s: (%s)" % (port, hwid),
+ try:
+ serial.Serial(port)
+ except serial.serialutil.SerialException:
+ print "Busy"
+ else:
+ print "Ready"
+ except:
+ pass
+ sys.exit(0);
-client.monitortest();
+driver=sys.argv[1];
+print "Using driver %s" % driver;
+#client=eval("%s()" % driver);
+client=getClient(driver);
+console=client.getConsole();
+console.run();
-client.spisetup();
-while 1:
- print "%02x" % client.spitrans8(5);
- time.sleep(0.1);
+sys.exit(0);