mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
Make sure standalone modes can be launched when connected on USB without client
This commit is contained in:
parent
b7016e0bed
commit
d7614684f8
6 changed files with 72 additions and 35 deletions
|
@ -436,7 +436,7 @@ void SendCapabilities(void) {
|
||||||
capabilities_t capabilities;
|
capabilities_t capabilities;
|
||||||
capabilities.version = CAPABILITIES_VERSION;
|
capabilities.version = CAPABILITIES_VERSION;
|
||||||
capabilities.via_fpc = reply_via_fpc;
|
capabilities.via_fpc = reply_via_fpc;
|
||||||
|
capabilities.via_usb = reply_via_usb;
|
||||||
capabilities.baudrate = 0; // no real baudrate for USB-CDC
|
capabilities.baudrate = 0; // no real baudrate for USB-CDC
|
||||||
#ifdef WITH_FPC_USART
|
#ifdef WITH_FPC_USART
|
||||||
if (reply_via_fpc)
|
if (reply_via_fpc)
|
||||||
|
@ -742,6 +742,10 @@ static void PacketReceived(PacketCommandNG *packet) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
switch (packet->cmd) {
|
switch (packet->cmd) {
|
||||||
|
case CMD_QUIT_SESSION:
|
||||||
|
reply_via_fpc = false;
|
||||||
|
reply_via_usb = false;
|
||||||
|
break;
|
||||||
#ifdef WITH_LF
|
#ifdef WITH_LF
|
||||||
case CMD_SET_LF_T55XX_CONFIG:
|
case CMD_SET_LF_T55XX_CONFIG:
|
||||||
setT55xxConfig(packet->oldarg[0], (t55xx_config *) packet->data.asBytes);
|
setT55xxConfig(packet->oldarg[0], (t55xx_config *) packet->data.asBytes);
|
||||||
|
|
|
@ -211,6 +211,10 @@ main_loop(char *script_cmds_file, char *script_cmd) {
|
||||||
}
|
}
|
||||||
} // end while
|
} // end while
|
||||||
|
|
||||||
|
clearCommandBuffer();
|
||||||
|
SendCommandNG(CMD_QUIT_SESSION, NULL, 0);
|
||||||
|
msleep(100); // Make sure command is sent before killing client
|
||||||
|
|
||||||
if (sf)
|
if (sf)
|
||||||
fclose(sf);
|
fclose(sf);
|
||||||
|
|
||||||
|
|
53
common/cmd.c
53
common/cmd.c
|
@ -37,15 +37,7 @@ bool reply_with_crc_on_usb = false;
|
||||||
bool reply_with_crc_on_fpc = true;
|
bool reply_with_crc_on_fpc = true;
|
||||||
// "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART
|
// "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART
|
||||||
bool reply_via_fpc = false;
|
bool reply_via_fpc = false;
|
||||||
|
bool reply_via_usb = false;
|
||||||
#ifdef WITH_FPC_USART_HOST
|
|
||||||
extern void Dbprintf(const char *fmt, ...);
|
|
||||||
#define Dbprintf_usb(...) {\
|
|
||||||
bool tmp = reply_via_fpc;\
|
|
||||||
reply_via_fpc = false;\
|
|
||||||
Dbprintf(__VA_ARGS__);\
|
|
||||||
reply_via_fpc = tmp;}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) {
|
int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) {
|
||||||
PacketResponseOLD txcmd;
|
PacketResponseOLD txcmd;
|
||||||
|
@ -67,20 +59,25 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int result = PM3_EUNDEF;
|
int resultfpc = PM3_EUNDEF;
|
||||||
|
int resultusb = PM3_EUNDEF;
|
||||||
// Send frame and make sure all bytes are transmitted
|
// Send frame and make sure all bytes are transmitted
|
||||||
|
|
||||||
|
if (reply_via_usb) {
|
||||||
|
resultusb = usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD));
|
||||||
|
}
|
||||||
|
|
||||||
if (reply_via_fpc) {
|
if (reply_via_fpc) {
|
||||||
#ifdef WITH_FPC_USART_HOST
|
#ifdef WITH_FPC_USART_HOST
|
||||||
result = usart_writebuffer_sync((uint8_t *)&txcmd, sizeof(PacketResponseOLD));
|
resultfpc = usart_writebuffer_sync((uint8_t *)&txcmd, sizeof(PacketResponseOLD));
|
||||||
#else
|
#else
|
||||||
return PM3_EDEVNOTSUPP;
|
return PM3_EDEVNOTSUPP;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
|
||||||
result = usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD));
|
|
||||||
}
|
}
|
||||||
|
// we got two results, let's prioritize the faulty one and USB over FPC.
|
||||||
return result;
|
if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb;
|
||||||
|
if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc;
|
||||||
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t len, bool ng) {
|
static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t len, bool ng) {
|
||||||
|
@ -107,7 +104,8 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketResponseNGPostamble *tx_post = (PacketResponseNGPostamble *)((uint8_t *)&txBufferNG + sizeof(PacketResponseNGPreamble) + len);
|
PacketResponseNGPostamble *tx_post = (PacketResponseNGPostamble *)((uint8_t *)&txBufferNG + sizeof(PacketResponseNGPreamble) + len);
|
||||||
if ((reply_via_fpc && reply_with_crc_on_fpc) || ((!reply_via_fpc) && reply_with_crc_on_usb)) {
|
// Note: if we send to both FPC & USB, we'll set CRC for both if any of them require CRC
|
||||||
|
if ((reply_via_fpc && reply_with_crc_on_fpc) || ((reply_via_usb) && reply_with_crc_on_usb)) {
|
||||||
uint8_t first, second;
|
uint8_t first, second;
|
||||||
compute_crc(CRC_14443_A, (uint8_t *)&txBufferNG, sizeof(PacketResponseNGPreamble) + len, &first, &second);
|
compute_crc(CRC_14443_A, (uint8_t *)&txBufferNG, sizeof(PacketResponseNGPreamble) + len, &first, &second);
|
||||||
tx_post->crc = (first << 8) + second;
|
tx_post->crc = (first << 8) + second;
|
||||||
|
@ -116,19 +114,24 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t
|
||||||
}
|
}
|
||||||
txBufferNGLen = sizeof(PacketResponseNGPreamble) + len + sizeof(PacketResponseNGPostamble);
|
txBufferNGLen = sizeof(PacketResponseNGPreamble) + len + sizeof(PacketResponseNGPostamble);
|
||||||
|
|
||||||
int result = PM3_EUNDEF;
|
int resultfpc = PM3_EUNDEF;
|
||||||
|
int resultusb = PM3_EUNDEF;
|
||||||
// Send frame and make sure all bytes are transmitted
|
// Send frame and make sure all bytes are transmitted
|
||||||
|
|
||||||
|
if (reply_via_usb) {
|
||||||
|
resultusb = usb_write((uint8_t *)&txBufferNG, txBufferNGLen);
|
||||||
|
}
|
||||||
if (reply_via_fpc) {
|
if (reply_via_fpc) {
|
||||||
#ifdef WITH_FPC_USART_HOST
|
#ifdef WITH_FPC_USART_HOST
|
||||||
result = usart_writebuffer_sync((uint8_t *)&txBufferNG, txBufferNGLen);
|
resultfpc = usart_writebuffer_sync((uint8_t *)&txBufferNG, txBufferNGLen);
|
||||||
#else
|
#else
|
||||||
return PM3_EDEVNOTSUPP;
|
return PM3_EDEVNOTSUPP;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
|
||||||
result = usb_write((uint8_t *)&txBufferNG, txBufferNGLen);
|
|
||||||
}
|
}
|
||||||
return result;
|
// we got two results, let's prioritize the faulty one and USB over FPC.
|
||||||
|
if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb;
|
||||||
|
if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc;
|
||||||
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len) {
|
int reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len) {
|
||||||
|
@ -150,7 +153,7 @@ int reply_mix(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d
|
||||||
return reply_ng_internal(cmd, status, cmddata, len + sizeof(arg), false);
|
return reply_ng_internal(cmd, status, cmddata, len + sizeof(arg), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *data, size_t len), bool fpc) {
|
static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *data, size_t len), bool usb, bool fpc) {
|
||||||
PacketCommandNGRaw rx_raw;
|
PacketCommandNGRaw rx_raw;
|
||||||
size_t bytes = read_ng((uint8_t *)&rx_raw.pre, sizeof(PacketCommandNGPreamble));
|
size_t bytes = read_ng((uint8_t *)&rx_raw.pre, sizeof(PacketCommandNGPreamble));
|
||||||
|
|
||||||
|
@ -202,6 +205,7 @@ static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *da
|
||||||
if ((first << 8) + second != rx->crc)
|
if ((first << 8) + second != rx->crc)
|
||||||
return PM3_EIO;
|
return PM3_EIO;
|
||||||
}
|
}
|
||||||
|
reply_via_usb = usb;
|
||||||
reply_via_fpc = fpc;
|
reply_via_fpc = fpc;
|
||||||
} else { // Old style command
|
} else { // Old style command
|
||||||
PacketCommandOLD rx_old;
|
PacketCommandOLD rx_old;
|
||||||
|
@ -210,6 +214,7 @@ static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *da
|
||||||
if (bytes != sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble))
|
if (bytes != sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble))
|
||||||
return PM3_EIO;
|
return PM3_EIO;
|
||||||
|
|
||||||
|
reply_via_usb = usb;
|
||||||
reply_via_fpc = fpc;
|
reply_via_fpc = fpc;
|
||||||
rx->ng = false;
|
rx->ng = false;
|
||||||
rx->magic = 0;
|
rx->magic = 0;
|
||||||
|
@ -228,12 +233,12 @@ int receive_ng(PacketCommandNG *rx) {
|
||||||
|
|
||||||
// Check if there is a packet available
|
// Check if there is a packet available
|
||||||
if (usb_poll_validate_length())
|
if (usb_poll_validate_length())
|
||||||
return receive_ng_internal(rx, usb_read_ng, false);
|
return receive_ng_internal(rx, usb_read_ng, true, false);
|
||||||
|
|
||||||
#ifdef WITH_FPC_USART_HOST
|
#ifdef WITH_FPC_USART_HOST
|
||||||
// Check if there is a FPC packet available
|
// Check if there is a FPC packet available
|
||||||
if (usart_rxdata_available() > 0)
|
if (usart_rxdata_available() > 0)
|
||||||
return receive_ng_internal(rx, usart_read_ng, true);
|
return receive_ng_internal(rx, usart_read_ng, false, true);
|
||||||
#endif
|
#endif
|
||||||
return PM3_ENODATA;
|
return PM3_ENODATA;
|
||||||
}
|
}
|
||||||
|
|
31
common/cmd.h
31
common/cmd.h
|
@ -47,8 +47,37 @@ int receive_ng(PacketCommandNG *rx);
|
||||||
// Flags to tell where to add CRC on sent replies
|
// Flags to tell where to add CRC on sent replies
|
||||||
extern bool reply_with_crc_on_usb;
|
extern bool reply_with_crc_on_usb;
|
||||||
extern bool reply_with_crc_on_fpc;
|
extern bool reply_with_crc_on_fpc;
|
||||||
// "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART
|
// "Session" flag, to tell via which interface next msgs should be sent: USB and/or FPC USART
|
||||||
extern bool reply_via_fpc;
|
extern bool reply_via_fpc;
|
||||||
|
extern bool reply_via_usb;
|
||||||
|
|
||||||
|
extern void Dbprintf(const char *fmt, ...);
|
||||||
|
#define Dbprintf_usb(...) {\
|
||||||
|
bool tmpfpc = reply_via_fpc;\
|
||||||
|
bool tmpusb = reply_via_usb;\
|
||||||
|
reply_via_fpc = false;\
|
||||||
|
reply_via_usb = true;\
|
||||||
|
Dbprintf(__VA_ARGS__);\
|
||||||
|
reply_via_fpc = tmpfpc;\
|
||||||
|
reply_via_usb = tmpusb;}
|
||||||
|
|
||||||
|
#define Dbprintf_fpc(...) {\
|
||||||
|
bool tmpfpc = reply_via_fpc;\
|
||||||
|
bool tmpusb = reply_via_usb;\
|
||||||
|
reply_via_fpc = true;\
|
||||||
|
reply_via_usb = false;\
|
||||||
|
Dbprintf(__VA_ARGS__);\
|
||||||
|
reply_via_fpc = tmpfpc;\
|
||||||
|
reply_via_usb = tmpusb;}
|
||||||
|
|
||||||
|
#define Dbprintf_all(...) {\
|
||||||
|
bool tmpfpc = reply_via_fpc;\
|
||||||
|
bool tmpusb = reply_via_usb;\
|
||||||
|
reply_via_fpc = true;\
|
||||||
|
reply_via_usb = true;\
|
||||||
|
Dbprintf(__VA_ARGS__);\
|
||||||
|
reply_via_fpc = tmpfpc;\
|
||||||
|
reply_via_usb = tmpusb;}
|
||||||
|
|
||||||
#endif // _PROXMARK_CMD_H_
|
#endif // _PROXMARK_CMD_H_
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// The main USART code, for serial communications over FPC connector
|
// The main USART code, for serial communications over FPC connector
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
#include "cmd.h"
|
||||||
#include "usart.h"
|
#include "usart.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "../armsrc/ticks.h" // startcountus
|
#include "../armsrc/ticks.h" // startcountus
|
||||||
|
@ -109,14 +110,6 @@ uint16_t usart_rxdata_available(void) {
|
||||||
return sizeof(us_rxfifo) - us_rxfifo_low + us_rxfifo_high;
|
return sizeof(us_rxfifo) - us_rxfifo_low + us_rxfifo_high;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern bool reply_via_fpc;
|
|
||||||
extern void Dbprintf(const char *fmt, ...);
|
|
||||||
#define Dbprintf_usb(...) {\
|
|
||||||
bool tmp = reply_via_fpc;\
|
|
||||||
reply_via_fpc = false;\
|
|
||||||
Dbprintf(__VA_ARGS__);\
|
|
||||||
reply_via_fpc = tmp;}
|
|
||||||
|
|
||||||
uint32_t usart_read_ng(uint8_t *data, size_t len) {
|
uint32_t usart_read_ng(uint8_t *data, size_t len) {
|
||||||
if (len == 0) return 0;
|
if (len == 0) return 0;
|
||||||
uint32_t packetSize, nbBytesRcv = 0;
|
uint32_t packetSize, nbBytesRcv = 0;
|
||||||
|
|
|
@ -141,6 +141,7 @@ typedef struct {
|
||||||
uint8_t version;
|
uint8_t version;
|
||||||
uint32_t baudrate;
|
uint32_t baudrate;
|
||||||
bool via_fpc : 1;
|
bool via_fpc : 1;
|
||||||
|
bool via_usb : 1;
|
||||||
// rdv4
|
// rdv4
|
||||||
bool compiled_with_flash : 1;
|
bool compiled_with_flash : 1;
|
||||||
bool compiled_with_smartcard : 1;
|
bool compiled_with_smartcard : 1;
|
||||||
|
@ -165,7 +166,7 @@ typedef struct {
|
||||||
bool hw_available_flash : 1;
|
bool hw_available_flash : 1;
|
||||||
bool hw_available_smartcard : 1;
|
bool hw_available_smartcard : 1;
|
||||||
} PACKED capabilities_t;
|
} PACKED capabilities_t;
|
||||||
#define CAPABILITIES_VERSION 1
|
#define CAPABILITIES_VERSION 2
|
||||||
extern capabilities_t pm3_capabilities;
|
extern capabilities_t pm3_capabilities;
|
||||||
|
|
||||||
// For CMD_T55XX_WRITE_BLOCK
|
// For CMD_T55XX_WRITE_BLOCK
|
||||||
|
@ -232,6 +233,7 @@ typedef struct {
|
||||||
#define CMD_DOWNLOAD_EML_BIGBUF 0x0110
|
#define CMD_DOWNLOAD_EML_BIGBUF 0x0110
|
||||||
#define CMD_DOWNLOADED_EML_BIGBUF 0x0111
|
#define CMD_DOWNLOADED_EML_BIGBUF 0x0111
|
||||||
#define CMD_CAPABILITIES 0x0112
|
#define CMD_CAPABILITIES 0x0112
|
||||||
|
#define CMD_QUIT_SESSION 0x0113
|
||||||
|
|
||||||
// RDV40, Flash memory operations
|
// RDV40, Flash memory operations
|
||||||
#define CMD_FLASHMEM_READ 0x0120
|
#define CMD_FLASHMEM_READ 0x0120
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue