mirror of
https://github.com/RfidResearchGroup/ChameleonMini.git
synced 2026-05-12 11:20:37 -07:00
get iso15 buildable, runable and accepted by android reader
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user