## [unreleased][unreleased]
--trying to fix "hf 14b" command to be able to read CALYPSO card. (iceman)
- --trying to fix "t55x7" read with password bug. (iceman)
--
-### Added
+### Added
+- `lf t55xx read w` added wake with password then read following stream option to standard t55xx read commands (marshmellow)
- `hf mf eload u` added an ultralight/ntag option. (marshmellow)
- `hf iclass managekeys` to save, load and manage iclass keys. (adjusted most commands to accept a loaded key in memory) (marshmellow)
- `hf iclass readblk` to select, authenticate, and read 1 block from an iclass card (marshmellow)
- Added `data hex2bin` and `data bin2hex` for command line conversion between binary and hexadecimal (holiman)
### Changed
+- added lf t5xx read with password safety check and warning text
+- Adjusted LF FSK demod to account for cross threshold fluctuations (898 count waves will adjust the 9 to 8 now...) more accurate.
+- Adjusted timings for t55xx commands. more reliable now.
+- `lf cmdread` adjusted input methods and added help text (marshmellow & iceman)
- changed `lf config t <threshold>` to be 0 - 128 and will trigger on + or - threshold value (marshmellow)
- `hf iclass dump` cli options - can now dump AA1 and AA2 with different keys in one run (does not go to muliple pages for the larger tags yet)
- Revised workflow for StandAloneMode14a (Craig Young)
### Added
- Add `hf 14b reader` to find and print general info about known 14b tags (marshmellow)
-- Add `hf 14b info` to find and print full info about std 14b tags and sri tags (using 14b raw commands in the client) (marshmellow)
+- Add `hf 14b info` to find and print info about std 14b tags and sri tags (using 14b raw commands in the client) (marshmellow)
- Add PACE replay functionality (frederikmoellers)
### Fixed
CopyIndala224toT55x7(c->d.asDwords[0], c->d.asDwords[1], c->d.asDwords[2], c->d.asDwords[3], c->d.asDwords[4], c->d.asDwords[5], c->d.asDwords[6]);
break;
case CMD_T55XX_READ_BLOCK:
- T55xxReadBlock(c->arg[1], c->arg[2],c->d.asBytes[0]);
+ T55xxReadBlock(c->arg[0], c->arg[1], c->arg[2]);
break;
case CMD_T55XX_WRITE_BLOCK:
T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
case CMD_T55XX_READ_TRACE:
T55xxReadTrace();
break;
+ case CMD_T55XX_WAKEUP:
+ T55xxWakeUp(c->arg[0]);
+ break;
case CMD_PCF7931_READ:
ReadPCF7931();
break;
extern bool averaging;
void AcquireRawAdcSamples125k(int divisor);
-void ModThenAcquireRawAdcSamples125k(int delay_off,int period_0,int period_1,uint8_t *command);
+void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint32_t period_1, uint8_t *command);
void ReadTItag(void);
void WriteTItag(uint32_t idhi, uint32_t idlo, uint16_t crc);
+
void AcquireTiType(void);
void AcquireRawBitsTI(void);
void SimulateTagLowFrequency(int period, int gap, int ledcontrol);
void CopyIndala64toT55x7(int hi, int lo); // Clone Indala 64-bit tag by UID to T55x7
void CopyIndala224toT55x7(int uid1, int uid2, int uid3, int uid4, int uid5, int uid6, int uid7); // Clone Indala 224-bit tag by UID to T55x7
void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMode);
-void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode );
+void T55xxReadBlock(uint16_t arg0, uint8_t Block, uint32_t Pwd);
void T55xxReadTrace(void);
+void T55xxWakeUp(uint32_t Pwd);
void TurnReadLFOn();
void EM4xReadWord(uint8_t Address, uint32_t Pwd, uint8_t PwdMode);
void EM4xWriteWord(uint32_t Data, uint8_t Address, uint32_t Pwd, uint8_t PwdMode);
* @param period_1
* @param command
*/
-void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, uint8_t *command)
+void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint32_t period_1, uint8_t *command)
{
int divisor_used = 95; // 125 KHz
T55xxWriteBit(1);
T55xxWriteBit(0); //Page 0
- if (PwdMode == 1){
+ if (PwdMode){
// Send Pwd
for (i = 0x80000000; i != 0; i >>= 1)
T55xxWriteBit(Pwd & i);
// turn field off
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
cmd_send(CMD_ACK,0,0,0,0,0);
- LED_A_OFF();
+ LED_A_OFF();
+ LED_B_OFF();
}
// Read one card block in page 0
-void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) {
+void T55xxReadBlock(uint16_t arg0, uint8_t Block, uint32_t Pwd) {
LED_A_ON();
-
+ uint8_t PwdMode = arg0 & 0xFF;
uint32_t i = 0;
//clear buffer now so it does not interfere with timing later
// Set up FPGA, 125kHz
LFSetupFPGAForADC(95, true);
- // Trigger T55x7 in mode.
- // Trigger T55x7 Direct Access Mode
+ // Trigger T55x7 Direct Access Mode
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
SpinDelayUs(START_GAP);
T55xxWriteBit(1);
T55xxWriteBit(0); //Page 0
- if (PwdMode == 1){
+ if (PwdMode){
// Send Pwd
for (i = 0x80000000; i != 0; i >>= 1)
T55xxWriteBit(Pwd & i);
}
+
// Send a zero bit separation
T55xxWriteBit(0);
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
cmd_send(CMD_ACK,0,0,0,0,0);
LED_A_OFF();
+ LED_B_OFF();
}
// Read card traceability data (page 1)
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
cmd_send(CMD_ACK,0,0,0,0,0);
LED_A_OFF();
+ LED_B_OFF();
+}
+
+void T55xxWakeUp(uint32_t Pwd){
+ LED_B_ON();
+ uint32_t i = 0;
+
+ // Set up FPGA, 125kHz
+ LFSetupFPGAForADC(95, true);
+
+ // Trigger T55x7 Direct Access Mode
+ FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+ SpinDelayUs(START_GAP);
+
+ // Opcode 10
+ T55xxWriteBit(1);
+ T55xxWriteBit(0); //Page 0
+
+ // Send Pwd
+ for (i = 0x80000000; i != 0; i >>= 1)
+ T55xxWriteBit(Pwd & i);
+
+ // Turn field on to read the response
+ TurnReadLFOn(READ_GAP);
}
/*-------------- Cloning routines -----------*/
if ( bufsize > T55xx_SAMPLES_SIZE )
bufsize = T55xx_SAMPLES_SIZE;
- //memset(dest, 0, bufsize);
-
uint16_t i = 0;
+ uint16_t nosignal = 0;
bool startFound = false;
bool highFound = false;
uint8_t curSample = 0;
uint8_t firstSample = 0;
- for(;;) {
+ while(!BUTTON_PRESS()) {
+ WDT_HIT();
+ if ( nosignal == 0xFFFF ) break;
+
if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) {
AT91C_BASE_SSC->SSC_THR = 0x43;
LED_D_ON();
firstSample = curSample;
highFound = true;
} else if (!highFound) {
+ nosignal++;
continue;
}
int usage_lf_cmdread()
{
- PrintAndLog("Usage: lf cmdread <delay off> <zero> <one> <cmdbytes> [H|L]");
+ PrintAndLog("Usage: lf cmdread d <delay period> z <zero period> o <one period> c <cmdbytes> [H]");
PrintAndLog("Options: ");
PrintAndLog(" h This help");
- PrintAndLog(" <delay off> delay offset");
- PrintAndLog(" <zero> time period ZERO");
- PrintAndLog(" <one> time period ONE");
- PrintAndLog(" [H|L] Frequency Low (125 KHz) / High (134 KHz)");
+ PrintAndLog(" H Freqency High (134 KHz), default is 'Low (125KHz)'");
+ PrintAndLog(" d <delay> delay OFF period, (dec)");
+ PrintAndLog(" z <zero> time period ZERO, (dec)");
+ PrintAndLog(" o <one> time period ONE, (dec)");
+ PrintAndLog(" c <cmd> Command bytes");
+ PrintAndLog(" ************* All periods in microseconds (ms)");
PrintAndLog("Examples:");
- PrintAndLog(" lf cmdread 80 100 200 11000");
- PrintAndLog(" lf cmdread 80 100 100 11000 H");
+ PrintAndLog(" lf cmdread d 80 z 100 o 200 c 11000");
+ PrintAndLog(" lf cmdread d 80 z 100 o 100 c 11000 H");
return 0;
}
int CmdLFCommandRead(const char *Cmd)
{
static char dummy[3] = {0x20,0x00,0x00};
+ UsbCommand c = {CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K};
bool errors = FALSE;
- uint8_t divisor = 95; //125khz
- uint8_t cmdp =0;
- while(param_getchar(Cmd, cmdp) != 0x00)
- {
+
+ uint8_t cmdp = 0;
+ int strLength = 0;
+
+ while(param_getchar(Cmd, cmdp) != 0x00) {
switch(param_getchar(Cmd, cmdp))
{
case 'h':
return usage_lf_cmdread();
case 'H':
- divisor = 88;
+ dummy[1]='h';
cmdp++;
break;
- case 'a':
- //param_getchar(Cmd, cmdp+1) == '1';
+ case 'L':
+ cmdp++;
+ break;
+ case 'c':
+ strLength = param_getstr(Cmd, cmdp+1, (char *)&c.d.asBytes);
+ cmdp+=2;
+ break;
+ case 'd':
+ c.arg[0] = param_get32ex(Cmd, cmdp+1, 0, 10);
+ cmdp+=2;
+ break;
+ case 'z':
+ c.arg[1] = param_get32ex(Cmd, cmdp+1, 0, 10);
+ cmdp+=2;
+ break;
+ case 'o':
+ c.arg[2] = param_get32ex(Cmd, cmdp+1, 0, 10);
cmdp+=2;
break;
default:
if(errors) break;
}
// No args
- if(cmdp == 0) errors = 1;
+ if (cmdp == 0) errors = 1;
//Validations
- if(errors) return usage_lf_cmdread();
-
- UsbCommand c = {CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K};
-
- sscanf(Cmd, "%"lli" %"lli" %"lli" %s %s", &c.arg[0], &c.arg[1], &c.arg[2],(char*)(&c.d.asBytes),(char*)(&dummy+1));
+ if (errors) return usage_lf_cmdread();
- // in case they specified 'h'
- strcpy((char *)&c.d.asBytes + strlen((char *)c.d.asBytes), dummy);
+ // in case they specified 'H'
+ // added to the end..
+ strcpy((char *)&c.d.asBytes + strLength, dummy);
- PrintAndLog("ICE: %d %s -- %s", strlen((char *)c.d.asBytes) ,dummy, c.d.asBytes);
clearCommandBuffer();
SendCommand(&c);
return 0;
static command_t CommandTable[] =
{
{"help", CmdHelp, 1, "This help"},
+ {"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"},
{"em4x", CmdLFEM4X, 1, "{ EM4X RFIDs... }"},
- {"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"},
{"hid", CmdLFHID, 1, "{ HID RFIDs... }"},
{"hitag", CmdLFHitag, 1, "{ HITAG RFIDs... }"},
{"io", CmdLFIO, 1, "{ IOPROX RFIDs... }"},
\r
int usage_t55xx_config(){\r
PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1] [o <offset>]");\r
- PrintAndLog("Options: ");\r
+ PrintAndLog("Options:");\r
PrintAndLog(" h This help");\r
PrintAndLog(" b <8|16|32|40|50|64|100|128> Set bitrate");\r
PrintAndLog(" d <FSK|FSK1|FSK1a|FSK2|FSK2a|ASK|PSK1|PSK2|NRZ|BI|BIa> Set demodulation FSK / ASK / PSK / NRZ / Biphase / Biphase A");\r
return 0;\r
}\r
int usage_t55xx_read(){\r
- PrintAndLog("Usage: lf t55xx read <block> <password>");\r
- PrintAndLog(" <block>, block number to read. Between 0-7");\r
- PrintAndLog(" <password>, OPTIONAL password (8 hex characters)");\r
+ PrintAndLog("Usage: lf t55xx read b <block> p <password> <override_safety> <wakeup>");\r
+ PrintAndLog("Options:");\r
+ PrintAndLog(" b <block>, block number to read. Between 0-7");\r
+ PrintAndLog(" p <password>, OPTIONAL password 4bytes (8 hex symbols)");\r
+ PrintAndLog(" o, OPTIONAL override safety check");\r
+ PrintAndLog(" w, OPTIONAL wakeup");\r
+ PrintAndLog(" ****WARNING****");\r
+ PrintAndLog(" Use of read with password on a tag not configured for a pwd");\r
+ PrintAndLog(" can damage the tag");\r
PrintAndLog("");\r
PrintAndLog("Examples:");\r
- PrintAndLog(" lf t55xx read 0 - read data from block 0");\r
- PrintAndLog(" lf t55xx read 0 feedbeef - read data from block 0 password feedbeef");\r
+ PrintAndLog(" lf t55xx read b 0 - read data from block 0");\r
+ PrintAndLog(" lf t55xx read b 0 p feedbeef - read data from block 0 password feedbeef");\r
+ PrintAndLog(" lf t55xx read b 0 p feedbeef o - read data from block 0 password feedbeef safety check");\r
PrintAndLog("");\r
return 0;\r
}\r
int usage_t55xx_write(){\r
- PrintAndLog("Usage: lf t55xx wr <block> <data> [password]");\r
+ PrintAndLog("Usage: lf t55xx write <block> <data> [password]");\r
+ PrintAndLog("Options:");\r
PrintAndLog(" <block>, block number to write. Between 0-7");\r
- PrintAndLog(" <data>, 4 bytes of data to write (8 hex characters)");\r
- PrintAndLog(" [password], OPTIONAL password 4bytes (8 hex characters)");\r
+ PrintAndLog(" <data>, 4 bytes of data to write (8 hex symbols)");\r
+ PrintAndLog(" [password], OPTIONAL password 4bytes (8 hex symbols)");\r
PrintAndLog("");\r
PrintAndLog("Examples:");\r
- PrintAndLog(" lf t55xx wr 3 11223344 - write 11223344 to block 3");\r
- PrintAndLog(" lf t55xx wr 3 11223344 feedbeef - write 11223344 to block 3 password feedbeef");\r
+ PrintAndLog(" lf t55xx write 3 11223344 - write 11223344 to block 3");\r
+ PrintAndLog(" lf t55xx write 3 11223344 feedbeef - write 11223344 to block 3 password feedbeef");\r
PrintAndLog("");\r
return 0;\r
}\r
int usage_t55xx_trace() {\r
PrintAndLog("Usage: lf t55xx trace [1]");\r
+ PrintAndLog("Options:");\r
PrintAndLog(" [graph buffer data], if set, use Graphbuffer otherwise read data from tag.");\r
PrintAndLog("");\r
PrintAndLog("Examples:");\r
}\r
int usage_t55xx_info() {\r
PrintAndLog("Usage: lf t55xx info [1]");\r
+ PrintAndLog("Options:");\r
PrintAndLog(" [graph buffer data], if set, use Graphbuffer otherwise read data from tag.");\r
PrintAndLog("");\r
PrintAndLog("Examples:");\r
}\r
int usage_t55xx_dump(){\r
PrintAndLog("Usage: lf t55xx dump <password>");\r
+ PrintAndLog("Options:");\r
PrintAndLog(" <password>, OPTIONAL password 4bytes (8 hex symbols)");\r
PrintAndLog("");\r
PrintAndLog("Examples:");\r
return 0;\r
}\r
int usage_t55xx_detect(){\r
- PrintAndLog("Usage: lf t55xx detect");\r
+ PrintAndLog("Usage: lf t55xx detect [1]");\r
+ PrintAndLog("Options:");\r
+ PrintAndLog(" [graph buffer data], if set, use Graphbuffer otherwise read data from tag.");\r
PrintAndLog("");\r
PrintAndLog("Examples:");\r
PrintAndLog(" lf t55xx detect");\r
PrintAndLog("");\r
return 0;\r
}\r
+int usage_t55xx_wakup(){\r
+ PrintAndLog("Usage: lf t55xx wakeup [h] p <password>");\r
+ PrintAndLog("This commands send the Answer-On-Request command and leaves the readerfield ON afterwards.");\r
+ PrintAndLog("Options:");\r
+ PrintAndLog(" h - this help");\r
+ PrintAndLog(" p <password> - password 4bytes (8 hex symbols)");\r
+ PrintAndLog("");\r
+ PrintAndLog("Examples:");\r
+ PrintAndLog(" lf t55xx wakeup p 11223344 - send wakeup password");\r
+ return 0;\r
+}\r
\r
static int CmdHelp(const char *Cmd);\r
\r
}\r
\r
int CmdT55xxReadBlock(const char *Cmd) {\r
- int block = -1;\r
- int password = 0xFFFFFFFF; //default to blank Block 7\r
-\r
- char cmdp = param_getchar(Cmd, 0);\r
- if (cmdp == 'h' || cmdp == 'H') return usage_t55xx_read();\r
-\r
- int res = sscanf(Cmd, "%d %x", &block, &password);\r
-\r
- if ( res < 1 || res > 2 ) return usage_t55xx_read();\r
- \r
- if ((block < 0) | (block > 7)) {\r
+ uint8_t block = 255;\r
+ uint8_t wake = 0;\r
+ uint8_t usepwd = 0;\r
+ uint32_t password = 0xFFFFFFFF; //default to blank Block 7\r
+ uint8_t override = 0;\r
+ uint8_t cmdp = 0;\r
+ bool errors = false;\r
+ while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {\r
+ switch(param_getchar(Cmd, cmdp)) {\r
+ case 'h':\r
+ case 'H':\r
+ return usage_t55xx_read();\r
+ case 'b':\r
+ case 'B':\r
+ errors |= param_getdec(Cmd, cmdp+1, &block);\r
+ cmdp+=2;\r
+ break;\r
+ case 'o':\r
+ case 'O':\r
+ override = 1;\r
+ cmdp++;\r
+ break;\r
+ case 'p':\r
+ case 'P':\r
+ password = param_get32ex(Cmd, cmdp+1, 0, 10);\r
+ usepwd = 1;\r
+ cmdp+=2;\r
+ break;\r
+ case 'w':\r
+ case 'W':\r
+ wake = 1;\r
+ cmdp++;\r
+ break;\r
+ default:\r
+ PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));\r
+ errors = true;\r
+ break;\r
+ }\r
+ }\r
+ if (errors) return usage_t55xx_read();\r
+ if (wake && !usepwd) {\r
+ PrintAndLog("Wake command must use a pwd");\r
+ return 1;\r
+ }\r
+ if ((block > 7) && !wake) {\r
PrintAndLog("Block must be between 0 and 7");\r
return 1;\r
} \r
\r
- UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, 0}};\r
- c.d.asBytes[0] = 0x0; \r
+ UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, password}};\r
\r
//Password mode\r
- if ( res == 2 ) {\r
- \r
+ if ( usepwd || wake ) {\r
// try reading the config block and verify that PWD bit is set before doing this!\r
- AquireData( CONFIGURATION_BLOCK );\r
- if ( !tryDetectModulation() ) {\r
- PrintAndLog("Could not detect is PWD bit is set in config block. Exits.");\r
- return 1;\r
- }\r
- //if PWD bit is set, allow to execute read command with password.\r
- if (( config.block0 & T55x7_PWD ) == 1) {\r
- c.arg[2] = password;\r
- c.d.asBytes[0] = 0x1; \r
- } else { \r
- PrintAndLog("PWD bit is NOT set in config block. Reading without password...");\r
+ if ( wake || override ) {\r
+ c.arg[0] = (wake<<8) & usepwd;\r
+ if ( !wake && override )\r
+ PrintAndLog("Safety Check Overriden - proceeding despite risk");\r
+ } else {\r
+ AquireData( CONFIGURATION_BLOCK );\r
+ if ( !tryDetectModulation() ) {\r
+ PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits.");\r
+ return 1;\r
+ } else { \r
+ PrintAndLog("Safety Check: PWD bit is NOT set in config block. Reading without password..."); \r
+ }\r
}\r
}\r
\r
//DemodBufferLen=0;\r
if (!DecodeT55xxBlock()) return 3;\r
char blk[10]={0};\r
+ if ( wake ) {\r
+ sprintf(blk,"wake");\r
+ } else {\r
sprintf(blk,"%d", block);\r
+ }\r
printT55xxBlock(blk);\r
return 0;\r
}\r
\r
}\r
\r
+int CmdT55xxWakeUp(const char *Cmd) {\r
+ uint32_t password = 0xFFFFFFFF; //default to blank Block 7\r
+ uint8_t cmdp = 0;\r
+ bool errors = false;\r
+ while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {\r
+ switch(param_getchar(Cmd, cmdp)) {\r
+ case 'h':\r
+ case 'H':\r
+ return usage_t55xx_wakup();\r
+ case 'p':\r
+ case 'P':\r
+ password = param_get32ex(Cmd, cmdp+1, 0, 10);\r
+ cmdp+=2;\r
+ break;\r
+ default:\r
+ PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));\r
+ errors = true;\r
+ break;\r
+ }\r
+ }\r
+ if (errors) return usage_t55xx_wakup();\r
+ \r
+ UsbCommand c = {CMD_T55XX_WAKEUP, {password, 0, 0}};\r
+\r
+ clearCommandBuffer();\r
+ SendCommand(&c);\r
+ PrintAndLog("Wake up command sent. Try read now");\r
+ return 0;\r
+}\r
+\r
/*\r
uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits){\r
\r
{"info", CmdT55xxInfo, 0, "[1] Show T55xx configuration data (page 0/ blk 0)"},\r
{"dump", CmdT55xxDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"},\r
{"special", special, 0, "Show block changes with 64 different offsets"},\r
+ {"wakeup", CmdT55xxWakeUp, 0, "Send AOR wakeup command"},\r
+ \r
{NULL, NULL, 0, NULL}\r
};\r
\r
#define CMD_T55XX_READ_BLOCK 0x0214
#define CMD_T55XX_WRITE_BLOCK 0x0215
#define CMD_T55XX_READ_TRACE 0x0216
+#define CMD_T55XX_WAKEUP 0x0224
+
#define CMD_PCF7931_READ 0x0217
#define CMD_PCF7931_WRITE 0x0223
#define CMD_EM4X_READ_WORD 0x0218
#define CMD_AWID_DEMOD_FSK 0x0221
#define CMD_VIKING_CLONE_TAG 0x0222
+
/* CMD_SET_ADC_MUX: ext1 is 0 for lopkd, 1 for loraw, 2 for hipkd, 3 for hiraw */
// For the 13.56 MHz tags
CMD_PSK_SIM_TAG = 0x0220,
CMD_AWID_DEMOD_FSK = 0x0221,
CMD_VIKING_CLONE_TAG = 0x0222,
+ CMD_T55XX_WAKEUP = 0x0224,
--/* CMD_SET_ADC_MUX: ext1 is 0 for lopkd, 1 for loraw, 2 for hipkd, 3 for hiraw */
#define CMD_PSK_SIM_TAG 0x0220
#define CMD_AWID_DEMOD_FSK 0x0221
#define CMD_VIKING_CLONE_TAG 0x0222
-
+#define CMD_T55XX_WAKEUP 0x0224
/* CMD_SET_ADC_MUX: ext1 is 0 for lopkd, 1 for loraw, 2 for hipkd, 3 for hiraw */