diff --git a/Firmware/Chameleon-Mini/Application/ISO15693-A.h b/Firmware/Chameleon-Mini/Application/ISO15693-A.h index 2a40482..5bf0b0e 100644 --- a/Firmware/Chameleon-Mini/Application/ISO15693-A.h +++ b/Firmware/Chameleon-Mini/Application/ISO15693-A.h @@ -57,14 +57,14 @@ bool ISO15693CheckCRC(void* FrameBuf, uint16_t FrameBufSize); INLINE bool ISO15693CompareUid(uint8_t* Uid1, uint8_t* Uid2) { - if ( (Uid1[0] == Uid2[0]) - && (Uid1[1] == Uid2[1]) - && (Uid1[2] == Uid2[2]) - && (Uid1[3] == Uid2[3]) - && (Uid1[4] == Uid2[4]) - && (Uid1[5] == Uid2[5]) - && (Uid1[6] == Uid2[6]) - && (Uid1[7] == Uid2[7]) ) { + if ( (Uid1[0] == Uid2[7]) + && (Uid1[1] == Uid2[6]) + && (Uid1[2] == Uid2[5]) + && (Uid1[3] == Uid2[4]) + && (Uid1[4] == Uid2[3]) + && (Uid1[5] == Uid2[2]) + && (Uid1[6] == Uid2[1]) + && (Uid1[7] == Uid2[0]) ) { return true; } else { return false; @@ -74,14 +74,14 @@ bool ISO15693CompareUid(uint8_t* Uid1, uint8_t* Uid2) INLINE void ISO15693CopyUid(uint8_t* DstUid, uint8_t* SrcUid) { - DstUid[0] = SrcUid[0]; - DstUid[1] = SrcUid[1]; - DstUid[2] = SrcUid[2]; - DstUid[3] = SrcUid[3]; - DstUid[4] = SrcUid[4]; - DstUid[5] = SrcUid[5]; - DstUid[6] = SrcUid[6]; - DstUid[7] = SrcUid[7]; + DstUid[0] = SrcUid[7]; + DstUid[1] = SrcUid[6]; + DstUid[2] = SrcUid[5]; + DstUid[3] = SrcUid[4]; + DstUid[4] = SrcUid[3]; + DstUid[5] = SrcUid[2]; + DstUid[6] = SrcUid[1]; + DstUid[7] = SrcUid[0]; } INLINE diff --git a/Firmware/Chameleon-Mini/Application/Sl2s2002.c b/Firmware/Chameleon-Mini/Application/Sl2s2002.c index 2d3af40..1feec3f 100644 --- a/Firmware/Chameleon-Mini/Application/Sl2s2002.c +++ b/Firmware/Chameleon-Mini/Application/Sl2s2002.c @@ -14,6 +14,7 @@ #include "ISO15693-A.h" #define BYTES_PER_PAGE 4 +#define MEM_UID_ADDRESS 0x00 static enum { STATE_READY, @@ -21,13 +22,6 @@ static enum { STATE_QUIET } State; - -ISO15693UidType Sl2s2002Uid = {0x78, 0xD3, 0xF4, 0x3F, 0x50, 0x01, 0x04, 0xE0}; - -//ISO15693UidType Sl2s2002Uid = {0x60, 0x0B, 0x88, 0x77, 0x06, 0x44, 0x02, 0xE1}; - - - void Sl2s2002AppInit(void) { State = STATE_READY; @@ -50,13 +44,6 @@ void Sl2s2002AppTick(void) } -// void sendIntToTermina(uint8_t val) -// { -// char buf[16]; -// snprintf(buf,16, "%02x",val); -// TerminalSendString(buf); -// } - uint16_t Sl2s2002AppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) { if (FrameBytes >= ISO15693_MIN_FRAME_SIZE) { @@ -64,30 +51,25 @@ uint16_t Sl2s2002AppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) // At this point, we have a valid ISO15693 frame uint8_t Command = FrameBuf[1]; uint16_t ResponseByteCount = ISO15693_APP_NO_RESPONSE; - - //TerminalSendString("Received command: "); -// for (int i = 0; i < (FrameBytes - 2); i++) { -// sendIntToTermina(FrameBuf[i]); -// } -// TerminalSendString("\n"); - + uint8_t Uid[8]; + MemoryReadBlock(Uid, MEM_UID_ADDRESS, ActiveConfiguration.UidSize); switch(State) { case STATE_READY: if (Command == ISO15693_CMD_INVENTORY) { FrameBuf[0] = 0x00; /* Flags */ FrameBuf[1] = 0x00; /* DSFID */ - ISO15693CopyUid(&FrameBuf[2], Sl2s2002Uid); + ISO15693CopyUid(&FrameBuf[2], Uid); ResponseByteCount = 10; } else if (Command == ISO15693_CMD_STAY_QUIET) { - if (ISO15693Addressed(FrameBuf, Sl2s2002Uid)) { + if (ISO15693Addressed(FrameBuf, Uid)) { State = STATE_QUIET; } } else if (Command == ISO15693_CMD_GET_SYS_INFO) { - if (ISO15693Addressed(FrameBuf, Sl2s2002Uid)) { + if (ISO15693Addressed(FrameBuf, Uid)) { FrameBuf[0] = 0; /* Flags */ FrameBuf[1] = 0x0F; /* InfoFlags */ - ISO15693CopyUid(&FrameBuf[2], Sl2s2002Uid); + ISO15693CopyUid(&FrameBuf[2], Uid); FrameBuf[10] = 0x00; FrameBuf[11] = 0xC2; FrameBuf[12] = 0x03; @@ -96,14 +78,14 @@ uint16_t Sl2s2002AppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) ResponseByteCount = 15; } } else if (Command == ISO15693_CMD_READ_SINGLE) { - if (ISO15693Addressed(FrameBuf, Sl2s2002Uid)) { + if (ISO15693Addressed(FrameBuf, Uid)) { uint8_t PageAddress = FrameBuf[10]; FrameBuf[0] = 0; /* Flags */ MemoryReadBlock(FrameBuf + 1, PageAddress * BYTES_PER_PAGE, BYTES_PER_PAGE); ResponseByteCount = 5; } } else if (Command == ISO15693_CMD_READ_MULTIPLE) { - if (ISO15693Addressed(FrameBuf, Sl2s2002Uid)) { + if (ISO15693Addressed(FrameBuf, Uid)) { uint16_t PageAddress = FrameBuf[10]; uint16_t PageAddressCount = FrameBuf[11] + 1; @@ -126,7 +108,7 @@ uint16_t Sl2s2002AppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) FrameBuf[0] = 0; /* Flags */ } } else if (Command == ISO15693_CMD_GET_BLOCK_SEC) { - if (ISO15693Addressed(FrameBuf, Sl2s2002Uid)) { + if (ISO15693Addressed(FrameBuf, Uid)) { uint8_t PageAddressStart = FrameBuf[10]; uint8_t PageAddressCount = FrameBuf[11] + 1; FrameBuf[0] = 0; /* Flags */ @@ -143,7 +125,7 @@ uint16_t Sl2s2002AppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) case STATE_QUIET: if (Command == ISO15693_CMD_RESET_TO_READY) { - if (ISO15693Addressed(FrameBuf, Sl2s2002Uid)) { + if (ISO15693Addressed(FrameBuf, Uid)) { FrameBuf[0] = 0; ResponseByteCount = 1; State = STATE_READY; @@ -174,12 +156,12 @@ uint16_t Sl2s2002AppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) void Sl2s2002GetUid(ConfigurationUidType Uid) { - memcpy(Uid, Sl2s2002Uid, sizeof(ConfigurationUidType)); + MemoryReadBlock(&Uid[0], MEM_UID_ADDRESS, ActiveConfiguration.UidSize); } void Sl2s2002SetUid(ConfigurationUidType Uid) { - memcpy(Sl2s2002Uid, Uid, sizeof(ConfigurationUidType)); + MemoryWriteBlock(Uid, MEM_UID_ADDRESS, ActiveConfiguration.UidSize); } diff --git a/Firmware/Chameleon-Mini/Application/Vicinity.c b/Firmware/Chameleon-Mini/Application/Vicinity.c index 7a3a961..3bfca1f 100644 --- a/Firmware/Chameleon-Mini/Application/Vicinity.c +++ b/Firmware/Chameleon-Mini/Application/Vicinity.c @@ -13,6 +13,7 @@ #include "../Random.h" #include "ISO15693-A.h" +#define MEM_UID_ADDRESS 0x00 static enum { STATE_READY, @@ -20,10 +21,6 @@ static enum { STATE_QUIET } State; -ISO15693UidType MyUid = {0x60, 0x0B, 0x88, 0x77, 0x06, 0x44, 0x02, 0xE1}; - - - void VicinityAppInit(void) { State = STATE_READY; @@ -46,13 +43,6 @@ void VicinityAppTick(void) } -void sendIntToTermina(uint8_t val) -{ - char buf[16]; - snprintf(buf,16, "%d,",val); - TerminalSendString(buf); -} - uint16_t VicinityAppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) { if (FrameBytes >= ISO15693_MIN_FRAME_SIZE) { @@ -60,24 +50,25 @@ uint16_t VicinityAppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) // At this point, we have a valid ISO15693 frame uint8_t Command = FrameBuf[1]; uint16_t ResponseByteCount = ISO15693_APP_NO_RESPONSE; - + uint8_t Uid[8]; + MemoryReadBlock(Uid, MEM_UID_ADDRESS, ActiveConfiguration.UidSize); switch(State) { case STATE_READY: if (Command == ISO15693_CMD_INVENTORY) { FrameBuf[0] = 0x00; /* Flags */ FrameBuf[1] = 0x00; /* DSFID */ - ISO15693CopyUid(&FrameBuf[2], MyUid); + ISO15693CopyUid(&FrameBuf[2], Uid); ResponseByteCount = 10; } else if (Command == ISO15693_CMD_STAY_QUIET) { - if (ISO15693Addressed(FrameBuf, MyUid)) { + if (ISO15693Addressed(FrameBuf, Uid)) { State = STATE_QUIET; } } else if (Command == ISO15693_CMD_GET_SYS_INFO) { - if (ISO15693Addressed(FrameBuf, MyUid)) { + if (ISO15693Addressed(FrameBuf, Uid)) { FrameBuf[0] = 0; /* Flags */ FrameBuf[1] = 0; /* InfoFlags */ - ISO15693CopyUid(&FrameBuf[2], MyUid); + ISO15693CopyUid(&FrameBuf[2], Uid); ResponseByteCount = 10; } } @@ -89,7 +80,8 @@ uint16_t VicinityAppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) case STATE_QUIET: if (Command == ISO15693_CMD_RESET_TO_READY) { - if (ISO15693Addressed(FrameBuf, MyUid)) { + MemoryReadBlock(Uid, MEM_UID_ADDRESS, ActiveConfiguration.UidSize); + if (ISO15693Addressed(FrameBuf, Uid)) { FrameBuf[0] = 0; ResponseByteCount = 1; State = STATE_READY; @@ -120,12 +112,12 @@ uint16_t VicinityAppProcess(uint8_t* FrameBuf, uint16_t FrameBytes) void VicinityGetUid(ConfigurationUidType Uid) { - memcpy(Uid, MyUid, sizeof(ConfigurationUidType)); + MemoryReadBlock(&Uid[0], MEM_UID_ADDRESS, ActiveConfiguration.UidSize); } void VicinitySetUid(ConfigurationUidType Uid) { - memcpy(MyUid, Uid, sizeof(ConfigurationUidType)); + MemoryWriteBlock(Uid, MEM_UID_ADDRESS, ActiveConfiguration.UidSize); } diff --git a/Firmware/Chameleon-Mini/Codec/Codec.h b/Firmware/Chameleon-Mini/Codec/Codec.h index 4324126..0eb47d0 100644 --- a/Firmware/Chameleon-Mini/Codec/Codec.h +++ b/Firmware/Chameleon-Mini/Codec/Codec.h @@ -108,6 +108,13 @@ typedef enum { extern uint8_t CodecBuffer[CODEC_BUFFER_SIZE]; +volatile void (*isr_func_TCD0_CCC_vect)(void); +void isr_Reader14443_2A_TCD0_CCC_vect(void); +void isr_ISO15693_CODEC_TIMER_SAMPLING_CCC_VECT(void); +volatile void (*isr_func_CODEC_DEMOD_IN_INT0_VECT)(void); +void isr_ISO14443_2A_TCD0_CCC_vect(void); +void isr_ISO15693_CODEC_DEMOD_IN_INT0_VECT(void); + INLINE void CodecInit(void) { ActiveConfiguration.CodecInitFunc(); } diff --git a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c index ba91594..c024b85 100644 --- a/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/ISO14443-2A.c @@ -76,10 +76,17 @@ static void StartDemod(void) { /* Start looking out for modulation pause via interrupt. */ CODEC_DEMOD_IN_PORT.INTFLAGS = 0x03; - CODEC_DEMOD_IN_PORT.INT1MASK = CODEC_DEMOD_IN_MASK0; + CODEC_DEMOD_IN_PORT.INT0MASK = CODEC_DEMOD_IN_MASK0; } -ISR(CODEC_DEMOD_IN_INT1_VECT) { +ISR (CODEC_DEMOD_IN_INT0_VECT) +{ + isr_func_CODEC_DEMOD_IN_INT0_VECT(); +} + +// ISR(CODEC_DEMOD_IN_INT0_VECT) +void isr_ISO14443_2A_TCD0_CCC_vect(void) +{ /* This is the first edge of the first modulation-pause after StartDemod. * Now we have time to start * demodulating beginning from one bit-width after this edge. */ @@ -109,7 +116,7 @@ ISR(CODEC_DEMOD_IN_INT1_VECT) { CODEC_TIMER_LOADMOD.CTRLA = CODEC_TIMER_CARRIER_CLKSEL; /* Disable this interrupt */ - CODEC_DEMOD_IN_PORT.INT1MASK = 0; + CODEC_DEMOD_IN_PORT.INT0MASK = 0; } ISR(CODEC_TIMER_SAMPLING_CCA_VECT) { @@ -381,6 +388,8 @@ void ISO14443ACodecInit(void) { Flags.DemodFinished = 0; Flags.LoadmodFinished = 0; + isr_func_TCD0_CCC_vect = &isr_Reader14443_2A_TCD0_CCC_vect; + isr_func_CODEC_DEMOD_IN_INT0_VECT = &isr_ISO14443_2A_TCD0_CCC_vect; CodecInitCommon(); StartDemod(); } diff --git a/Firmware/Chameleon-Mini/Codec/ISO15693.c b/Firmware/Chameleon-Mini/Codec/ISO15693.c index dcfac35..ea14517 100644 --- a/Firmware/Chameleon-Mini/Codec/ISO15693.c +++ b/Firmware/Chameleon-Mini/Codec/ISO15693.c @@ -82,7 +82,9 @@ static volatile uint16_t ReadCommandFromReader = 0; #ifdef CONFIG_VICINITY_SUPPORT // Started when a single pulse has been detected -ISR(CODEC_DEMOD_IN_INT0_VECT) { +// ISR(CODEC_DEMOD_IN_INT0_VECT) +void isr_ISO15693_CODEC_DEMOD_IN_INT0_VECT(void) +{ // Start sample timer CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_HI_gc; @@ -115,7 +117,8 @@ INLINE void ISO15693_EOC(void) CODEC_TIMER_SAMPLING.INTCTRLB = 0; } -ISR(CODEC_TIMER_SAMPLING_CCC_VECT) // Reading data sent from the reader +// ISR(CODEC_TIMER_SAMPLING_CCC_VECT) // Reading data sent from the reader +void isr_ISO15693_CODEC_TIMER_SAMPLING_CCC_VECT(void) { /* Shift demod data */ SampleRegister = (SampleRegister << 1) | (!(CODEC_DEMOD_IN_PORT.IN & CODEC_DEMOD_IN_MASK) ? 0x01 : 0x00); @@ -482,6 +485,8 @@ void StartISO15693Demod(void) { void ISO15693CodecInit(void) { CodecInitCommon(); + isr_func_TCD0_CCC_vect = &isr_ISO15693_CODEC_TIMER_SAMPLING_CCC_VECT; + isr_func_CODEC_DEMOD_IN_INT0_VECT = &isr_ISO15693_CODEC_DEMOD_IN_INT0_VECT; StartISO15693Demod(); } diff --git a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c index 6a70968..bc9869a 100644 --- a/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c +++ b/Firmware/Chameleon-Mini/Codec/Reader14443-2A.c @@ -48,6 +48,7 @@ void Reader14443ACodecInit(void) { /* Initialize common peripherals and start listening * for incoming data. */ CodecInitCommon(); + isr_func_TCD0_CCC_vect = &isr_Reader14443_2A_TCD0_CCC_vect; CodecSetDemodPower(true); CODEC_TIMER_SAMPLING.PER = SAMPLE_RATE_SYSTEM_CYCLES - 1; @@ -177,6 +178,12 @@ INLINE void BufferToSequence(void) } ISR (TCD0_CCC_vect) +{ + isr_func_TCD0_CCC_vect(); +} + +// ISR (TCD0_CCC_vect) +void isr_Reader14443_2A_TCD0_CCC_vect(void) { CODEC_TIMER_SAMPLING.INTFLAGS = TC0_CCCIF_bm; CODEC_TIMER_SAMPLING.INTCTRLB = TC_CCCINTLVL_OFF_gc;