From 4c7b09962bec02803ce1851a9fe516e651f174a0 Mon Sep 17 00:00:00 2001 From: Georg Date: Mon, 24 Oct 2016 11:19:46 +0200 Subject: [PATCH] improved the ISO14443A select protocol concerning HALT state --- .../Application/MifareClassic.c | 24 +++++++++++-------- .../Application/MifareUltralight.c | 24 +++++++++++-------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/Firmware/Chameleon-Mini/Application/MifareClassic.c b/Firmware/Chameleon-Mini/Application/MifareClassic.c index 32684a6..63fccac 100644 --- a/Firmware/Chameleon-Mini/Application/MifareClassic.c +++ b/Firmware/Chameleon-Mini/Application/MifareClassic.c @@ -90,6 +90,7 @@ static uint8_t CurrentAddress; static uint8_t BlockBuffer[MEM_BYTES_PER_BLOCK]; static uint16_t CardATQAValue; static uint8_t CardSAKValue; +static bool FromHalt = false; INLINE bool CheckValueIntegrity(uint8_t* Block) @@ -139,6 +140,7 @@ void MifareClassicAppInit1K(void) State = STATE_IDLE; CardATQAValue = MFCLASSIC_1K_ATQA_VALUE; CardSAKValue = MFCLASSIC_1K_SAK_VALUE; + FromHalt = false; } void MifareClassicAppInit4K(void) @@ -146,6 +148,7 @@ void MifareClassicAppInit4K(void) State = STATE_IDLE; CardATQAValue = MFCLASSIC_4K_7B_ATQA_VALUE; CardSAKValue = MFCLASSIC_4K_SAK_VALUE; + FromHalt = false; } void MifareClassicAppReset(void) @@ -163,7 +166,8 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) switch(State) { case STATE_IDLE: case STATE_HALT: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, State == STATE_HALT)) { + FromHalt = State == STATE_HALT; + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, FromHalt)) { State = STATE_READY1; return BitCount; } @@ -252,9 +256,9 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) #endif case STATE_READY1: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, false)) { - State = STATE_READY1; - return BitCount; + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, FromHalt)) { + State = FromHalt ? STATE_HALT : STATE_IDLE; + return ISO14443A_APP_NO_RESPONSE; } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL1) { /* Load UID CL1 and perform anticollision */ uint8_t UidCL1[ISO14443A_CL_UID_SIZE]; @@ -278,9 +282,9 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) break; case STATE_READY2: - if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, false)) { - State = STATE_READY1; - return BitCount; + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, FromHalt)) { + State = FromHalt ? STATE_HALT : STATE_IDLE; + return ISO14443A_APP_NO_RESPONSE; } else if (Buffer[0] == ISO14443A_CMD_SELECT_CL2) { /* Load UID CL2 and perform anticollision */ uint8_t UidCL2[ISO14443A_CL_UID_SIZE]; @@ -297,9 +301,9 @@ uint16_t MifareClassicAppProcess(uint8_t* Buffer, uint16_t BitCount) } break; case STATE_ACTIVE: - if (ISO14443AWakeUp(Buffer, &BitCount, MFCLASSIC_1K_ATQA_VALUE, false)) { - State = STATE_READY1; - return BitCount; + if (ISO14443AWakeUp(Buffer, &BitCount, CardATQAValue, FromHalt)) { + State = FromHalt ? STATE_HALT : STATE_IDLE; + return ISO14443A_APP_NO_RESPONSE; } else if (Buffer[0] == CMD_HALT) { /* Halts the tag. According to the ISO14443, the second * byte is supposed to be 0. */ diff --git a/Firmware/Chameleon-Mini/Application/MifareUltralight.c b/Firmware/Chameleon-Mini/Application/MifareUltralight.c index f109f61..70d22d2 100644 --- a/Firmware/Chameleon-Mini/Application/MifareUltralight.c +++ b/Firmware/Chameleon-Mini/Application/MifareUltralight.c @@ -62,15 +62,18 @@ static enum { } State; static uint8_t CompatWritePageAddress; +static bool FromHalt = false; void MifareUltralightAppInit(void) { State = STATE_IDLE; + FromHalt = false; } void MifareUltralightAppReset(void) { State = STATE_IDLE; + FromHalt = false; } void MifareUltralightAppTask(void) @@ -86,7 +89,8 @@ uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) switch(State) { case STATE_IDLE: case STATE_HALT: - if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, State == STATE_HALT)) { + FromHalt = State == STATE_HALT; + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, FromHalt)) { /* We received a REQA or WUPA command, so wake up. */ State = STATE_READY1; return BitCount; @@ -94,9 +98,9 @@ uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) break; case STATE_READY1: - if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, false)) { - State = STATE_READY1; - return BitCount; + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, FromHalt)) { + State = FromHalt ? STATE_HALT : STATE_IDLE; + return ISO14443A_APP_NO_RESPONSE; } else if (Cmd == ISO14443A_CMD_SELECT_CL1) { /* Load UID CL1 and perform anticollision. Since * MF Ultralight use a double-sized UID, the first byte @@ -118,9 +122,9 @@ uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) break; case STATE_READY2: - if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, false)) { - State = STATE_READY1; - return BitCount; + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, FromHalt)) { + State = FromHalt ? STATE_HALT : STATE_IDLE; + return ISO14443A_APP_NO_RESPONSE; } else if (Cmd == ISO14443A_CMD_SELECT_CL2) { /* Load UID CL2 and perform anticollision */ uint8_t UidCL2[ISO14443A_CL_UID_SIZE]; @@ -141,9 +145,9 @@ uint16_t MifareUltralightAppProcess(uint8_t* Buffer, uint16_t BitCount) break; case STATE_ACTIVE: - if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, false)) { - State = STATE_READY1; - return BitCount; + if (ISO14443AWakeUp(Buffer, &BitCount, ATQA_VALUE, FromHalt)) { + State = FromHalt ? STATE_HALT : STATE_IDLE; + return ISO14443A_APP_NO_RESPONSE; } else if (Cmd == CMD_READ) { uint8_t PageAddress = Buffer[1];