summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhenryk <henryk@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2007-12-15 17:13:26 +0000
committerhenryk <henryk@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2007-12-15 17:13:26 +0000
commit40bf6fbf1a821fdb0891ed7c0989d1a3548d503a (patch)
treecd9bca4a88562ea7449e01e2cbd4ef10b4d7b318
parent91d960e6945a1bb8e70e41d62fbb3be93b16f989 (diff)
Further the distinction between SSC and PDC transfersize
Add convenient access to the last data bit from the miller decoder for type a frames git-svn-id: https://svn.openpcd.org:2342/trunk@391 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
-rw-r--r--openpicc/application/iso14443_layer3a.c14
-rw-r--r--openpicc/application/iso14443_layer3a.h3
-rw-r--r--openpicc/application/iso14443a_miller.c4
-rw-r--r--openpicc/application/ssc_picc.c18
-rw-r--r--openpicc/application/ssc_picc.h3
5 files changed, 24 insertions, 18 deletions
diff --git a/openpicc/application/iso14443_layer3a.c b/openpicc/application/iso14443_layer3a.c
index e3ce769..57a7c23 100644
--- a/openpicc/application/iso14443_layer3a.c
+++ b/openpicc/application/iso14443_layer3a.c
@@ -43,7 +43,7 @@
static enum ISO14443_STATES state = STARTING_UP;
const iso14443_frame ATQA_FRAME = {
TYPE_A,
- {{STANDARD_FRAME, PARITY}},
+ {{STANDARD_FRAME, PARITY, ISO14443A_LAST_BIT_NONE}},
2,
0, 0,
{4, 0},
@@ -52,7 +52,7 @@ const iso14443_frame ATQA_FRAME = {
const iso14443_frame NULL_FRAME = {
TYPE_A,
- {{STANDARD_FRAME, PARITY}},
+ {{STANDARD_FRAME, PARITY, ISO14443A_LAST_BIT_NONE}},
4,
0, 0,
//{0xF3, 0xFB, 0xAE, 0xED},
@@ -66,8 +66,8 @@ const iso14443_frame NULL_FRAME = {
#define LAYER3_DEBUG usb_print_string
-#define INITIAL_STATE IDLE
-//#define INITIAL_STATE ACTIVE
+//#define INITIAL_STATE IDLE
+#define INITIAL_STATE ACTIVE
#if INITIAL_STATE == IDLE
#define INITIAL_FRAME ATQA_FRAME
@@ -307,12 +307,14 @@ void iso14443_layer3a_state_machine (void *pvParameters)
vLedBlinkGreen();
if(1) {
int i = usb_print_set_default_flush(0);
- DumpBufferToUSB((char*)buffer->data, buffer->len/8);
+ DumpBufferToUSB((char*)buffer->data, (buffer->len+7)/8);
DumpStringToUSB(" Decoded: ");
DumpUIntToUSB(buffer->len);
DumpStringToUSB(" ");
- iso14443a_decode_miller(&received_frame, buffer->data, buffer->len/8);
+ iso14443a_decode_miller(&received_frame, buffer->data, (buffer->len+7)/8);
DumpBufferToUSB((char*)received_frame.data, received_frame.numbytes + (received_frame.numbits+7)/8);
+ DumpStringToUSB(" ");
+ DumpUIntToUSB(received_frame.parameters.a.last_bit);
DumpStringToUSB("\n\r");
usb_print_set_default_flush(i);
}
diff --git a/openpicc/application/iso14443_layer3a.h b/openpicc/application/iso14443_layer3a.h
index 9b00ccb..a31c92f 100644
--- a/openpicc/application/iso14443_layer3a.h
+++ b/openpicc/application/iso14443_layer3a.h
@@ -100,7 +100,8 @@ typedef struct {
enum { PARITY, /* Calculate parity on the fly, ignore the parity field below */
GIVEN_PARITY, /* Use the parity bits from the parity field below */
NO_PARITY, /* Don't send any parity */
- } parity;
+ } parity;
+ enum { ISO14443A_LAST_BIT_0 = 0, ISO14443A_LAST_BIT_1 = 1, ISO14443A_LAST_BIT_NONE } last_bit;
} a;
} parameters;
u_int32_t numbytes;
diff --git a/openpicc/application/iso14443a_miller.c b/openpicc/application/iso14443a_miller.c
index 16f0c89..d7c24cd 100644
--- a/openpicc/application/iso14443a_miller.c
+++ b/openpicc/application/iso14443a_miller.c
@@ -51,7 +51,7 @@ enum miller_sequence {
int iso14443a_decode_miller(iso14443_frame *frame,
const u_int8_t *sample_buf, const u_int16_t sample_buf_len)
{
- signed int i, j, bit = 0, last_bit = -1;
+ signed int i, j, bit = 0, last_bit = -1, next_to_last_bit = 0;
enum miller_sequence current_seq;
unsigned int bitpos = 0;
@@ -88,6 +88,7 @@ int iso14443a_decode_miller(iso14443_frame *frame,
switch(bit) {
case BIT_ENDMARKER:
bitpos-=2; /* Subtract this sequence and the previous sequence (which was a 0) */
+ frame->parameters.a.last_bit = next_to_last_bit;
break;
case 0: /* Fall-through */
case 1: {
@@ -100,6 +101,7 @@ int iso14443a_decode_miller(iso14443_frame *frame,
}
}
+ next_to_last_bit = last_bit;
last_bit = bit;
bitpos++;
}
diff --git a/openpicc/application/ssc_picc.c b/openpicc/application/ssc_picc.c
index 09be1e5..520098d 100644
--- a/openpicc/application/ssc_picc.c
+++ b/openpicc/application/ssc_picc.c
@@ -72,16 +72,16 @@ static struct ssc_state ssc_state;
* the SSC supports different sizes, all PDC tranfers will be either 8, 16 or 32, rounding up.) */
static const ssc_mode_def ssc_sizes[] = {
/* Undefined, no size set */
- [SSC_MODE_NONE] = {SSC_MODE_NONE, 0, 0},
+ [SSC_MODE_NONE] = {SSC_MODE_NONE, 0, 0, 0},
/* 14443A Short Frame: 1 transfer of ISO14443A_SHORT_LEN bits */
- [SSC_MODE_14443A_SHORT] = {SSC_MODE_14443A_SHORT, ISO14443A_SHORT_TRANSFER_SIZE, 1},
+ [SSC_MODE_14443A_SHORT] = {SSC_MODE_14443A_SHORT, ISO14443A_SHORT_LEN, ISO14443A_SHORT_TRANSFER_SIZE, 1},
/* 14443A Standard Frame: FIXME 16 transfers of 32 bits (maximum number), resulting in 512 samples */
- [SSC_MODE_14443A_STANDARD] = {SSC_MODE_14443A_STANDARD, 32, 16},
+ [SSC_MODE_14443A_STANDARD] = {SSC_MODE_14443A_STANDARD, 32, 32, 16},
/* 14443A Frame, don't care if standard or short */
- [SSC_MODE_14443A] = {SSC_MODE_14443A, ISO14443A_SAMPLE_LEN, ISO14443A_MAX_RX_FRAME_SIZE_IN_BITS},
- [SSC_MODE_14443B] = {SSC_MODE_14443B, 32, 16}, /* 64 bytes */
- [SSC_MODE_EDGE_ONE_SHOT] = {SSC_MODE_EDGE_ONE_SHOT, 32, 16}, /* 64 bytes */
- [SSC_MODE_CONTINUOUS] = {SSC_MODE_CONTINUOUS, 32, 511}, /* 2044 bytes */
+ [SSC_MODE_14443A] = {SSC_MODE_14443A, ISO14443A_SAMPLE_LEN, 8, ISO14443A_MAX_RX_FRAME_SIZE_IN_BITS},
+ [SSC_MODE_14443B] = {SSC_MODE_14443B, 32, 32, 16}, /* 64 bytes */
+ [SSC_MODE_EDGE_ONE_SHOT] = {SSC_MODE_EDGE_ONE_SHOT, 32, 32, 16}, /* 64 bytes */
+ [SSC_MODE_CONTINUOUS] = {SSC_MODE_CONTINUOUS, 32, 32, 511}, /* 2044 bytes */
};
/* ************** SSC BUFFER HANDLING *********************** */
@@ -154,7 +154,7 @@ static int __ramfunc __ssc_rx_load(int secondary)
}
DEBUGR("filling SSC RX%u dma ctx: %u (len=%u) ", secondary,
req_ctx_num(buffer), buffer->size);
- buffer->len = ssc_sizes[ssc_state.mode].transfersize * ssc_sizes[ssc_state.mode].transfers;
+ buffer->len = ssc_sizes[ssc_state.mode].transfersize_ssc * ssc_sizes[ssc_state.mode].transfers;
buffer->reception_mode = &ssc_sizes[ssc_state.mode];
if(ssc_state.buffer[secondary] != NULL) {
@@ -202,7 +202,7 @@ static ssc_dma_rx_buffer_t* __ramfunc __ssc_rx_unload(int secondary)
u_int16_t remaining_transfers = (secondary ? rx_pdc->PDC_RNCR : rx_pdc->PDC_RCR);
u_int8_t* next_transfer_location = (u_int8_t*)(secondary ? rx_pdc->PDC_RNPR : rx_pdc->PDC_RPR);
u_int16_t elapsed_transfers = buffer->reception_mode->transfers - remaining_transfers;
- u_int32_t elapsed_size = buffer->reception_mode->transfersize/8 * elapsed_transfers;
+ u_int32_t elapsed_size = buffer->reception_mode->transfersize_pdc/8 * elapsed_transfers;
/* Consistency check */
if( next_transfer_location - elapsed_size != buffer->data ) {
diff --git a/openpicc/application/ssc_picc.h b/openpicc/application/ssc_picc.h
index 9600bab..937cab5 100644
--- a/openpicc/application/ssc_picc.h
+++ b/openpicc/application/ssc_picc.h
@@ -67,7 +67,8 @@ typedef enum {
typedef struct {
enum ssc_mode mode;
- u_int16_t transfersize;
+ u_int16_t transfersize_ssc;
+ u_int16_t transfersize_pdc;
u_int16_t transfers;
} ssc_mode_def;
personal git repositories of Harald Welte. Your mileage may vary