mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-05 20:51:18 -07:00
USB comms: part 2 towards @micolous PR#463 (#595)
* change variable 'offline' from global to static * change variable 'FlushAfterWrite' from global to static * remove unused global variable 'current_command' * WaitForResponseTimeoutW(CMD_UNKNOWN, ...) waits for any command * #include "printf.h" or <stdio.h> in iso15693tools.c to define sprintf() * and some minor changes/comments
This commit is contained in:
parent
e069547c27
commit
61aaee35cc
13 changed files with 61 additions and 35 deletions
|
@ -327,7 +327,7 @@ int CmdLFSetConfig(const char *Cmd)
|
|||
}
|
||||
|
||||
bool lf_read(bool silent, uint32_t samples) {
|
||||
if (offline) return false;
|
||||
if (IsOffline()) return false;
|
||||
UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {silent,samples,0}};
|
||||
clearCommandBuffer();
|
||||
//And ship it to device
|
||||
|
@ -870,7 +870,7 @@ int CmdVchDemod(const char *Cmd)
|
|||
int CheckChipType(char cmdp) {
|
||||
uint32_t wordData = 0;
|
||||
|
||||
if (offline || cmdp == '1') return 0;
|
||||
if (IsOffline() || cmdp == '1') return 0;
|
||||
|
||||
save_restoreGB(GRAPH_SAVE);
|
||||
save_restoreDB(GRAPH_SAVE);
|
||||
|
@ -915,7 +915,7 @@ int CmdLFfind(const char *Cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!offline && (cmdp != '1')) {
|
||||
if (!IsOffline() && (cmdp != '1')) {
|
||||
lf_read(true, 30000);
|
||||
} else if (GraphTraceLen < minLength) {
|
||||
PrintAndLog("Data in Graphbuffer was too small.");
|
||||
|
@ -931,7 +931,7 @@ int CmdLFfind(const char *Cmd)
|
|||
// only run if graphbuffer is just noise as it should be for hitag/cotag
|
||||
if (graphJustNoise(GraphBuffer, testLen)) {
|
||||
// only run these tests if we are in online mode
|
||||
if (!offline && (cmdp != '1')) {
|
||||
if (!IsOffline() && (cmdp != '1')) {
|
||||
// test for em4x05 in reader talk first mode.
|
||||
if (EM4x05Block0Test(&wordData)) {
|
||||
PrintAndLog("\nValid EM4x05/EM4x69 Chip Found\nUse lf em 4x05readword/dump commands to read\n");
|
||||
|
|
|
@ -29,8 +29,6 @@
|
|||
#include "cmdscript.h"
|
||||
|
||||
|
||||
unsigned int current_command = CMD_UNKNOWN;
|
||||
|
||||
static int CmdHelp(const char *Cmd);
|
||||
static int CmdQuit(const char *Cmd);
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ void CmdsHelp(const command_t Commands[])
|
|||
int i = 0;
|
||||
while (Commands[i].Name)
|
||||
{
|
||||
if (!offline || Commands[i].Offline)
|
||||
if (!IsOffline() || Commands[i].Offline)
|
||||
PrintAndLog("%-16s %s", Commands[i].Name, Commands[i].Help);
|
||||
++i;
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
serial_port sp;
|
||||
|
||||
// If TRUE, then there is no active connection to the PM3, and we will drop commands sent.
|
||||
bool offline;
|
||||
static bool offline;
|
||||
|
||||
// Transmit buffer.
|
||||
// TODO: Use locks and execute this on the main thread, rather than the receiver
|
||||
|
@ -47,10 +47,20 @@ static int cmd_tail = 0;
|
|||
// to lock cmdBuffer operations from different threads
|
||||
static pthread_mutex_t cmdBufferMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
// These wrappers are required because it is not possible to access a static
|
||||
// global variable outside of the context of a single file.
|
||||
|
||||
void SetOffline(bool new_offline) {
|
||||
offline = new_offline;
|
||||
}
|
||||
|
||||
bool IsOffline() {
|
||||
return offline;
|
||||
}
|
||||
|
||||
void SendCommand(UsbCommand *c) {
|
||||
#if 0
|
||||
printf("Sending %d bytes\n", sizeof(UsbCommand));
|
||||
#ifdef COMMS_DEBUG
|
||||
printf("Sending %04x cmd\n", c->cmd);
|
||||
#endif
|
||||
|
||||
if (offline) {
|
||||
|
@ -153,6 +163,8 @@ void UsbCommandReceived(UsbCommand *UC)
|
|||
} break;
|
||||
|
||||
case CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K: {
|
||||
// FIXME: This does unsanitised copies into memory when we don't know
|
||||
// the size of the buffer.
|
||||
memcpy(sample_buf+(UC->arg[0]),UC->d.asBytes,UC->arg[1]);
|
||||
return;
|
||||
} break;
|
||||
|
@ -205,15 +217,20 @@ __attribute__((force_align_arg_pointer))
|
|||
* Waits for a certain response type. This method waits for a maximum of
|
||||
* ms_timeout milliseconds for a specified response command.
|
||||
*@brief WaitForResponseTimeout
|
||||
* @param cmd command to wait for
|
||||
* @param cmd command to wait for, or CMD_UNKNOWN to take any command.
|
||||
* @param response struct to copy received command into.
|
||||
* @param ms_timeout
|
||||
* @param show_warning
|
||||
* @return true if command was returned, otherwise false
|
||||
*/
|
||||
bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeout, bool show_warning) {
|
||||
|
||||
UsbCommand resp;
|
||||
|
||||
#ifdef COMMS_DEBUG
|
||||
printf("Waiting for %04x cmd\n", cmd);
|
||||
#endif
|
||||
|
||||
if (response == NULL) {
|
||||
response = &resp;
|
||||
}
|
||||
|
@ -223,7 +240,7 @@ bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeo
|
|||
// Wait until the command is received
|
||||
while (true) {
|
||||
while(getCommand(response)) {
|
||||
if(response->cmd == cmd){
|
||||
if (cmd == CMD_UNKNOWN || response->cmd == cmd) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -233,6 +250,7 @@ bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeo
|
|||
}
|
||||
|
||||
if (msclock() - start_time > 2000 && show_warning) {
|
||||
// 2 seconds elapsed (but this doesn't mean the timeout was exceeded)
|
||||
PrintAndLog("Waiting for a response from the proxmark...");
|
||||
PrintAndLog("You can cancel this operation by pressing the pm3 button");
|
||||
show_warning = false;
|
||||
|
|
|
@ -30,6 +30,11 @@ typedef struct {
|
|||
pthread_mutex_t recv_lock;
|
||||
} receiver_arg;
|
||||
|
||||
|
||||
// Wrappers required as static variables can only be used in one file.
|
||||
void SetOffline(bool new_offline);
|
||||
bool IsOffline();
|
||||
|
||||
void SendCommand(UsbCommand *c);
|
||||
|
||||
void *uart_receiver(void *targ);
|
||||
|
@ -40,6 +45,5 @@ bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeou
|
|||
bool WaitForResponse(uint32_t cmd, UsbCommand* response);
|
||||
|
||||
extern serial_port sp;
|
||||
extern bool offline;
|
||||
|
||||
#endif // COMMS_H_
|
||||
|
|
|
@ -27,9 +27,6 @@ void ReceiveCommand(UsbCommand* rxcmd);
|
|||
|
||||
serial_port sp;
|
||||
|
||||
// FIXME: what the fuckity fuck
|
||||
unsigned int current_command = CMD_UNKNOWN;
|
||||
|
||||
#define FLASH_START 0x100000
|
||||
#define FLASH_SIZE (256*1024)
|
||||
#define FLASH_END (FLASH_START + FLASH_SIZE)
|
||||
|
@ -52,13 +49,14 @@ void CloseProxmark(const char *serial_port_name) {
|
|||
unlink(serial_port_name);
|
||||
}
|
||||
|
||||
int OpenProxmark(size_t i, const char *serial_port_name) {
|
||||
bool OpenProxmark(size_t i, const char *serial_port_name) {
|
||||
sp = uart_open(serial_port_name);
|
||||
if (sp == INVALID_SERIAL_PORT || sp == CLAIMED_SERIAL_PORT) {
|
||||
//poll once a second
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
return 1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Turn PHDRs into flasher segments, checking for PHDR sanity and merging adjacent
|
||||
|
@ -355,6 +353,7 @@ static int enter_bootloader(char *serial_port_name)
|
|||
SendCommand(&c);
|
||||
fprintf(stderr,"Press and hold down button NOW if your bootloader requires it.\n");
|
||||
}
|
||||
|
||||
msleep(100);
|
||||
CloseProxmark(serial_port_name);
|
||||
|
||||
|
@ -363,6 +362,7 @@ static int enter_bootloader(char *serial_port_name)
|
|||
sleep(1);
|
||||
fprintf(stderr, ".");
|
||||
} while (!OpenProxmark(0, serial_port_name));
|
||||
|
||||
fprintf(stderr," Found.\n");
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -32,7 +32,7 @@ int flash_write(flash_file_t *ctx);
|
|||
void flash_free(flash_file_t *ctx);
|
||||
int flash_stop_flashing(void);
|
||||
void CloseProxmark(const char *serial_port_name);
|
||||
int OpenProxmark(size_t i, const char *serial_port_name);
|
||||
bool OpenProxmark(size_t i, const char *serial_port_name);
|
||||
|
||||
extern serial_port sp;
|
||||
#endif
|
||||
|
|
|
@ -31,7 +31,6 @@ usb_dev_handle *devh = NULL;
|
|||
static unsigned int claimed_iface = 0;
|
||||
unsigned char return_on_error = 0;
|
||||
unsigned char error_occured = 0;
|
||||
extern unsigned int current_command;
|
||||
|
||||
void SendCommand(UsbCommand *c)
|
||||
{
|
||||
|
@ -40,7 +39,6 @@ void SendCommand(UsbCommand *c)
|
|||
#if 0
|
||||
printf("Sending %d bytes\n", sizeof(UsbCommand));
|
||||
#endif
|
||||
current_command = c->cmd;
|
||||
ret = usb_bulk_write(devh, 0x01, (char*)c, sizeof(UsbCommand), 1000);
|
||||
if (ret<0) {
|
||||
error_occured = 1;
|
||||
|
|
|
@ -41,14 +41,17 @@ main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) {
|
|||
pthread_t reader_thread;
|
||||
bool execCommand = (script_cmd != NULL);
|
||||
bool stdinOnPipe = !isatty(STDIN_FILENO);
|
||||
|
||||
|
||||
memset(&conn, 0, sizeof(receiver_arg));
|
||||
|
||||
if (usb_present) {
|
||||
conn.run = true;
|
||||
SetOffline(false);
|
||||
pthread_create(&reader_thread, NULL, &uart_receiver, &conn);
|
||||
// cache Version information now:
|
||||
CmdVersion(NULL);
|
||||
} else {
|
||||
SetOffline(true);
|
||||
}
|
||||
|
||||
// file with script
|
||||
|
@ -64,7 +67,7 @@ main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) {
|
|||
|
||||
read_history(".history");
|
||||
|
||||
while (1) {
|
||||
while (1) {
|
||||
// If there is a script file
|
||||
if (script_file)
|
||||
{
|
||||
|
@ -235,7 +238,7 @@ int main(int argc, char* argv[]) {
|
|||
|
||||
if(strcmp(argv[i],"-f") == 0 || strcmp(argv[i],"-flush") == 0){
|
||||
printf("Output will be flushed after every print.\n");
|
||||
flushAfterWrite = 1;
|
||||
SetFlushAfterWrite(true);
|
||||
}
|
||||
|
||||
if(strcmp(argv[i],"-w") == 0 || strcmp(argv[i],"-wait") == 0){
|
||||
|
@ -311,14 +314,11 @@ int main(int argc, char* argv[]) {
|
|||
if (sp == INVALID_SERIAL_PORT) {
|
||||
printf("ERROR: invalid serial port\n");
|
||||
usb_present = false;
|
||||
offline = 1;
|
||||
} else if (sp == CLAIMED_SERIAL_PORT) {
|
||||
printf("ERROR: serial port is claimed by another process\n");
|
||||
usb_present = false;
|
||||
offline = 1;
|
||||
} else {
|
||||
usb_present = true;
|
||||
offline = 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_GUI
|
||||
|
|
10
client/ui.c
10
client/ui.c
|
@ -22,8 +22,7 @@
|
|||
|
||||
double CursorScaleFactor = 1;
|
||||
int PlotGridX=0, PlotGridY=0, PlotGridXdefault= 64, PlotGridYdefault= 64, CursorCPos= 0, CursorDPos= 0;
|
||||
int offline;
|
||||
int flushAfterWrite = 0; //buzzy
|
||||
bool flushAfterWrite = false; //buzzy
|
||||
int GridOffset = 0;
|
||||
bool GridLocked = false;
|
||||
bool showDemod = true;
|
||||
|
@ -93,7 +92,7 @@ void PrintAndLog(char *fmt, ...)
|
|||
}
|
||||
va_end(argptr2);
|
||||
|
||||
if (flushAfterWrite == 1) //buzzy
|
||||
if (flushAfterWrite) //buzzy
|
||||
{
|
||||
fflush(NULL);
|
||||
}
|
||||
|
@ -106,3 +105,8 @@ void SetLogFilename(char *fn)
|
|||
{
|
||||
logfilename = fn;
|
||||
}
|
||||
|
||||
void SetFlushAfterWrite(bool flush_after_write) {
|
||||
flushAfterWrite = flush_after_write;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,10 +20,10 @@ void ShowGraphWindow(void);
|
|||
void RepaintGraphWindow(void);
|
||||
void PrintAndLog(char *fmt, ...);
|
||||
void SetLogFilename(char *fn);
|
||||
void SetFlushAfterWrite(bool flush_after_write);
|
||||
|
||||
extern double CursorScaleFactor;
|
||||
extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault, CursorCPos, CursorDPos, GridOffset;
|
||||
extern int flushAfterWrite; //buzzy
|
||||
extern bool GridLocked;
|
||||
extern bool showDemod;
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ GZIP=gzip
|
|||
|
||||
OBJDIR = obj
|
||||
|
||||
INCLUDE = -I../include -I../common
|
||||
INCLUDE = -I../include -I../common -I.
|
||||
|
||||
TAR=tar
|
||||
TARFLAGS = -C .. -rvf
|
||||
|
|
|
@ -11,6 +11,12 @@
|
|||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
//#include "iso15693tools.h"
|
||||
#ifdef ON_DEVICE
|
||||
#include "printf.h"
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
|
||||
#define POLY 0x8408
|
||||
|
||||
|
@ -51,8 +57,6 @@ int Iso15693AddCrc(uint8_t *req, int n) {
|
|||
}
|
||||
|
||||
|
||||
int sprintf(char *str, const char *format, ...);
|
||||
|
||||
// returns a string representation of the UID
|
||||
// UID is transmitted and stored LSB first, displayed MSB first
|
||||
// target char* buffer, where to put the UID, if NULL a static buffer is returned
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue