mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
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:
parent
4c007beefd
commit
21be6d4400
15 changed files with 174 additions and 84 deletions
|
@ -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));
|
UsbPacketReceived(rx, sizeof(rx));
|
||||||
}
|
}
|
||||||
#ifdef WITH_FPC
|
#ifdef WITH_FPC_HOST
|
||||||
// Check is there is FPC package available
|
// Check if there is a FPC packet available
|
||||||
/*
|
if (usart_readcommand(rx) > 0) {
|
||||||
usart_init();
|
reply_via_fpc = 1;
|
||||||
if (usart_readbuffer(rx, sizeof(rx)) )
|
|
||||||
UsbPacketReceived(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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
24
common/cmd.c
24
common/cmd.c
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue