#!/usr/bin/env python #GoodFET Chipcon SPI Client # (C) 2011 Travis Goodspeed #N.B., #Might be CC2420 Specific import sys; import binascii; import array, time; from GoodFETCCSPI import GoodFETCCSPI; if(len(sys.argv)==1): print "Usage: %s verb [objects]\n" % sys.argv[0]; print "%s info" % sys.argv[0]; print "%s regs" % sys.argv[0]; print "%s test" % sys.argv[0]; print "%s peek 0x$start [0x$stop]" % sys.argv[0]; print "%s poke 0x$adr 0x$val" % sys.argv[0]; print "%s txtest" % sys.argv[0]; print "\n%s rssi" % sys.argv[0]; print "%s sniff [chan]" % sys.argv[0]; print "%s bsniff [chan]" % sys.argv[0]; print "%s sniffdissect" % sys.argv[0]; sys.exit(); #Initialize FET and set baud rate client=GoodFETCCSPI(); client.serInit() client.setup(); #Dummy read. #Might read as all ones if chip has a startup delay. if(sys.argv[1]=="carrier"): if len(sys.argv)>2: client.RF_setfreq(eval(sys.argv[2])); while 1: client.RF_carrier(); while(1): time.sleep(1); if(sys.argv[1]=="modulated_spectrum"): if len(sys.argv)>2: client.RF_setfreq(eval(sys.argv[2])); while 1: client.RF_modulated_spectrum(); while(1): time.sleep(1); if(sys.argv[1]=="info"): print "Found %s" % client.identstr(); print "Freq: %05f MHz" % (client.RF_getfreq()/(10**6)); print "Status: %s" % client.status(); if(sys.argv[1]=="regs"): for adr in range(0x10,0x40): #*1024): val=client.peek(adr); print "%04x:=0x%04x" % (adr,val); if(sys.argv[1]=="test"): data=client.trans([0x20, 0xde, 0xad]); print "%02x %02x" % (ord(data[1]), ord(data[2])); data=client.trans([0x40|0x20, 0xde, 0xad]); print "%02x %02x" % (ord(data[1]), ord(data[2])); if(sys.argv[1]=="rssi"): if len(sys.argv)>2: freq=eval(sys.argv[2]); if freq>100: client.RF_setfreq(freq); else: client.RF_setchan(freq); print "Listening on %f MHz." % (client.RF_getfreq()/10.0**6); client.strobe(0x02); #Calibrate time.sleep(1); while 1: client.CC_RFST_RX(); #client.strobe(0x03); #SRXON rssi=client.RF_getrssi(); #client.CC_RFST_IDLE(); #idle time.sleep(0.01); string=""; for foo in range(0,rssi>>2): string=("%s."%string); print "%02x %04i %s" % (rssi,rssi, string); if(sys.argv[1]=="sniff" or sys.argv[1]=="sniffdissect"): #Promiscuous mode. client.RF_promiscuity(1); if len(sys.argv)>2: freq=eval(sys.argv[2]); if freq>100: client.RF_setfreq(freq); else: client.RF_setchan(freq); client.CC_RFST_RX(); print "Listening as %010x on %i MHz" % (client.RF_getsmac(), client.RF_getfreq()/10**6); #Now we're ready to get packets. while 1: packet=None; while packet==None: packet=client.RF_rxpacket(); if sys.argv[1]=="sniffdissect": client.printdissect(packet); else: client.printpacket(packet); sys.stdout.flush(); if(sys.argv[1]=="bsniff"): #Just broadcast. client.RF_promiscuity(0); client.RF_setsmac(0xFFFFFFFF); if len(sys.argv)>2: freq=eval(sys.argv[2]); if freq>100: client.RF_setfreq(freq); else: client.RF_setchan(freq); client.CC_RFST_RX(); print "Listening as %010x on %i MHz" % (client.RF_getsmac(), client.RF_getfreq()/10**6); #Now we're ready to get packets. while 1: packet=None; while packet==None: packet=client.RF_rxpacket(); client.printpacket(packet); sys.stdout.flush(); if(sys.argv[1]=="txtest"): if len(sys.argv)>2: freq=eval(sys.argv[2]); if freq>100: client.RF_setfreq(freq); else: client.RF_setchan(freq); print "Transmitting DEADBEEF as %010x on %i MHz" % ( client.RF_getsmac(), client.RF_getfreq()/10**6); while 1: client.RF_txpacket([0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0]); if(sys.argv[1]=="txpiptest"): if len(sys.argv)>2: freq=eval(sys.argv[2]); if freq>100: client.RF_setfreq(freq); else: print "Channels not yet supported." print "Transmitting on as %010x on %i MHz" % ( client.RF_getsmac(), client.RF_getfreq()/10**6); client.RF_setsync(0xFFFF); while 1: client.RF_txpacket([ 0x7f, #Real header, must begin with SFD. 0x00, 0x00, 0x00, 0x00, 0xA7, #Length 0x1f, 0x01, 0x08, 0x82, 0xDF, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0, #Preamble 0x00, 0x00, 0x00, #SFD 0x00, 0xA7, #CC2420 SFD #Packet In Packet 0x0f, 0x01, 0x08, 0x82, 0xff, 0xff, 0xff, 0xff, 0xde, 0xad, 0xbe, 0xef, 0xba, 0xbe, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ]); if(sys.argv[1]=="peek"): start=0x0000; if(len(sys.argv)>2): start=int(sys.argv[2],16); stop=start; if(len(sys.argv)>3): stop=int(sys.argv[3],16); print "Peeking from %04x to %04x." % (start,stop); while start<=stop: print "%04x: 0x%04x" % (start,client.peek(start)); start=start+1; if(sys.argv[1]=="poke"): start=0x0000; val=0x00; if(len(sys.argv)>2): start=int(sys.argv[2],16); if(len(sys.argv)>3): val=int(sys.argv[3],16); print "Poking r%02x to become 0x%04x." % (start,val); client.poke(start,val);