get iso15 buildable, runable and accepted by android reader

This commit is contained in:
Thorsten Bosbach
2018-08-18 12:37:59 +02:00
parent 6c1dabd92f
commit d0c0da7d70
7 changed files with 73 additions and 71 deletions
@@ -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
+13 -31
View File
@@ -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);
}
+11 -19
View File
@@ -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);
}
+7
View File
@@ -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();
}
+12 -3
View File
@@ -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();
}
+7 -2
View File
@@ -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;