X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/a7247d858b195bd21eeba6d65a882323ad71d030..4014b814fb2b92465b9f9759f56c00ccb6c63e9b:/armsrc/legicrf.c diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 867c1ad7..30e2a975 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -8,15 +8,23 @@ #include "apps.h" #include "legicrf.h" +#include "unistd.h" +#include "stdint.h" static struct legic_frame { - int num_bytes; - int num_bits; - char data[10]; + int bits; + uint16_t data; } current_frame; -static char response = 0x2b; /* 1101 01 */ -static void frame_send(char *response, int num_bytes, int num_bits) +static const struct legic_frame queries[] = { + {7, 0x55}, /* 1010 101 */ +}; + +static const struct legic_frame responses[] = { + {6, 0x3b}, /* 1101 11 */ +}; + +static void frame_send(uint16_t response, int bits) { #if 0 /* Use the SSC to send a response. 8-bit transfers, LSBit first, 100us per bit */ @@ -30,9 +38,10 @@ static void frame_send(char *response, int num_bytes, int num_bits) while(AT91C_BASE_TC1->TC_CV < 490) ; int i; - for(i=0; i<(num_bytes*8+num_bits); i++) { + for(i=0; iTC_CV + 150; - int bit = response[i/8] & (1<<(i%8)); + int bit = response & 1; + response = response >> 1; if(bit) AT91C_BASE_PIOA->PIO_SODR = GPIO_SSC_DOUT; else @@ -43,46 +52,58 @@ static void frame_send(char *response, int num_bytes, int num_bits) #endif } -static void frame_respond(struct legic_frame *f) +static void frame_respond(struct legic_frame const * const f) { LED_D_ON(); - if(f->num_bytes == 0 && f->num_bits == 7) { - /* This seems to be the initial dialogue, just send 6 bits of static data */ - frame_send(&response, 0, 6); + int i, r_size; + uint16_t r_data; + + for(i=0; ibits == queries[i].bits && f->data == queries[i].data) { + r_data = responses[i].data; + r_size = responses[i].bits; + break; + } + } + + if(r_size != 0) { + frame_send(r_data, r_size); + LED_A_ON(); + } else { + LED_A_OFF(); } + LED_D_OFF(); } -static void frame_append_bit(struct legic_frame *f, int bit) +static void frame_append_bit(struct legic_frame * const f, int bit) { - if(f->num_bytes >= (int)sizeof(f->data)) + if(f->bits >= 15) return; /* Overflow, won't happen */ - f->data[f->num_bytes] |= (bit<num_bits); - f->num_bits++; - if(f->num_bits > 7) { - f->num_bits = 0; - f->num_bytes++; - } + f->data |= (bit<bits); + f->bits++; } -static int frame_is_empty(struct legic_frame *f) +static int frame_is_empty(struct legic_frame const * const f) { - return( (f->num_bytes + f->num_bits) <= 4 ); + return( f->bits <= 4 ); } -static void frame_handle(struct legic_frame *f) +static void frame_handle(struct legic_frame const * const f) { + if(f->bits == 6) { + /* Short path */ + return; + } if( !frame_is_empty(f) ) { frame_respond(f); } } -static void frame_clean(struct legic_frame *f) +static void frame_clean(struct legic_frame * const f) { - if(!frame_is_empty(f)) - memset(f->data, 0, sizeof(f->data)); - f->num_bits = 0; - f->num_bytes = 0; + f->data = 0; + f->bits = 0; } static void emit(int bit) @@ -143,22 +164,26 @@ void LegicRfSimulate(void) /* 1 bit */ emit(1); active = 1; + LED_B_ON(); } else if(time > (BIT_TIME_0-BIT_TIME_FUZZ) && time < (BIT_TIME_0+BIT_TIME_FUZZ)) { /* 0 bit */ emit(0); - active = 0; - } else { + active = 1; + LED_B_ON(); + } else if(active) { /* invalid */ emit(-1); active = 0; + LED_B_OFF(); } } } - if(time >= (BIT_TIME_1+2*BIT_TIME_FUZZ) && active) { + if(time >= (BIT_TIME_1+BIT_TIME_FUZZ) && active) { /* Frame end */ emit(-1); active = 0; + LED_B_OFF(); } if(time >= (20*BIT_TIME_1) && (AT91C_BASE_TC1->TC_SR & AT91C_TC_CLKSTA)) {