FPC: got RX working, got client over usart somehow working..., see detailed commit msg

* using WITH_FPC:
  * activate basic usart
  * no double buffer for now, no interrupt
  * usart_dataavailable/usart_readbuffer/usart_writebuffer, to demo it:
    * pm3 client over USB, minicom over usart
    * analyse a d 414243
* using WITH_FPC_HOST:
  * it implies WITH_FPC as it's based on it
  * control pm3 with client over usart
  * EXPERIMENTAL! still some frame desync issues
  * you can connect both from usart & USB with two pm3 clients
    * actually you *have* to connect USB for the moment because
      it's used to send debug messages about buggy usart... See Dbprintf_usb below
  * "sessions": msgs are directed to the latest client to have sent a cmd
  * Dbprintf_usb macro to send msgs to USB client to help debugging usart...
  * We now have an option to run client at different speed as usart is 115200:
    client/proxmark3 /dev/ttyUSB0 -b 115200
  * Consequently, argc,argv handling is a bit revamped, it was so messy...
  * USB and flashing are still at 460800, don't try flashing over usart yet ^^
This commit is contained in:
Philippe Teuwen 2019-04-02 22:06:10 +02:00
commit 21be6d4400
15 changed files with 174 additions and 84 deletions

View file

@ -632,7 +632,6 @@ void ListenReaderField(int limit) {
void UsbPacketReceived(uint8_t *packet, int len) { void UsbPacketReceived(uint8_t *packet, int len) {
UsbCommand *c = (UsbCommand *)packet; UsbCommand *c = (UsbCommand *)packet;
//Dbprintf("received %d bytes, with command: 0x%04x and args: %d %d %d", len, c->cmd, c->arg[0], c->arg[1], c->arg[2]); //Dbprintf("received %d bytes, with command: 0x%04x and args: %d %d %d", len, c->cmd, c->arg[0], c->arg[1], c->arg[2]);
switch (c->cmd) { switch (c->cmd) {
@ -1106,8 +1105,12 @@ void UsbPacketReceived(uint8_t *packet, int len) {
char dest[USB_CMD_DATA_SIZE]={'\0'}; char dest[USB_CMD_DATA_SIZE]={'\0'};
sprintf(dest, usart_dataavailable() ? "DATA!\r\n" : "no data\r\n"); if (usart_dataavailable()) {
cmd_send(CMD_DEBUG_PRINT_STRING, strlen(dest), 0, 0, dest, strlen(dest)); Dbprintf("RX DATA!");
uint16_t len = usart_readbuffer((uint8_t*)dest);
dest[len] = '\0';
Dbprintf("RX: %d | %02X %02X %02X %02X %02X %02X %02X %02X ", len, dest[0], dest[1], dest[2], dest[3], dest[4], dest[5], dest[6], dest[7]);
}
static const char *welcome = "Proxmark3 Serial interface via FPC ready\r\n"; static const char *welcome = "Proxmark3 Serial interface via FPC ready\r\n";
usart_writebuffer((uint8_t *)welcome, strlen(welcome)); usart_writebuffer((uint8_t *)welcome, strlen(welcome));
@ -1126,9 +1129,6 @@ void UsbPacketReceived(uint8_t *packet, int len) {
//usb //usb
cmd_send(CMD_DEBUG_PRINT_STRING, strlen(dest), 0, 0, dest, strlen(dest)); cmd_send(CMD_DEBUG_PRINT_STRING, strlen(dest), 0, 0, dest, strlen(dest));
sprintf(dest, usart_dataavailable() ? "DATA!\r\n" : "no data\r\n");
cmd_send(CMD_DEBUG_PRINT_STRING, strlen(dest), 0, 0, dest, strlen(dest));
LED_A_OFF(); LED_A_OFF();
/* /*
uint8_t my_rx[sizeof(UsbCommand)]; uint8_t my_rx[sizeof(UsbCommand)];
@ -1560,16 +1560,17 @@ void __attribute__((noreturn)) AppMain(void) {
// Check if there is a usb packet available // Check if there is a usb packet available
if (usb_poll_validate_length()) { if (usb_poll_validate_length()) {
if (usb_read(rx, sizeof(rx))) if (usb_read(rx, sizeof(rx)))
#ifdef WITH_FPC_HOST
reply_via_fpc = 0;
#endif
UsbPacketReceived(rx, sizeof(rx));
}
#ifdef WITH_FPC_HOST
// Check if there is a FPC packet available
if (usart_readcommand(rx) > 0) {
reply_via_fpc = 1;
UsbPacketReceived(rx, sizeof(rx)); UsbPacketReceived(rx, sizeof(rx));
} }
#ifdef WITH_FPC
// Check is there is FPC package available
/*
usart_init();
if (usart_readbuffer(rx, sizeof(rx)) )
UsbPacketReceived(rx, sizeof(rx) );
*/
#endif #endif
// Press button for one second to enter a possible standalone mode // Press button for one second to enter a possible standalone mode

View file

@ -423,7 +423,7 @@ int CmdVersion(const char *Cmd) {
#else #else
PrintAndLogEx(NORMAL, "\n\e[34m [ Proxmark3 RFID instrument ]\e[0m\n"); PrintAndLogEx(NORMAL, "\n\e[34m [ Proxmark3 RFID instrument ]\e[0m\n");
#endif #endif
char s[50] = {0}; char s[60] = {0};
#if defined(WITH_FLASH) || defined(WITH_SMARTCARD) || defined(WITH_FPC) #if defined(WITH_FLASH) || defined(WITH_SMARTCARD) || defined(WITH_FPC)
strncat(s, "build for RDV40 with ", sizeof(s) - strlen(s) - 1); strncat(s, "build for RDV40 with ", sizeof(s) - strlen(s) - 1);
#endif #endif
@ -434,7 +434,11 @@ int CmdVersion(const char *Cmd) {
strncat(s, "smartcard; ", sizeof(s) - strlen(s) - 1); strncat(s, "smartcard; ", sizeof(s) - strlen(s) - 1);
#endif #endif
#ifdef WITH_FPC #ifdef WITH_FPC
#ifdef WITH_FPC_HOST
strncat(s, "fpc-host; ", sizeof(s) - strlen(s) - 1);
#else
strncat(s, "fpc; ", sizeof(s) - strlen(s) - 1); strncat(s, "fpc; ", sizeof(s) - strlen(s) - 1);
#endif
#endif #endif
PrintAndLogEx(NORMAL, "\n [ CLIENT ]"); PrintAndLogEx(NORMAL, "\n [ CLIENT ]");
PrintAndLogEx(NORMAL, " client: iceman %s \n", s); PrintAndLogEx(NORMAL, " client: iceman %s \n", s);

View file

@ -194,7 +194,7 @@ static void UsbCommandReceived(UsbCommand *c) {
/* /*
bool hookUpPM3() { bool hookUpPM3() {
bool ret = false; bool ret = false;
sp = uart_open( comport ); sp = uart_open( comport, speed );
if (sp == INVALID_SERIAL_PORT) { if (sp == INVALID_SERIAL_PORT) {
PrintAndLogEx(WARNING, "Reconnect failed, retrying... (reason: invalid serial port)\n"); PrintAndLogEx(WARNING, "Reconnect failed, retrying... (reason: invalid serial port)\n");
@ -298,17 +298,17 @@ __attribute__((force_align_arg_pointer))
return NULL; return NULL;
} }
bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode) { bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode, uint32_t speed) {
char *portname = (char *)port; char *portname = (char *)port;
if (!wait_for_port) { if (!wait_for_port) {
sp = uart_open(portname); sp = uart_open(portname, speed);
} else { } else {
PrintAndLogEx(SUCCESS, "Waiting for Proxmark to appear on " _YELLOW_("%s"), portname); PrintAndLogEx(SUCCESS, "Waiting for Proxmark to appear on " _YELLOW_("%s"), portname);
fflush(stdout); fflush(stdout);
int openCount = 0; int openCount = 0;
do { do {
sp = uart_open(portname); sp = uart_open(portname, speed);
msleep(500); msleep(500);
printf("."); printf(".");
fflush(stdout); fflush(stdout);

View file

@ -54,7 +54,8 @@ void *uart_receiver(void *targ);
void SendCommand(UsbCommand *c); void SendCommand(UsbCommand *c);
void clearCommandBuffer(); void clearCommandBuffer();
bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode); #define FLASHMODE_SPEED 460800
bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode, uint32_t speed);
void CloseProxmark(void); void CloseProxmark(void);
bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand *response, size_t ms_timeout, bool show_warning); bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand *response, size_t ms_timeout, bool show_warning);

View file

@ -321,7 +321,7 @@ static int enter_bootloader(char *serial_port_name) {
// Let time to OS to make the port disappear // Let time to OS to make the port disappear
msleep(1000); msleep(1000);
bool opened = OpenProxmark(serial_port_name, true, 60, true); bool opened = OpenProxmark(serial_port_name, true, 60, true, FLASHMODE_SPEED);
if (opened) { if (opened) {
fprintf(stdout, " " _GREEN_("Found") "\n"); fprintf(stdout, " " _GREEN_("Found") "\n");
return 0; return 0;

View file

@ -81,7 +81,7 @@ int main(int argc, char **argv) {
char *serial_port_name = argv[1]; char *serial_port_name = argv[1];
if (!OpenProxmark(serial_port_name, true, 60, true)) { if (!OpenProxmark(serial_port_name, true, 60, true, FLASHMODE_SPEED)) {
fprintf(stderr, "Could not find Proxmark on " _RED_("%s") ".\n\n", serial_port_name); fprintf(stderr, "Could not find Proxmark on " _RED_("%s") ".\n\n", serial_port_name);
return -1; return -1;
} else { } else {

View file

@ -259,6 +259,9 @@ int main(int argc, char *argv[]) {
bool addLuaExec = false; bool addLuaExec = false;
char *script_cmds_file = NULL; char *script_cmds_file = NULL;
char *script_cmd = NULL; char *script_cmd = NULL;
char *lastarg = NULL;
char *port = NULL;
uint32_t speed = 0;
/* initialize history */ /* initialize history */
using_history(); using_history();
@ -272,7 +275,9 @@ int main(int argc, char *argv[]) {
return 1; return 1;
} }
for (int i = 1; i < argc; i++) { uint32_t i = 1;
port = argv[i++];
for (i; i < argc; i++) {
// helptext // helptext
if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0) { if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0) {
@ -291,29 +296,58 @@ int main(int argc, char *argv[]) {
if (strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "-flush") == 0) { if (strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "-flush") == 0) {
SetFlushAfterWrite(true); SetFlushAfterWrite(true);
PrintAndLogEx(INFO, "Output will be flushed after every print.\n"); PrintAndLogEx(INFO, "Output will be flushed after every print.\n");
continue;
}
// set baudrate
if (strcmp(argv[i], "-b") == 0 || strcmp(argv[i], "-baud") == 0) {
uint32_t tmpspeed = strtoul(argv[i+1], NULL, 10);
if ((tmpspeed == ULONG_MAX) || (tmpspeed == 0)) {
PrintAndLogEx(WARNING, "ERROR: invalid baudrate: %s %s\n", argv[i], argv[i+1]);
return 1;
}
speed = tmpspeed;
i++;
continue;
} }
// wait for comport // wait for comport
if (strcmp(argv[i], "-w") == 0 || strcmp(argv[i], "-wait") == 0) { if (strcmp(argv[i], "-w") == 0 || strcmp(argv[i], "-wait") == 0) {
waitCOMPort = true; waitCOMPort = true;
continue;
} }
// execute pm3 command // execute pm3 command
if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "-command") == 0) { if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "-command") == 0) {
executeCommand = true; executeCommand = true;
continue;
} }
// execute lua script // execute lua script
if (strcmp(argv[i], "-l") == 0 || strcmp(argv[i], "-lua") == 0) { if (strcmp(argv[i], "-l") == 0 || strcmp(argv[i], "-lua") == 0) {
executeCommand = true; executeCommand = true;
addLuaExec = true; addLuaExec = true;
continue;
}
if (i < argc - 1) {
// We got an unknown parameter
PrintAndLogEx(WARNING, "WARNING: ignoring invalid parameter: %s\n", argv[i]);
}
if (i == argc - 1) {
// We got presumably a command or a filename
lastarg = argv[argc - 1];
} }
} }
if (speed == 0)
speed = 460800;
// If the user passed the filename of the 'script' to execute, get it from last parameter // If the user passed the filename of the 'script' to execute, get it from last parameter
if (argc > 2 && argv[argc - 1] && argv[argc - 1][0] != '-') { if (lastarg) {
if (executeCommand) { if (executeCommand) {
script_cmd = argv[argc - 1]; script_cmd = lastarg;
while (script_cmd[strlen(script_cmd) - 1] == ' ') while (script_cmd[strlen(script_cmd) - 1] == ' ')
script_cmd[strlen(script_cmd) - 1] = 0x00; script_cmd[strlen(script_cmd) - 1] = 0x00;
@ -336,7 +370,7 @@ int main(int argc, char *argv[]) {
PrintAndLogEx(SUCCESS, "execute command from commandline: %s\n", script_cmd); PrintAndLogEx(SUCCESS, "execute command from commandline: %s\n", script_cmd);
} }
} else { } else {
script_cmds_file = argv[argc - 1]; script_cmds_file = lastarg;
} }
} }
@ -358,7 +392,7 @@ int main(int argc, char *argv[]) {
set_my_executable_path(); set_my_executable_path();
// try to open USB connection to Proxmark // try to open USB connection to Proxmark
usb_present = OpenProxmark(argv[1], waitCOMPort, 20, false); usb_present = OpenProxmark(port, waitCOMPort, 20, false, speed);
#ifdef HAVE_GUI #ifdef HAVE_GUI

View file

@ -35,7 +35,7 @@ ifeq ($(PLATFORM),PM3RDV4)
PLTNAME = Proxmark3 rdv4 PLTNAME = Proxmark3 rdv4
else ifeq ($(PLATFORM),PM3RDV4FPC) else ifeq ($(PLATFORM),PM3RDV4FPC)
MCU = AT91SAM7S512 MCU = AT91SAM7S512
PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH -DWITH_FPC PLATFORM_DEFS = -DWITH_SMARTCARD -DWITH_FLASH -DWITH_FPC_HOST
PLTNAME = Proxmark3 rdv4 PLTNAME = Proxmark3 rdv4
else ifeq ($(PLATFORM),PM3EVO) else ifeq ($(PLATFORM),PM3EVO)
MCU = AT91SAM7S512 MCU = AT91SAM7S512
@ -56,6 +56,11 @@ else
$(error Invalid or empty PLATFORM: $(PLATFORM). Known platforms: $(KNOWN_PLATFORMS)) $(error Invalid or empty PLATFORM: $(PLATFORM). Known platforms: $(KNOWN_PLATFORMS))
endif endif
# Add flags dependencies
ifneq (,$(findstring WITH_FPC_,$(PLATFORM_DEFS)))
PLATFORM_DEFS += -DWITH_FPC
endif
export PLATFORM export PLATFORM
export PLTNAME export PLTNAME
export MCU export MCU

View file

@ -31,6 +31,17 @@
*/ */
#include "cmd.h" #include "cmd.h"
#ifdef WITH_FPC_HOST
// "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART
bool reply_via_fpc = 0;
extern void Dbprintf(const char *fmt, ...);
#define Dbprintf_usb(...) {\
reply_via_fpc = 0;\
Dbprintf(__VA_ARGS__);\
reply_via_fpc = 1;}
#endif
uint8_t cmd_send(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) { uint8_t cmd_send(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) {
UsbCommand txcmd; UsbCommand txcmd;
@ -53,11 +64,16 @@ uint8_t cmd_send(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void
uint32_t sendlen = 0; uint32_t sendlen = 0;
// Send frame and make sure all bytes are transmitted // Send frame and make sure all bytes are transmitted
sendlen = usb_write((uint8_t *)&txcmd, sizeof(UsbCommand));
#ifdef WITH_FPC #ifdef WITH_FPC_HOST
// usart_init(); if (reply_via_fpc) {
// usart_writebuffer( (uint8_t*)&txcmd, sizeof(UsbCommand) ); sendlen = usart_writebuffer( (uint8_t*)&txcmd, sizeof(UsbCommand) );
Dbprintf_usb("Sent %i bytes over usart", len);
} else {
sendlen = usb_write((uint8_t *)&txcmd, sizeof(UsbCommand));
}
#else
sendlen = usb_write((uint8_t *)&txcmd, sizeof(UsbCommand));
#endif #endif
return sendlen; return sendlen;

View file

@ -10,6 +10,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "usart.h" #include "usart.h"
#include "string.h" #include "string.h"
#include "apps.h" // for Dbprintf
#define AT91_BAUD_RATE 115200 #define AT91_BAUD_RATE 115200
@ -39,52 +40,58 @@ void usart_close(void) {
} }
*/ */
static uint8_t us_inbuf[sizeof(UsbCommand)];
static uint8_t us_outbuf[sizeof(UsbCommand)]; static uint8_t us_outbuf[sizeof(UsbCommand)];
/// Reads data from an USART peripheral // transfer from client to device
/// \param data Pointer to the buffer where the received data will be stored. inline int16_t usart_readbuffer(uint8_t *data) {
/// \param len Size of the data buffer (in bytes). uint32_t rcr = pUS1->US_RCR;
inline int16_t usart_readbuffer(uint8_t *data, size_t len) { if (rcr < sizeof(us_inbuf)) {
pUS1->US_PTCR = AT91C_PDC_RXTDIS;
// Check if the first PDC bank is free memcpy(data, us_inbuf, sizeof(us_inbuf) - rcr);
if (!(pUS1->US_RCR)) { // Reset DMA buffer
pUS1->US_RPR = (uint32_t)data; pUS1->US_RPR = (uint32_t)us_inbuf;
pUS1->US_RCR = len; pUS1->US_RCR = sizeof(us_inbuf);
pUS1->US_PTCR = AT91C_PDC_RXTEN;
pUS1->US_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTDIS; return sizeof(us_inbuf) - rcr;
return 2;
}
// Check if the second PDC bank is free
else if (!(pUS1->US_RNCR)) {
pUS1->US_RNPR = (uint32_t)data;
pUS1->US_RNCR = len;
pUS1->US_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTDIS;
return 1;
} else { } else {
return 0; return 0;
} }
} }
inline bool usart_dataavailable(void) { inline bool usart_dataavailable(void) {
return (pUS1->US_CSR & AT91C_US_RXRDY) != 0; return pUS1->US_RCR < sizeof(us_inbuf);
}
inline int16_t usart_readcommand(uint8_t *data) {
if (pUS1->US_RCR == 0)
return usart_readbuffer(data);
else
return 0;
}
inline bool usart_commandavailable(void) {
return pUS1->US_RCR == 0;
} }
// transfer from device to client // transfer from device to client
inline int16_t usart_writebuffer(uint8_t *data, size_t len) { inline int16_t usart_writebuffer(uint8_t *data, size_t len) {
if (pUS1->US_TCR == 0) {
if (pUS1->US_CSR & AT91C_US_ENDTX) {
memcpy(us_outbuf, data, len); memcpy(us_outbuf, data, len);
pUS1->US_TPR = (uint32_t)us_outbuf; pUS1->US_TPR = (uint32_t)us_outbuf;
pUS1->US_TCR = len; pUS1->US_TCR = len;
pUS1->US_PTCR = AT91C_PDC_TXTEN;
pUS1->US_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTDIS; while(!(pUS1->US_CSR & AT91C_US_ENDTX)) {};
while((pUS1->US_CSR & AT91C_US_TXEMPTY) ==0) {}; pUS1->US_PTCR = AT91C_PDC_TXTDIS;
return 2; return len;
} else { } else {
return 0; return 0;
} }
} }
void usart_init(void) { void usart_init(void) {
// For a nice detailed sample, interrupt driven but still relevant. // For a nice detailed sample, interrupt driven but still relevant.
@ -128,6 +135,17 @@ void usart_init(void) {
pUS1->US_FIDI = 0; pUS1->US_FIDI = 0;
pUS1->US_IF = 0; pUS1->US_IF = 0;
// Disable double buffers for now
pUS1->US_TNPR = (uint32_t)0;
pUS1->US_TNCR = 0;
pUS1->US_RNPR = (uint32_t)0;
pUS1->US_RNCR = 0;
// re-enable receiver / transmitter // re-enable receiver / transmitter
pUS1->US_CR = (AT91C_US_RXEN | AT91C_US_TXEN); pUS1->US_CR = (AT91C_US_RXEN | AT91C_US_TXEN);
// ready to receive
pUS1->US_RPR = (uint32_t)us_inbuf;
pUS1->US_RCR = sizeof(us_inbuf);
pUS1->US_PTCR = AT91C_PDC_RXTEN;
} }

View file

@ -7,7 +7,9 @@
void usart_init(void); void usart_init(void);
void usart_close(void); void usart_close(void);
int16_t usart_readbuffer(uint8_t *data, size_t len); int16_t usart_readbuffer(uint8_t *data);
int16_t usart_writebuffer(uint8_t *data, size_t len); int16_t usart_writebuffer(uint8_t *data, size_t len);
bool usart_dataavailable(void); bool usart_dataavailable(void);
int16_t usart_readcommand(uint8_t *data);
bool usart_commandavailable(void);
#endif #endif

View file

@ -34,6 +34,12 @@ typedef struct {
uint32_t asDwords[USB_CMD_DATA_SIZE / 4]; uint32_t asDwords[USB_CMD_DATA_SIZE / 4];
} d; } d;
} PACKED UsbCommand; } PACKED UsbCommand;
#ifdef WITH_FPC_HOST
// "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART
extern bool reply_via_fpc;
#endif
// A struct used to send sample-configs over USB // A struct used to send sample-configs over USB
typedef struct { typedef struct {
uint8_t decimation; uint8_t decimation;

View file

@ -71,7 +71,7 @@ typedef void *serial_port;
* *
* On errors, this method returns INVALID_SERIAL_PORT or CLAIMED_SERIAL_PORT. * On errors, this method returns INVALID_SERIAL_PORT or CLAIMED_SERIAL_PORT.
*/ */
serial_port uart_open(const char *pcPortName); serial_port uart_open(const char *pcPortName, uint32_t speed);
/* Closes the given port. /* Closes the given port.
*/ */

View file

@ -73,7 +73,7 @@ struct timeval timeout = {
.tv_usec = 30000 // 30 000 micro seconds .tv_usec = 30000 // 30 000 micro seconds
}; };
serial_port uart_open(const char *pcPortName) { serial_port uart_open(const char *pcPortName, uint32_t speed) {
serial_port_unix *sp = calloc(sizeof(serial_port_unix), sizeof(uint8_t)); serial_port_unix *sp = calloc(sizeof(serial_port_unix), sizeof(uint8_t));
if (sp == 0) return INVALID_SERIAL_PORT; if (sp == 0) return INVALID_SERIAL_PORT;
@ -194,14 +194,19 @@ serial_port uart_open(const char *pcPortName) {
// Flush all lingering data that may exist // Flush all lingering data that may exist
tcflush(sp->fd, TCIOFLUSH); tcflush(sp->fd, TCIOFLUSH);
// set speed, works for UBUNTU 14.04 if (!uart_set_speed(sp, speed)) {
bool success = uart_set_speed(sp, 460800); // trying some fallbacks automatically
if (success) { speed = 115200;
printf("[=] UART Setting serial baudrate 460800\n"); if (!uart_set_speed(sp, speed)) {
} else { speed = 9600;
uart_set_speed(sp, 115200); if (!uart_set_speed(sp, speed)) {
printf("[=] UART Setting serial baudrate 115200\n"); uart_close(sp);
printf("[!] UART error while setting baudrate\n");
return INVALID_SERIAL_PORT;
} }
}
}
printf("[=] UART Setting serial baudrate %i\n", speed);
return sp; return sp;
} }

View file

@ -48,7 +48,7 @@ typedef struct {
COMMTIMEOUTS ct; // Serial port time-out configuration COMMTIMEOUTS ct; // Serial port time-out configuration
} serial_port_windows; } serial_port_windows;
serial_port uart_open(const char *pcPortName) { serial_port uart_open(const char *pcPortName, uint32_t speed) {
char acPortName[255]; char acPortName[255];
serial_port_windows *sp = calloc(sizeof(serial_port_windows), sizeof(uint8_t)); serial_port_windows *sp = calloc(sizeof(serial_port_windows), sizeof(uint8_t));
@ -87,6 +87,7 @@ serial_port uart_open(const char *pcPortName) {
// all zero's configure: no timeout for read/write used. // all zero's configure: no timeout for read/write used.
// took settings from libnfc/buses/uart.c // took settings from libnfc/buses/uart.c
#ifdef WITH_FPC #ifdef WITH_FPC
// Still relevant?
sp->ct.ReadIntervalTimeout = 1000; sp->ct.ReadIntervalTimeout = 1000;
sp->ct.ReadTotalTimeoutMultiplier = 0; sp->ct.ReadTotalTimeoutMultiplier = 0;
sp->ct.ReadTotalTimeoutConstant = 1500; sp->ct.ReadTotalTimeoutConstant = 1500;
@ -108,22 +109,19 @@ serial_port uart_open(const char *pcPortName) {
PurgeComm(sp->hPort, PURGE_RXABORT | PURGE_RXCLEAR); PurgeComm(sp->hPort, PURGE_RXABORT | PURGE_RXCLEAR);
#ifdef WITH_FPC if (!uart_set_speed(sp, speed)) {
if (uart_set_speed(sp, 115200)) { // trying some fallbacks automatically
printf("[=] UART Setting serial baudrate 115200 [FPC enabled]\n"); speed = 115200;
} else { if (!uart_set_speed(sp, speed)) {
uart_set_speed(sp, 9600); speed = 9600;
printf("[=] UART Setting serial baudrate 9600 [FPC enabled]\n"); if (!uart_set_speed(sp, speed)) {
uart_close(sp);
printf("[!] UART error while setting baudrate\n");
return INVALID_SERIAL_PORT;
} }
#else
bool success = uart_set_speed(sp, 460800);
if (success) {
printf("[=] UART Setting serial baudrate 460800\n");
} else {
uart_set_speed(sp, 115200);
printf("[=] UART Setting serial baudrate 115200\n");
} }
#endif }
printf("[=] UART Setting serial baudrate %i\n", speed);
return sp; return sp;
} }