diff options
Diffstat (limited to 'openpicc/application/iso14443_sniffer.c')
-rw-r--r-- | openpicc/application/iso14443_sniffer.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/openpicc/application/iso14443_sniffer.c b/openpicc/application/iso14443_sniffer.c new file mode 100644 index 0000000..d5cf9c2 --- /dev/null +++ b/openpicc/application/iso14443_sniffer.c @@ -0,0 +1,109 @@ +/*************************************************************** + * + * OpenPICC - ISO 14443 Layer 2 Type A Sniffer + * Also serves as PoC code for iso14443_layer2a usage + * + * Copyright 2008 Henryk Plötz <henryk@ploetzli.ch> + * + *************************************************************** + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +*/ + +#include <FreeRTOS.h> +#include <board.h> +#include <task.h> +#include <errno.h> + +#include "openpicc.h" +#include "iso14443_sniffer.h" +#include "iso14443_layer2a.h" +#include "iso14443a_miller.h" +#include "usb_print.h" +#include "cmd.h" + +static iso14443_frame rx_frame; + +void iso14443_sniffer (void *pvParameters) +{ + (void)pvParameters; + int res; + + /* Delay until USB print etc. are ready */ + vTaskDelay(1000 * portTICK_RATE_MS); + + do { + res = iso14443_layer2a_init(0); + if(res < 0) { + usb_print_string("Sniffer: Initialization failed\n\r"); + vTaskDelay(10000 * portTICK_RATE_MS); + } + } while(res < 0); + + usb_print_string("Waiting for carrier. "); + while(iso14443_wait_for_carrier(1000 * portTICK_RATE_MS) != 0) { + } + usb_print_string("Carrier detected.\n\r"); + + iso14443_l2a_rx_start(); + while(true) { + ssc_dma_rx_buffer_t *buffer = 0; + res = iso14443_receive(NULL, &buffer, 20000 * portTICK_RATE_MS); + if(res >= 0) { + DumpStringToUSB("\n\r"); + DumpTimeToUSB(xTaskGetTickCount()); + usb_print_string(": Frame received, consists of "); + DumpUIntToUSB(res); + usb_print_string(" transfers ("); + DumpUIntToUSB(buffer->reception_mode->transfersize_ssc); + usb_print_string(" bits from SSC each)\n\r "); + if(buffer->len_transfers < 200) + DumpBufferToUSB((char*)buffer->data, (buffer->len_transfers * buffer->reception_mode->transfersize_pdc)/8); + else { + DumpBufferToUSB((char*)buffer->data, (200 * buffer->reception_mode->transfersize_pdc)/8); + usb_print_string("..."); + } + usb_print_string("\n\r "); + + iso14443a_decode_miller(&rx_frame, buffer); + + usb_print_string("Decodes to "); + DumpUIntToUSB(rx_frame.numbytes); + usb_print_string(" bytes and "); + DumpUIntToUSB(rx_frame.numbits); + usb_print_string(" bits: "); + DumpBufferToUSB((char*)rx_frame.data, rx_frame.numbytes + (rx_frame.numbits+7)/8 ); + usb_print_string("\n\r"); + + portENTER_CRITICAL(); + buffer->state = FREE; + portEXIT_CRITICAL(); + } else { + if(res != -ETIMEDOUT) { + usb_print_string("Receive error: "); + switch(res) { + case -ENETDOWN: usb_print_string("PLL is not locked or PLL lock lost\n\r"); break; + case -EBUSY: usb_print_string("A Tx is currently running or pending, can't receive\n\r"); break; + case -EALREADY: usb_print_string("There's already an iso14443_receive() invocation running\n\r"); break; + } + vTaskDelay(1000 * portTICK_RATE_MS); // FIXME Proper error handling, e.g. wait for Tx end in case of EBUSY + } else if(0) { + DumpStringToUSB("\n\r"); + DumpTimeToUSB(xTaskGetTickCount()); + usb_print_string(": -- Mark --"); + } + } + } +} |