diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 54f9d40b5..fc777cbdf 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -429,6 +429,16 @@ void SendStatus(void) { reply_old(CMD_ACK, 1, 0, 0, 0, 0); } +void SendCapabilities(void) { + capabilities_t capabilities; + capabilities.via_fpc = reply_via_fpc; + if (reply_via_fpc) + capabilities.baudrate = USART_BAUD_RATE; + else + capabilities.baudrate = 0; // no real baudrate for USB-CDC + reply_ng(CMD_CAPABILITIES, PM3_SUCCESS, (uint8_t *)&capabilities, sizeof(capabilities)); +} + // Show some leds in a pattern to identify StandAlone mod is running void StandAloneMode(void) { @@ -1439,6 +1449,8 @@ static void PacketReceived(PacketCommandNG *packet) { case CMD_STATUS: SendStatus(); break; + case CMD_CAPABILITIES: + SendCapabilities(); case CMD_PING: if (packet->ng) { reply_ng(CMD_PING, PM3_SUCCESS, packet->data.asBytes, packet->length); diff --git a/client/comms.c b/client/comms.c index 7762a532b..b4f075d05 100644 --- a/client/comms.c +++ b/client/comms.c @@ -20,6 +20,7 @@ static char *serial_port_name = NULL; static bool offline; communication_arg_t conn; +capabilities_t pm3_capabilities; static pthread_t USB_communication_thread; //static pthread_t FPC_communication_thread; @@ -567,22 +568,40 @@ bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode, int TestProxmark(void) { clearCommandBuffer(); PacketResponseNG resp; - SendCommandOLD(CMD_PING, 0, 0, 0, NULL, 0); + uint16_t len = 32; + uint8_t data[len]; + for (uint16_t i = 0; i < len; i++) + data[i] = i & 0xFF; + SendCommandNG(CMD_PING, data, len); #ifdef USART_SLOW_LINK // 10s timeout for slow FPC, e.g. over BT // as this is the very first command sent to the pm3 // that initiates the BT connection - if (WaitForResponseTimeout(CMD_ACK, &resp, 10000)) { + if (WaitForResponseTimeoutW(CMD_PING, &resp, 10000, false)) { #else - if (WaitForResponseTimeout(CMD_ACK, &resp, 1000)) { + if (WaitForResponseTimeoutW(CMD_PING, &resp, 1000, false)) { #endif - conn.send_via_fpc = resp.oldarg[0] == 1; - PrintAndLogEx(INFO, "Communicating with PM3 over %s.", conn.send_via_fpc ? _YELLOW_("FPC") : _YELLOW_("USB-CDC")); - if (conn.send_via_fpc) - PrintAndLogEx(INFO, "UART Serial baudrate: " _YELLOW_("%u") "\n", conn.uart_speed); - return 1; + + bool error = false; + if (len) + error = memcmp(data, resp.data.asBytes, len) != 0; + if (error) + return PM3_EIO; + + SendCommandNG(CMD_CAPABILITIES, NULL, 0); + if (WaitForResponseTimeoutW(CMD_PING, &resp, 1000, false)) { + memcpy(&pm3_capabilities, resp.data.asBytes, resp.length); + conn.send_via_fpc = pm3_capabilities.via_fpc; + conn.uart_speed = pm3_capabilities.baudrate; + PrintAndLogEx(INFO, "Communicating with PM3 over %s", conn.send_via_fpc ? _YELLOW_("FPC UART") : _YELLOW_("USB-CDC")); + if (conn.send_via_fpc) + PrintAndLogEx(INFO, "UART Serial baudrate: " _YELLOW_("%u") "\n", conn.uart_speed); + return PM3_SUCCESS; + } else { + return PM3_ETIMEOUT; + } } else { - return 0; + return PM3_ETIMEOUT; } } diff --git a/client/comms.h b/client/comms.h index 7952ce18c..516d39b1a 100644 --- a/client/comms.h +++ b/client/comms.h @@ -47,7 +47,7 @@ typedef struct { bool send_with_crc_on_fpc; // "Session" flag, to tell via which interface next msgs are sent: USB or FPC USART bool send_via_fpc; - // To memorise baudrate, we don't want to call get_speed systematically + // To memorise baudrate uint32_t uart_speed; } communication_arg_t; diff --git a/client/proxmark3.c b/client/proxmark3.c index fab2b7022..1c3693ea2 100644 --- a/client/proxmark3.c +++ b/client/proxmark3.c @@ -468,8 +468,11 @@ int main(int argc, char *argv[]) { if (port != NULL) pm3_present = OpenProxmark(port, waitCOMPort, 20, false, speed); - if (pm3_present && (TestProxmark() == 0)) + if (pm3_present && (TestProxmark() != PM3_SUCCESS)) { + PrintAndLogEx(ERR, _RED_("ERROR:") "cannot communicate with the Proxmark\n"); + CloseProxmark(); pm3_present = false; + } if (!pm3_present) PrintAndLogEx(INFO, "Running in " _YELLOW_("OFFLINE") "mode. Check \"%s -h\" if it's not what you want.\n", exec_name); diff --git a/include/usb_cmd.h b/include/usb_cmd.h index 0887655c4..75ceb8515 100644 --- a/include/usb_cmd.h +++ b/include/usb_cmd.h @@ -136,6 +136,14 @@ typedef struct { uint16_t read_gap; } t55xx_config; +// TODO add more fields to report all hw & sw capabilities of pm3 +typedef struct { + uint32_t baudrate; + bool via_fpc; +} PACKED capabilities_t; + +extern capabilities_t pm3_capabilities; + // For the bootloader #define CMD_DEVICE_INFO 0x0000 #define CMD_SETUP_WRITE 0x0001 @@ -156,12 +164,9 @@ typedef struct { #define CMD_VERSION 0x0107 #define CMD_STATUS 0x0108 #define CMD_PING 0x0109 - #define CMD_DOWNLOAD_EML_BIGBUF 0x0110 #define CMD_DOWNLOADED_EML_BIGBUF 0x0111 - - - +#define CMD_CAPABILITIES 0x0112 // RDV40, Flash memory operations #define CMD_FLASHMEM_READ 0x0120