From: travisutk Date: Sun, 12 Dec 2010 19:43:05 +0000 (+0000) Subject: Working Simpliciti implementation. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=d0498df7bc06959a19fe1ef2c4fc066dd8d68c92 Working Simpliciti implementation. Call 'goodfet.cc simpliciti [us|eu|lf]' to dump accelerometer data from a Chronos watch. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@790 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFETCC.py b/client/GoodFETCC.py index 01b6668..9397201 100644 --- a/client/GoodFETCC.py +++ b/client/GoodFETCC.py @@ -95,7 +95,6 @@ class GoodFETCC(GoodFET): self.pokebysym("TEST1",0x31); self.pokebysym("TEST0",0x09); - #self.pokebysym("PA_TABLE0" , 0x60); #above mid #self.pokebysym("FSCAL2" , 0x2A); #above mid self.pokebysym("FSCAL2" , 0x0A); #beneath mid @@ -214,7 +213,7 @@ class GoodFETCC(GoodFET): return; def config_simpliciti(self,band="none"): - self.pokebysym("FSCTRL1" , 0x08) # Frequency synthesizer control. + self.pokebysym("FSCTRL1" , 0x0C) #08 # Frequency synthesizer control. self.pokebysym("FSCTRL0" , 0x00) # Frequency synthesizer control. #Don't change these while the radio is active. @@ -264,7 +263,7 @@ class GoodFETCC(GoodFET): self.pokebysym("TEST2" , 0x81) # Various test settings. self.pokebysym("TEST1" , 0x35) # Various test settings. self.pokebysym("TEST0" , 0x09) # Various test settings. - self.pokebysym("PA_TABLE0", 0xC0) # PA output power setting. + self.pokebysym("PA_TABLE0", 0xc0) # Max output power. self.pokebysym("PKTCTRL1" , 0x04) # Packet automation control, w/ lqi #self.pokebysym("PKTCTRL1" , 0x00) # Packet automation control. w/o lqi self.pokebysym("PKTCTRL0" , 0x05) # Packet automation control, w/ checksum. @@ -341,7 +340,7 @@ class GoodFETCC(GoodFET): """Get a packet from the radio. Returns None if none is waiting.""" self.shellcodefile("rxpacket.ihx"); len=self.peek8(0xFE00,"xdata"); - return self.peekblock(0xFE00,len+1,"data"); + return self.peekblock(0xFE00,len+3,"data"); def RF_txpacket(self,packet): """Transmit a packet. Untested.""" @@ -354,7 +353,7 @@ class GoodFETCC(GoodFET): self.pokeblock(0xFE00,packet,"data"); self.shellcodefile("txrxpacket.ihx"); len=self.peek8(0xFE00,"xdata"); - return self.peekblock(0xFE00,len+1,"data"); + return self.peekblock(0xFE00,len+3,"data"); def RF_getrssi(self): """Returns the received signal strenght, with a weird offset.""" diff --git a/client/goodfet.cc b/client/goodfet.cc index 20b0405..a7a0494 100755 --- a/client/goodfet.cc +++ b/client/goodfet.cc @@ -16,23 +16,17 @@ from intelhex import IntelHex; def printpacket(packet): s=""; i=0; - #print "Printing packet." for foo in packet: i=i+1; - #if i>packet[0]+1: break; s="%s %02x" % (s,foo); - print "%s" %s; + print "# %s" %s; +simplepacketcount=0; def handlesimplicitipacket(packet): s=""; i=0; - - for foo in packet: - i=i+1; - #if i>packet[0]+1: break; - s="%s %02x" % (s,foo); - print "\n%s" %s; - + global simplepacketcount; + simplepacketcount=simplepacketcount+1; len=packet[0]; if len<12: return; @@ -50,13 +44,38 @@ def handlesimplicitipacket(packet): seq=packet[11]; #payload begins at byte 10. - - if port==0x20: + if packet[len+2]&0x80==0: + print "# Dropped broken packet."; + elif port==0x20: #data packet - x=packet[11]; - y=packet[13]; + counter=packet[11]; + button=packet[12]; + x=packet[13]; + y=packet[14]; z=packet[15]; - print "%02x: %i %i %i" % (seq,x,y,z); + print "%09i %03i %4i %4i %4i" % (simplepacketcount,button,x,y,z); + sys.stdout.flush(); + elif port==0x02: + #Link request. Gotta send a proper reply to get data. + tid=packet[13]; + #14 ff ff ff ff 3c b7 e3 98 + #02 03 c9 + #01 97 + #ef be ad de 3d 00 02 + reply=[0x10, + src[0], src[1], src[2], src[3], + 0x78,0x56,0x34,0x10, #my address. + port, 0x21, seq, + 0x81, tid, #reply, tid + + 0x20,0x00,0xad,0xde, #Join token + 0x00]; #no security + printpacket(reply); + print "#FIXME FAST: repeatedly broadcasting ACK to catch LINK on the next attempt."; + for foo in range(1,50): + client.RF_txpacket(reply); + + pass; elif port==0x03: #print "Join request."; if packet[12]!=1: @@ -65,18 +84,18 @@ def handlesimplicitipacket(packet): tid=packet[13]; reply=[0x12, #reply is one byte shorter src[0], src[1], src[2], src[3], - 1,1,1,1, #my address + 0x78,0x56,0x34,0x10, #my address. port, 0x21, seq, 0x81, tid, #reply, tid - 1,1,1,1, - #4,3,2,1, #default join token - #8,7,6,5, #default link token - #0xFF,0xFF,0xFF,0xFF, + 0xef,0xbe,0xad,0xde, #Join token 0x00]; #no security printpacket(reply); - client.RF_txpacket(reply); - + print "#FIXME FAST: repeatedly broadcasting ACK to catch JOIN on the next attempt."; + for foo in range(1,50): + client.RF_txpacket(reply); + #printpacket(reply); + elif port==0x04: print "Security request."; elif port==0x05: @@ -231,7 +250,7 @@ if(sys.argv[1]=="simpliciti"): client.config_simpliciti(region); - print "Listening as %x on %f MHz" % (client.RF_getsmac(), + print "# Listening as %x on %f MHz" % (client.RF_getsmac(), client.RF_getfreq()/10.0**6); #Now we're ready to get packets. while 1: diff --git a/shellcode/chipcon/cc1110/rxpacket.c b/shellcode/chipcon/cc1110/rxpacket.c index 5ba32a5..0535f0b 100644 --- a/shellcode/chipcon/cc1110/rxpacket.c +++ b/shellcode/chipcon/cc1110/rxpacket.c @@ -8,31 +8,35 @@ char __xdata at 0xfe00 packet[MAXLEN] ; void main(){ unsigned char len=16, i=0; - //1-out the buffer. - for(i=0;i<64;i++) - packet[i]=0xFF; - i=0; - - //Disable interrupts. - RFTXRXIE=0; - - //idle a bit. - //RFST=RFST_SIDLE; - //while(MARCSTATE!=MARC_STATE_IDLE); - - //Begin to receive. - RFST=RFST_SRX; - while(MARCSTATE!=MARC_STATE_RX); + do{ + //1-out the buffer. + for(i=0;i<64;i++) + packet[i]=0xFF; + i=0; + + //Disable interrupts. + RFTXRXIE=0; + + //idle a bit. + RFST=RFST_SIDLE; + while(MARCSTATE!=MARC_STATE_IDLE); + + //Begin to receive. + RFST=RFST_SRX; + while(MARCSTATE!=MARC_STATE_RX); - while(i 0) { + for (j=0; j<1200;j++); // about 1 millisecond + }; +} + //! Transmit a packet out of the radio from 0xFE00. void main(){ unsigned char len=packet[0], i=0; + long j; //Disable interrupts. RFTXRXIE=0; @@ -18,12 +26,16 @@ void main(){ RFST=RFST_STX; //Begin transmit. while(MARCSTATE!=MARC_STATE_TX); - while(i!=len+1){ + while(i