static int timeout = 4096;
-// CARD TO READER
-// Sequence D: 11110000 modulation with subcarrier during first half
-// Sequence E: 00001111 modulation with subcarrier during second half
-// Sequence F: 00000000 no modulation with subcarrier
-// READER TO CARD
-// Sequence X: 00001100 drop after half a period
-// Sequence Y: 00000000 no drop
-// Sequence Z: 11000000 drop at start
-#define SEC_X 0x0c
-#define SEC_Y 0x00
-#define SEC_Z 0xc0
static int SendIClassAnswer(uint8_t *resp, int respLen, int delay);
int samples = 0;
rsamples = 0;
- memset(trace, 0x44, RECV_CMD_OFFSET);
-
// Set up the demodulator for tag -> reader responses.
Demod.output = tagToReaderResponse;
Demod.len = 0;
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_SNIFFER);
SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
+ uint32_t time_0 = GetCountSspClk();
+
+
int div = 0;
//int div2 = 0;
int decbyte = 0;
rsamples = samples - Uart.samples;
LED_C_ON();
- if(!LogTrace(readerToTagCmd,Uart.byteCnt, rsamples, Uart.parityBits,TRUE)) break;
+ //if(!LogTrace(Uart.output,Uart.byteCnt, rsamples, Uart.parityBits,TRUE)) break;
//if(!LogTrace(NULL, 0, Uart.endTime*16 - DELAY_READER_AIR2ARM_AS_SNIFFER, 0, TRUE)) break;
+ if(tracing)
+ {
+ LogTrace(Uart.output,Uart.byteCnt, (GetCountSspClk()-time_0) << 4, Uart.parityBits,TRUE);
+ LogTrace(NULL, 0, (GetCountSspClk()-time_0) << 4, 0, TRUE);
+ }
+
/* And ready to receive another command. */
Uart.state = STATE_UNSYNCD;
rsamples = samples - Demod.samples;
LED_B_ON();
- if(!LogTrace(tagToReaderResponse,Demod.len, rsamples, Demod.parityBits,FALSE)) break;
- //if (!LogTrace(NULL, 0, Demod.endTime*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER, 0, FALSE)) break;
+ if(tracing)
+ {
+ LogTrace(Demod.output,Demod.len, (GetCountSspClk()-time_0) << 4 , Demod.parityBits,FALSE);
+ LogTrace(NULL, 0, (GetCountSspClk()-time_0) << 4, 0, FALSE);
+ }
// And ready to receive another response.
//-----------------------------------------------------------------------------
static void CodeIClassTagAnswer(const uint8_t *cmd, int len)
{
+ //So far a dummy implementation, not used
+ //int lastProxToAirDuration =0;
int i;
ToSendReset();
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0x00;
- ToSend[++ToSendMax] = 0xff;
+ ToSend[++ToSendMax] = 0xff;//Proxtoair duration starts here
ToSend[++ToSendMax] = 0xff;
ToSend[++ToSendMax] = 0xff;
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0xff;
ToSend[++ToSendMax] = 0xff;
- ToSend[++ToSendMax] = 0xff;
+ ToSend[++ToSendMax] = 0xff;
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0x00;
+ //lastProxToAirDuration = 8*ToSendMax - 3*8 - 3*8;//Not counting zeroes in the beginning or end
+
// Convert from last byte pos to length
ToSendMax++;
}
// Only SOF
static void CodeIClassTagSOF()
{
- ToSendReset();
+ //So far a dummy implementation, not used
+ //int lastProxToAirDuration =0;
+ ToSendReset();
// Send SOF
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0xff;
ToSend[++ToSendMax] = 0x00;
ToSend[++ToSendMax] = 0xff;
+
+// lastProxToAirDuration = 8*ToSendMax - 3*8;//Not counting zeroes in the beginning
+
// Convert from last byte pos to length
ToSendMax++;
return; // Button pressed
}
}
- }else{
+ }
+ else{
// We may want a mode here where we hardcode the csns to use (from proxclone).
// That will speed things up a little, but not required just yet.
Dbprintf("The mode is not implemented, reserved for future use");
*/
int doIClassSimulation(uint8_t csn[], int breakAfterMacReceived)
{
+
// CSN followed by two CRC bytes
uint8_t response2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t response3[] = { 0,0,0,0,0,0,0,0,0,0};
CodeIClassTagAnswer(response4, sizeof(response4));
memcpy(resp4, ToSend, ToSendMax); resp4Len = ToSendMax;
+
+ // Start from off (no field generated)
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+ SpinDelay(200);
+
+
// We need to listen to the high-frequency, peak-detected path.
SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
FpgaSetupSsc();
// To control where we are in the protocol
int cmdsRecvd = 0;
+ uint32_t time_0 = GetCountSspClk();
+ uint32_t t2r_time =0;
+ uint32_t r2t_time =0;
LED_A_ON();
bool displayDebug = true;
bool buttonPressed = false;
while(!exitLoop) {
+ displayDebug = true;
+
LED_B_OFF();
+ //Signal tracer
+ // Can be used to get a trigger for an oscilloscope..
+ LED_C_OFF();
+
if(!GetIClassCommandFromReader(receivedCmd, &len, 100)) {
buttonPressed = true;
break;
}
+ r2t_time = GetCountSspClk();
+ //Signal tracer
+ LED_C_ON();
// Okay, look at the command now.
if(receivedCmd[0] == 0x0a ) {
resp = resp2; respLen = resp2Len; //order = 2;
respdata = response2;
respsize = sizeof(response2);
- displayDebug = false;
+ //displayDebug = false;
//DbpString("Reader requests anticollission CSN:");
} else if(receivedCmd[0] == 0x81) {
// Reader selects anticollission CSN.
respsize = 0;
}
- if(cmdsRecvd > 999) {
- DbpString("1000 commands later...");
+ if(cmdsRecvd > 100) {
+ //DbpString("100 commands later...");
break;
}
else {
if(respLen > 0) {
SendIClassAnswer(resp, respLen, 21);
+ t2r_time = GetCountSspClk();
+// }
if(displayDebug) Dbprintf("R2T:(len=%d): %x %x %x %x %x %x %x %x %x\nT2R: (total/data =%d/%d): %x %x %x %x %x %x %x %x %x",
len,
receivedCmd[0], receivedCmd[1], receivedCmd[2],
if (tracing) {
//LogTrace(receivedCmd,len, rsamples, Uart.parityBits, TRUE);
- if(!LogTrace(receivedCmd,len, rsamples, Uart.parityBits,TRUE))
- {
- DbpString("Trace full");
- break;
- }
+
+ LogTrace(receivedCmd,len, (r2t_time-time_0)<< 4, Uart.parityBits,TRUE);
+ LogTrace(NULL,0, (r2t_time-time_0) << 4, 0,TRUE);
if (respdata != NULL) {
//LogTrace(respdata,respsize, rsamples, SwapBits(GetParity(respdata,respsize),respsize), FALSE);
//if(!LogTrace(resp,respLen, rsamples,SwapBits(GetParity(respdata,respsize),respsize),FALSE))
- if(!LogTrace(respdata,respsize, rsamples,SwapBits(GetParity(respdata,respsize),respsize),FALSE))
- {
- DbpString("Trace full");
- break;
- }
+ LogTrace(respdata,respsize, (t2r_time-time_0) << 4,SwapBits(GetParity(respdata,respsize),respsize),FALSE);
+ LogTrace(NULL,0, (t2r_time-time_0) << 4,0,FALSE);
+
+
}
+ if(!tracing) {
+ DbpString("Trace full");
+ //break;
+ }
+
}
memset(receivedCmd, 0x44, RECV_CMD_SIZE);
}
{
DbpString("Button pressed");
}
-
return buttonPressed;
}
static int SendIClassAnswer(uint8_t *resp, int respLen, int delay)
{
- int i = 0, u = 0, d = 0;
+ int i = 0, d=0;//, u = 0, d = 0;
uint8_t b = 0;
- // return 0;
- // Modulate Manchester
- // FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD424);
- FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_MOD);
+
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR|FPGA_HF_SIMULATOR_MODULATE_424K);
+
AT91C_BASE_SSC->SSC_THR = 0x00;
FpgaSetupSsc();
-
- // send cycle
- for(;;) {
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
- volatile uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
- (void)b;
+ while(!BUTTON_PRESS()) {
+ if((AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY)){
+ b = AT91C_BASE_SSC->SSC_RHR; (void) b;
}
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
+ if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)){
+ b = 0x00;
if(d < delay) {
- b = 0x00;
d++;
}
- else if(i >= respLen) {
- b = 0x00;
- u++;
- } else {
- b = resp[i];
- u++;
- if(u > 1) { i++; u = 0; }
+ else {
+ if( i < respLen){
+ b = resp[i];
+ //Hack
+ //b = 0xAC;
+ }
+ i++;
}
AT91C_BASE_SSC->SSC_THR = b;
-
- if(u > 4) break;
- }
- if(BUTTON_PRESS()) {
- break;
}
+
+ if (i > respLen +4) break;
}
return 0;
static void TransmitIClassCommand(const uint8_t *cmd, int len, int *samples, int *wait)
{
int c;
-
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD);
AT91C_BASE_SSC->SSC_THR = 0x00;
FpgaSetupSsc();
b = cmd[i];
for(j = 0; j < 4; j++) {
for(k = 0; k < 4; k++) {
- if(k == (b & 3)) {
- ToSend[++ToSendMax] = 0x0f;
- }
- else {
- ToSend[++ToSendMax] = 0x00;
- }
+ if(k == (b & 3)) {
+ ToSend[++ToSendMax] = 0x0f;
+ }
+ else {
+ ToSend[++ToSendMax] = 0x00;
+ }
}
b >>= 2;
}