From 823602c721ca859a2671ac38c149ae8eb0d1884f Mon Sep 17 00:00:00 2001 From: chenzitai Date: Wed, 25 Jul 2018 17:40:46 +0100 Subject: [PATCH] Add Framework for autocalibrate of Sniffing Mode (cherry picked from commit c8606be) --- .../Chameleon-Mini/Application/Application.h | 1 + .../Chameleon-Mini/Application/Sniff14443A.c | 48 +++++++++++++++++++ .../Chameleon-Mini/Application/Sniff14443A.h | 24 ++++++++++ .../Chameleon-Mini/Codec/SniffISO14443-2A.c | 13 ++--- Firmware/Chameleon-Mini/Configuration.c | 10 ++-- Firmware/Chameleon-Mini/Makefile | 2 +- Firmware/Chameleon-Mini/Terminal/Commands.c | 28 ++++++++--- 7 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 Firmware/Chameleon-Mini/Application/Sniff14443A.c create mode 100644 Firmware/Chameleon-Mini/Application/Sniff14443A.h diff --git a/Firmware/Chameleon-Mini/Application/Application.h b/Firmware/Chameleon-Mini/Application/Application.h index 0b94960..1002d31 100644 --- a/Firmware/Chameleon-Mini/Application/Application.h +++ b/Firmware/Chameleon-Mini/Application/Application.h @@ -16,6 +16,7 @@ #include "MifareUltralight.h" #include "MifareClassic.h" #include "Reader14443A.h" +#include "Sniff14443A.h" /* Function wrappers */ INLINE void ApplicationInit(void) { diff --git a/Firmware/Chameleon-Mini/Application/Sniff14443A.c b/Firmware/Chameleon-Mini/Application/Sniff14443A.c new file mode 100644 index 0000000..68512a7 --- /dev/null +++ b/Firmware/Chameleon-Mini/Application/Sniff14443A.c @@ -0,0 +1,48 @@ +// +// Created by Zitai Chen on 25/07/2018. +// Application layer for sniffing +// Currently only support Autocalibrate +// + +#include +#include +#include "Sniff14443A.h" +Sniff14443Command Sniff14443CurrentCommand = Sniff14443_Do_Nothing; + +extern bool checkParityBits(uint8_t * Buffer, uint16_t BitCount); + static enum { + STATE_IDLE, + STATE_READER_DATA, + STATE_CARD_DATA +} SniffState = STATE_IDLE; + +void Sniff14443AAppInit(void){ + SniffState = STATE_IDLE; +} + +void Sniff14443AAppReset(void){ + SniffState = STATE_IDLE; + Sniff14443CurrentCommand = Sniff14443_Do_Nothing; +} +// Currently APPTask and AppTick is not being used +void Sniff14443AAppTask(void){/* Empty */} +void Sniff14443AAppTick(void){/* Empty */} + +void Sniff14443AAppTimeout(void){ + Sniff14443AAppReset(); +} + +uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount){ + switch (Sniff14443CurrentCommand){ + case Sniff14443_Do_Nothing: + return 0; + case Sniff14443_Autocalibrate: + // If received Reader WUPA + if(Buffer[0] == 0x26 || Buffer[0] == 0x54){ + LED_PORT.OUTSET = LED_RED; + } + break; + default: + return 0; + } +} \ No newline at end of file diff --git a/Firmware/Chameleon-Mini/Application/Sniff14443A.h b/Firmware/Chameleon-Mini/Application/Sniff14443A.h new file mode 100644 index 0000000..60f1c85 --- /dev/null +++ b/Firmware/Chameleon-Mini/Application/Sniff14443A.h @@ -0,0 +1,24 @@ +// +// Created by Zitai Chen on 25/07/2018. +// + +#ifndef CHAMELEON_MINI_SNIFF14443A_H +#define CHAMELEON_MINI_SNIFF14443A_H + +#include + +void Sniff14443AAppInit(void); +void Sniff14443AAppReset(void); +void Sniff14443AAppTask(void); +void Sniff14443AAppTick(void); +void Sniff14443AAppTimeout(void); + +uint16_t Sniff14443AAppProcess(uint8_t* Buffer, uint16_t BitCount); + +typedef enum { + Sniff14443_Do_Nothing, + Sniff14443_Autocalibrate, +} Sniff14443Command; + +#endif //CHAMELEON_MINI_SNIFF14443A_H + diff --git a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c index 2552a8d..fb2a51a 100644 --- a/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/SniffISO14443-2A.c @@ -261,8 +261,6 @@ ISR(CODEC_TIMER_SAMPLING_CCD_VECT) { INLINE void CardSniffInit(void) { - LED_PORT.OUTSET = LED_RED; - /* Initialize common peripherals and start listening * for incoming data. */ @@ -326,8 +324,6 @@ INLINE void CardSniffInit(void) INLINE void CardSniffDeinit(void) { - LED_PORT.OUTCLR = LED_RED; - CODEC_TIMER_LOADMOD.CTRLA = 0; CODEC_TIMER_LOADMOD.INTCTRLB = 0; @@ -518,18 +514,17 @@ void Sniff14443ACodecTask(void) if(Flags.ReaderDataAvaliable){ Flags.ReaderDataAvaliable = false; LogEntry(LOG_INFO_CODEC_SNI_READER_DATA, CodecBuffer, (ReaderBitCount+7)/8); -// ReaderBitCount = 0; + ApplicationProcess(CodecBuffer, (ReaderBitCount+7)/8); + LEDHook(LED_CODEC_RX, LED_PULSE); } if (Flags.CardDataAvaliable){ Flags.CardDataAvaliable = false; - // CardBitCount = removeParityBits(CodecBuffer2,CardBitCount ); -// LEDHook(LED_CODEC_RX, LED_PULSE); - LogEntry(LOG_INFO_CODEC_SNI_CARD_DATA_W_PARITY, CodecBuffer2, (CardBitCount + 7) / 8); - + LEDHook(LED_CODEC_RX, LED_PULSE); + ApplicationProcess(CodecBuffer2, (CardBitCount+7)/8); } diff --git a/Firmware/Chameleon-Mini/Configuration.c b/Firmware/Chameleon-Mini/Configuration.c index 5fda354..1fffdd0 100644 --- a/Firmware/Chameleon-Mini/Configuration.c +++ b/Firmware/Chameleon-Mini/Configuration.c @@ -191,11 +191,11 @@ static const PROGMEM ConfigurationType ConfigurationTable[] = { .CodecInitFunc = Sniff14443ACodecInit, .CodecDeInitFunc = Sniff14443ACodecDeInit, .CodecTaskFunc = Sniff14443ACodecTask, - .ApplicationInitFunc = ApplicationInitDummy, - .ApplicationResetFunc = ApplicationResetDummy, - .ApplicationTaskFunc = ApplicationTaskDummy, - .ApplicationTickFunc = ApplicationTickDummy, - .ApplicationProcessFunc = ApplicationProcessDummy, + .ApplicationInitFunc = Sniff14443AAppInit, + .ApplicationResetFunc = Sniff14443AAppReset, + .ApplicationTaskFunc = Sniff14443AAppTask, + .ApplicationTickFunc = Sniff14443AAppTick, + .ApplicationProcessFunc = Sniff14443AAppProcess, .ApplicationGetUidFunc = ApplicationGetUidDummy, .ApplicationSetUidFunc = ApplicationSetUidDummy, .UidSize = 0, diff --git a/Firmware/Chameleon-Mini/Makefile b/Firmware/Chameleon-Mini/Makefile index 5870a2b..3824633 100644 --- a/Firmware/Chameleon-Mini/Makefile +++ b/Firmware/Chameleon-Mini/Makefile @@ -93,7 +93,7 @@ OPTIMIZATION = s SRC += $(TARGET).c LUFADescriptors.c System.c Configuration.c Random.c Common.c Memory.c MemoryAsm.S Button.c Log.c Settings.c LED.c Map.c AntennaLevel.c SRC += Terminal/Terminal.c Terminal/Commands.c Terminal/XModem.c Terminal/CommandLine.c SRC += Codec/Codec.c Codec/ISO14443-2A.c Codec/Reader14443-2A.c Codec/SniffISO14443-2A.c Codec/Reader14443-ISR.S -SRC += Application/MifareUltralight.c Application/MifareClassic.c Application/ISO14443-3A.c Application/Crypto1.c Application/Reader14443A.c +SRC += Application/MifareUltralight.c Application/MifareClassic.c Application/ISO14443-3A.c Application/Crypto1.c Application/Reader14443A.c Application/Sniff14443A.c SRC += $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) LUFA_PATH = ../LUFA CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -DFLASH_DATA_ADDR=$(FLASH_DATA_ADDR) -DFLASH_DATA_SIZE=$(FLASH_DATA_SIZE) -DSPM_HELPER_ADDR=$(SPM_HELPER_ADDR) -DBUILD_DATE=$(BUILD_DATE) -DCOMMIT_ID=\"$(COMMIT_ID)\" $(SETTINGS) diff --git a/Firmware/Chameleon-Mini/Terminal/Commands.c b/Firmware/Chameleon-Mini/Terminal/Commands.c index d4b26e9..c6307a8 100644 --- a/Firmware/Chameleon-Mini/Terminal/Commands.c +++ b/Firmware/Chameleon-Mini/Terminal/Commands.c @@ -2,6 +2,7 @@ #include "Commands.h" #include #include +#include #include "XModem.h" #include "../Settings.h" #include "../Chameleon-Mini.h" @@ -16,6 +17,7 @@ #include "../Codec/Codec.h" extern Reader14443Command Reader14443CurrentCommand; +extern Sniff14443Command Sniff14443CurrentCommand; extern const PROGMEM CommandEntryType CommandTable[]; @@ -629,15 +631,27 @@ CommandStatusIdType CommandGetField(char* OutMessage) CommandStatusIdType CommandExecAutocalibrate(char* OutMessage) { - if (GlobalSettings.ActiveSettingPtr->Configuration != CONFIG_ISO14443A_READER) + if (GlobalSettings.ActiveSettingPtr->Configuration == CONFIG_ISO14443A_READER){ + ApplicationReset(); + + Reader14443CurrentCommand = Reader14443_Autocalibrate; + Reader14443AAppInit(); + Reader14443ACodecStart(); + CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; + return TIMEOUT_COMMAND; + } + else if (GlobalSettings.ActiveSettingPtr->Configuration == CONFIG_ISO14443A_SNIFF){ + ApplicationReset(); + + Sniff14443CurrentCommand = Sniff14443_Autocalibrate; + Sniff14443AAppInit(); + CommandLinePendingTaskTimeout = &Sniff14443AAppTimeout; + return TIMEOUT_COMMAND; + } + else { return COMMAND_ERR_INVALID_USAGE_ID; - ApplicationReset(); + } - Reader14443CurrentCommand = Reader14443_Autocalibrate; - Reader14443AAppInit(); - Reader14443ACodecStart(); - CommandLinePendingTaskTimeout = &Reader14443AAppTimeout; - return TIMEOUT_COMMAND; } CommandStatusIdType CommandExecClone(char *OutMessage)