]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
USB comms: part 4 towards @micolous PR #463
authorpwpiwi <pwpiwi@users.noreply.github.com>
Sun, 3 Jun 2018 12:25:20 +0000 (14:25 +0200)
committerGitHub <noreply@github.com>
Sun, 3 Jun 2018 12:25:20 +0000 (14:25 +0200)
* make uart_communication(), storeCommand() and getCommand() static in comms.c
* move receiver thread creation and respective mutexes to comms.c
* add mutex and signal for tx buffer
* use comms.c for flasher as well
* remove comm functions from client/proxmark3.h
* this completes isolating all USB communication related functions in comms.c
* don't assume a port to be defined by a name. Change parameter in OpenProxmark() to void*
* comms.c: set sp and serial_port_name to NULL when offline

50 files changed:
client/Makefile
client/cmddata.c
client/cmdhf.c
client/cmdhf14a.c
client/cmdhf14b.c
client/cmdhf14b.h
client/cmdhf15.c
client/cmdhf15.h
client/cmdhfepa.c
client/cmdhficlass.c
client/cmdhflegic.c
client/cmdhfmf.c
client/cmdhfmfhard.c
client/cmdhfmfu.c
client/cmdhftopaz.c
client/cmdhw.c
client/cmdlf.c
client/cmdlfawid.c
client/cmdlfcotag.c
client/cmdlfem4x.c
client/cmdlffdx.c
client/cmdlfhid.c
client/cmdlfhitag.c
client/cmdlfindala.c
client/cmdlfio.c
client/cmdlfjablotron.c
client/cmdlfnexwatch.c
client/cmdlfnoralsy.c
client/cmdlfpac.c
client/cmdlfpcf7931.c
client/cmdlfpcf7931.h
client/cmdlfpresco.c
client/cmdlfpyramid.c
client/cmdlfsecurakey.c
client/cmdlft55xx.c
client/cmdlft55xx.h
client/cmdlfti.c
client/cmdlfviking.c
client/cmdlfvisa2000.c
client/cmdmain.c
client/cmdmain.h
client/comms.c
client/comms.h
client/flash.c
client/flash.h
client/flasher.c
client/mifarehost.c
client/proxmark3.c
client/proxmark3.h
client/scripting.c

index d4ac33b296658c037935f4c265786946ca8b601d..917dc767f8ee062ca487cc17b55919f34ec07229 100644 (file)
@@ -82,7 +82,9 @@ POSTCOMPILE = $(MV) -f $(OBJDIR)/$*.Td $(OBJDIR)/$*.d
 CORESRCS =     uart_posix.c \
                        uart_win32.c \
                        util.c \
 CORESRCS =     uart_posix.c \
                        uart_win32.c \
                        util.c \
-                       util_posix.c
+                       util_posix.c \
+                       ui.c \
+                       comms.c
 
 CMDSRCS =      crapto1/crapto1.c\
                        crapto1/crypto1.c\
 
 CMDSRCS =      crapto1/crapto1.c\
                        crapto1/crypto1.c\
@@ -106,7 +108,6 @@ CMDSRCS =   crapto1/crapto1.c\
                        iso14443crc.c \
                        iso15693tools.c \
                        graph.c \
                        iso14443crc.c \
                        iso15693tools.c \
                        graph.c \
-                       ui.c \
                        cmddata.c \
                        lfdemod.c \
                        emv/crypto_polarssl.c\
                        cmddata.c \
                        lfdemod.c \
                        emv/crypto_polarssl.c\
@@ -169,8 +170,7 @@ CMDSRCS =   crapto1/crapto1.c\
                        cmdscript.c\
                        pm3_binlib.c\
                        pm3_bitlib.c\
                        cmdscript.c\
                        pm3_binlib.c\
                        pm3_bitlib.c\
-                       protocols.c\
-                       comms.c
+                       protocols.c
 
 cpu_arch = $(shell uname -m)
 ifneq ($(findstring 86, $(cpu_arch)), )
 
 cpu_arch = $(shell uname -m)
 ifneq ($(findstring 86, $(cpu_arch)), )
index 471665b75cc3cfa1edb7431ccdabf6802b664426..c4f0e8a353bcb3b93c3b02133bb06319b27268f3 100644 (file)
@@ -8,14 +8,15 @@
 // Data and Graph commands
 //-----------------------------------------------------------------------------
 
 // Data and Graph commands
 //-----------------------------------------------------------------------------
 
+#include "cmddata.h"
+
 #include <stdio.h>    // also included in util.h
 #include <string.h>   // also included in util.h
 #include <inttypes.h>
 #include <limits.h>   // for CmdNorm INT_MIN && INT_MAX
 #include <stdio.h>    // also included in util.h
 #include <string.h>   // also included in util.h
 #include <inttypes.h>
 #include <limits.h>   // for CmdNorm INT_MIN && INT_MAX
-#include "cmddata.h"
 #include "util.h"
 #include "cmdmain.h"
 #include "util.h"
 #include "cmdmain.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"       // for show graph controls
 #include "graph.h"    // for graph data
 #include "cmdparser.h"// already included in cmdmain.h
 #include "ui.h"       // for show graph controls
 #include "graph.h"    // for graph data
 #include "cmdparser.h"// already included in cmdmain.h
index 4a672255278a74d70062795c64dbc774d9af52d2..17c3120987e7667a52c21c21194596664f40be18 100644 (file)
@@ -9,17 +9,18 @@
 // High frequency commands
 //-----------------------------------------------------------------------------
 
 // High frequency commands
 //-----------------------------------------------------------------------------
 
+#include "cmdhf.h"
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "util.h"
 #include "ui.h"
 #include "iso14443crc.h"
 #include "parity.h"
 #include "cmdmain.h"
 #include "cmdparser.h"
 #include "util.h"
 #include "ui.h"
 #include "iso14443crc.h"
 #include "parity.h"
 #include "cmdmain.h"
 #include "cmdparser.h"
-#include "cmdhf.h"
 #include "cmdhf14a.h"
 #include "cmdhf14b.h"
 #include "cmdhf15.h"
 #include "cmdhf14a.h"
 #include "cmdhf14b.h"
 #include "cmdhf15.h"
index 4684ae290cca2989142c4112cabd516ed2b3dafb..859dec2f6bfd6447a279c7600784db9251cc504b 100644 (file)
@@ -20,7 +20,7 @@
 #include "util.h"
 #include "util_posix.h"
 #include "iso14443crc.h"
 #include "util.h"
 #include "util_posix.h"
 #include "iso14443crc.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "common.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "common.h"
index bae40c09133d70460ebc564675586289cab6eab7..ff0bf7c94040f22058db0ea3475fbdf4785c91bb 100644 (file)
@@ -8,18 +8,19 @@
 // High frequency ISO14443B commands
 //-----------------------------------------------------------------------------
 
 // High frequency ISO14443B commands
 //-----------------------------------------------------------------------------
 
+#include "cmdhf14b.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdbool.h>
 #include <string.h>
 #include <stdint.h>
 #include "iso14443crc.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdbool.h>
 #include <string.h>
 #include <stdint.h>
 #include "iso14443crc.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "graph.h"
 #include "util.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "graph.h"
 #include "util.h"
 #include "ui.h"
 #include "cmdparser.h"
-#include "cmdhf14b.h"
 #include "cmdmain.h"
 #include "cmdhf14a.h"
 
 #include "cmdmain.h"
 #include "cmdhf14a.h"
 
index a45b74341ced2cd82a733472f7abd4939fc29744..4fcae927dfb1630cc86df28b03b1bdbd9dd7b8da 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef CMDHF14B_H__
 #define CMDHF14B_H__
 
 #ifndef CMDHF14B_H__
 #define CMDHF14B_H__
 
+#include <stdbool.h>
+
 int CmdHF14B(const char *Cmd);
 int CmdHF14BList(const char *Cmd);
 int CmdHF14BInfo(const char *Cmd);
 int CmdHF14B(const char *Cmd);
 int CmdHF14BList(const char *Cmd);
 int CmdHF14BInfo(const char *Cmd);
index 570a042035c9dfb978021e91c2c7f98416c3b9ce..08cc3b154bec50ff3f01baf4dcce1964f3597c01 100644 (file)
 // the client. Signal Processing & decoding is done on the pc. This is the slowest
 // variant, but offers the possibility to analyze the waveforms directly. 
 
 // the client. Signal Processing & decoding is done on the pc. This is the slowest
 // variant, but offers the possibility to analyze the waveforms directly. 
 
+#include "cmdhf15.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdint.h>
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdint.h>
 
-#include "proxmark3.h"
+#include "comms.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "cmdparser.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "cmdparser.h"
-#include "cmdhf15.h"
 #include "iso15693tools.h"
 #include "cmdmain.h"
 
 #include "iso15693tools.h"
 #include "cmdmain.h"
 
index c6264604670d1980b9f3d943d6088d32535fbeb6..d0517fe5b07de3d5f0f4f3ac3151a302e42bc947 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef CMDHF15_H__
 #define CMDHF15_H__
 
 #ifndef CMDHF15_H__
 #define CMDHF15_H__
 
+#include <stdbool.h>
+
 int CmdHF15(const char *Cmd);
 
 int CmdHF15Demod(const char *Cmd);
 int CmdHF15(const char *Cmd);
 
 int CmdHF15Demod(const char *Cmd);
index f3456afbea2a54f4f2c876e7d34a6c363b4d1766..ac1f4268eb7f057b36d8a3a6a7ea7952a2b9c6e5 100644 (file)
@@ -17,7 +17,7 @@
 #include <stdio.h>
 #include "util.h"
 #include "util_posix.h"
 #include <stdio.h>
 #include "util.h"
 #include "util_posix.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "common.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "common.h"
index e99c328592e9375846ca2d3b1fe0699f3405fb12..499f7aae0e38d20e9874898ab913543d0bd43b82 100644 (file)
@@ -16,7 +16,7 @@
 #include <sys/stat.h>
 #include <ctype.h>
 #include "iso14443crc.h" // Can also be used for iClass, using 0xE012 as CRC-type
 #include <sys/stat.h>
 #include <ctype.h>
 #include "iso14443crc.h" // Can also be used for iClass, using 0xE012 as CRC-type
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "cmdhficlass.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "cmdhficlass.h"
index 9c9613aea3dd8b72b07d856892bc54ca4e7e2c97..691e1978b0b1dacfaac9797a31bb3c74c0025b72 100644 (file)
@@ -8,15 +8,17 @@
 // High frequency Legic commands
 //-----------------------------------------------------------------------------
 
 // High frequency Legic commands
 //-----------------------------------------------------------------------------
 
+#include "cmdhflegic.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "ui.h"
 #include "cmdparser.h"
-#include "cmdhflegic.h"
 #include "cmdmain.h"
 #include "util.h"
 #include "cmdmain.h"
 #include "util.h"
+
 static int CmdHelp(const char *Cmd);
 
 static command_t CommandTable[] = 
 static int CmdHelp(const char *Cmd);
 
 static command_t CommandTable[] = 
index a2da01c97fc474c3e1b636e9ad46643d4076e500..b50d6013dec48a6a68142ec5b2bd36ae827c7898 100644 (file)
@@ -15,7 +15,7 @@
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <ctype.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <ctype.h>\r
-#include "proxmark3.h"\r
+#include "comms.h"\r
 #include "cmdmain.h"\r
 #include "cmdhfmfhard.h"\r
 #include "parity.h"\r
 #include "cmdmain.h"\r
 #include "cmdhfmfhard.h"\r
 #include "parity.h"\r
index cf19436c39614e154be2a46e85ea7d0a64561ae2..be618d6e7286d9583d13d6dd6f2476eb95fef98e 100644 (file)
@@ -25,6 +25,7 @@
 #include <locale.h>
 #include <math.h>
 #include "proxmark3.h"
 #include <locale.h>
 #include <math.h>
 #include "proxmark3.h"
+#include "comms.h"
 #include "cmdmain.h"
 #include "ui.h"
 #include "util.h"
 #include "cmdmain.h"
 #include "ui.h"
 #include "util.h"
index ac76c8dd203aac283146de253ba402f1e4edc321..e4115d71606db2079862040aca3d8c04f8f67f53 100644 (file)
@@ -12,7 +12,7 @@
 
 #include <stdint.h>
 #include <stdio.h>
 
 #include <stdint.h>
 #include <stdio.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "usb_cmd.h"
 #include "cmdmain.h"
 #include "ui.h"
 #include "usb_cmd.h"
 #include "cmdmain.h"
 #include "ui.h"
index 39ff180473d19fa1eee81329cfd6e52ae960ac7f..b0b8a3d2c642f0edaa3fecb623cb24f766a0847b 100644 (file)
@@ -8,17 +8,18 @@
 // High frequency Topaz (NFC Type 1) commands
 //-----------------------------------------------------------------------------
 
 // High frequency Topaz (NFC Type 1) commands
 //-----------------------------------------------------------------------------
 
+#include "cmdhftopaz.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include "cmdmain.h"
 #include "cmdparser.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include "cmdmain.h"
 #include "cmdparser.h"
-#include "cmdhftopaz.h"
 #include "cmdhf14a.h"
 #include "ui.h"
 #include "mifare.h"
 #include "cmdhf14a.h"
 #include "ui.h"
 #include "mifare.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "iso14443crc.h"
 #include "protocols.h"
 
 #include "iso14443crc.h"
 #include "protocols.h"
 
index 4ede122f0b522a4e7f069b2b33291af05684e8a9..bdab01eba35bc66f1a45ac656e581d238f9c3fc7 100644 (file)
@@ -8,14 +8,15 @@
 // Hardware commands
 //-----------------------------------------------------------------------------
 
 // Hardware commands
 //-----------------------------------------------------------------------------
 
+#include "cmdhw.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
 #include "ui.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
 #include "ui.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "cmdparser.h"
 #include "cmdparser.h"
-#include "cmdhw.h"
 #include "cmdmain.h"
 #include "cmddata.h"
 
 #include "cmdmain.h"
 #include "cmddata.h"
 
index 285d377af8fb79d07432dc31795666565c73e543..c09a299ce1f32e9cb11fec9c57a30d14ca115ee2 100644 (file)
@@ -8,14 +8,15 @@
 // Low frequency commands
 //-----------------------------------------------------------------------------
 
 // Low frequency commands
 //-----------------------------------------------------------------------------
 
+#include "cmdlf.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
 #include <stdbool.h>
 #include <stdint.h>
-#include "proxmark3.h"
-#include "cmdlf.h"
+#include "comms.h"
 #include "lfdemod.h"     // for psk2TOpsk1
 #include "util.h"        // for parsing cli command utils
 #include "ui.h"          // for show graph controls
 #include "lfdemod.h"     // for psk2TOpsk1
 #include "util.h"        // for parsing cli command utils
 #include "ui.h"          // for show graph controls
index 141ba17288945f5cf44e50aea01d2a01cb96229e..cde945554c440b0e38c401b232bdf12d79925bdc 100644 (file)
 // FSK2a, RF/50, 96 bits (complete)
 //-----------------------------------------------------------------------------
 
 // FSK2a, RF/50, 96 bits (complete)
 //-----------------------------------------------------------------------------
 
+#include "cmdlfawid.h"
+
 #include <string.h>
 #include <stdio.h>      // sscanf
 #include <string.h>
 #include <stdio.h>      // sscanf
-#include "proxmark3.h"  // Definitions, USB controls, etc
-#include "cmdlfawid.h"
+#include "comms.h"      // Definitions, USB controls, etc
 #include "ui.h"         // PrintAndLog
 #include "cmdparser.h"  // CmdsParse, CmdsHelp
 #include "lfdemod.h"    // parityTest +
 #include "ui.h"         // PrintAndLog
 #include "cmdparser.h"  // CmdsParse, CmdsHelp
 #include "lfdemod.h"    // parityTest +
index ca163480595dd39f2c5e35633638035d0a3d2439..d1808c9a00fae216a4ad6a8b0f3ea80f6052194c 100644 (file)
@@ -7,13 +7,15 @@
 //-----------------------------------------------------------------------------
 // Low frequency COTAG commands
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // Low frequency COTAG commands
 //-----------------------------------------------------------------------------
+
+#include "cmdlfcotag.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "cmddata.h"
 #include "ui.h"
 #include "cmddata.h"
-#include "cmdlfcotag.h"
 #include "lfdemod.h"
 #include "usb_cmd.h"
 #include "cmdmain.h"
 #include "lfdemod.h"
 #include "usb_cmd.h"
 #include "cmdmain.h"
index ff2ae5b0f527d3532167f3bf15e9106859bfded7..cdaeb5ed282f30d5b10bc045d2d5beaf63a3cf51 100644 (file)
@@ -8,11 +8,12 @@
 // Low frequency EM4x commands
 //-----------------------------------------------------------------------------
 
 // Low frequency EM4x commands
 //-----------------------------------------------------------------------------
 
+#include "cmdlfem4x.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
-#include "cmdlfem4x.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index 2e2ee9fd3b373c30b7d811fcfb20adb6454866b6..20f834ceb7c687a4c708e5c4c37b8b2e3c452124 100644 (file)
@@ -13,7 +13,7 @@
 #include <stdio.h>
 #include <inttypes.h>
 #include <string.h>
 #include <stdio.h>
 #include <inttypes.h>
 #include <string.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"         // for PrintAndLog
 #include "util.h"
 #include "cmdparser.h"
 #include "ui.h"         // for PrintAndLog
 #include "util.h"
 #include "cmdparser.h"
index 19b5a1424a2471e7988c21126c7af2100d60d254..ca58d8abfb453f5caaff087a1713abc9f1565ad9 100644 (file)
@@ -8,10 +8,11 @@
 // Low frequency HID commands (known)
 //-----------------------------------------------------------------------------
 
 // Low frequency HID commands (known)
 //-----------------------------------------------------------------------------
 
+#include "cmdlfhid.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdio.h>
 #include <string.h>
-#include "cmdlfhid.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
index 26ba92385dbba4e904ae4d20cba0cda8af2f8fff..0fd8801b8e83010068e818e096361dafcdb4f58d 100644 (file)
@@ -8,10 +8,12 @@
 // Low frequency Hitag support
 //-----------------------------------------------------------------------------
 
 // Low frequency Hitag support
 //-----------------------------------------------------------------------------
 
+#include "cmdlfhitag.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "common.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "common.h"
index 0a4f783492b8fd8bdf90a0a8743b7ab3780f454f..b30231c57a7a673c9c3681ef3d704f1b9f81d6f8 100644 (file)
@@ -8,10 +8,11 @@
 // PSK1, rf/32, 64 or 224 bits (known)
 //-----------------------------------------------------------------------------
 
 // PSK1, rf/32, 64 or 224 bits (known)
 //-----------------------------------------------------------------------------
 
+#include "cmdlfindala.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdio.h>
 #include <string.h>
-#include "cmdlfindala.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
index f2f2df06989898d6e91eee6752d82bca5aaba5f1..feb7d3732d626f3ee9f3b6a65d09913e86f56a46 100644 (file)
@@ -8,13 +8,14 @@
 // FSK2a, rf/64, 64 bits (complete)
 //-----------------------------------------------------------------------------
 
 // FSK2a, rf/64, 64 bits (complete)
 //-----------------------------------------------------------------------------
 
+#include "cmdlfio.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
 #include <limits.h>
-#include "cmdlfio.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "graph.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "graph.h"
 #include "ui.h"
 #include "cmdparser.h"
index 9c69099edbdfb651a6aed4a5db90303502032f17..4756266c8ef766d1eadc8d6effba920e7a2cfdb9 100644 (file)
@@ -9,10 +9,11 @@
 //-----------------------------------------------------------------------------
 
 #include "cmdlfjablotron.h"
 //-----------------------------------------------------------------------------
 
 #include "cmdlfjablotron.h"
+
 #include <string.h>
 #include <inttypes.h>
 #include <stdbool.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdbool.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index caabe83559d47fdaf118815ab76ddea666287516..d44c2a276205ff30c48be2da64ae6f14738a298c 100644 (file)
@@ -7,12 +7,14 @@
 // Low frequency Honeywell NexWatch tag commands
 // PSK1 RF/16, RF/2, 128 bits long (known)
 //-----------------------------------------------------------------------------
 // Low frequency Honeywell NexWatch tag commands
 // PSK1 RF/16, RF/2, 128 bits long (known)
 //-----------------------------------------------------------------------------
+
+#include "cmdlfnexwatch.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdbool.h>
-#include "cmdlfnexwatch.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index 2c90fa14da4843637114a680a28993021b1bffb7..52c35081f42003aa81f9bf2f303a7541c75809f2 100644 (file)
@@ -7,11 +7,13 @@
 // Low frequency Noralsy tag commands
 // ASK/Manchester, STT, RF/32, 96 bits long (some bits unknown)
 //-----------------------------------------------------------------------------
 // Low frequency Noralsy tag commands
 // ASK/Manchester, STT, RF/32, 96 bits long (some bits unknown)
 //-----------------------------------------------------------------------------
+
 #include "cmdlfnoralsy.h"
 #include "cmdlfnoralsy.h"
+
 #include <string.h>
 #include <inttypes.h>
 #include <math.h>
 #include <string.h>
 #include <inttypes.h>
 #include <math.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index ef6b394b36f76647f32af95a478e263651460c75..190361ec25484bfef02c84ecbe85c38061ce7b3b 100644 (file)
@@ -7,10 +7,12 @@
 // Low frequency Stanley/PAC tag commands
 // NRZ, RF/32, 128 bits long (unknown cs)
 //-----------------------------------------------------------------------------
 // Low frequency Stanley/PAC tag commands
 // NRZ, RF/32, 128 bits long (unknown cs)
 //-----------------------------------------------------------------------------
+
 #include "cmdlfpac.h"
 #include "cmdlfpac.h"
+
 #include <string.h>
 #include <inttypes.h>
 #include <string.h>
 #include <inttypes.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index ffaf946f48e4c689eaac7d73cb703a3dab1ba04f..9c694b8d1437735453886f38bab839c18b9d00fa 100644 (file)
@@ -8,9 +8,12 @@
 //-----------------------------------------------------------------------------
 // Low frequency PCF7931 commands
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // Low frequency PCF7931 commands
 //-----------------------------------------------------------------------------
+
+#include "cmdlfpcf7931.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdio.h>
 #include <string.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
@@ -18,7 +21,6 @@
 #include "cmddata.h"
 #include "cmdmain.h"
 #include "cmdlf.h"
 #include "cmddata.h"
 #include "cmdmain.h"
 #include "cmdlf.h"
-#include "cmdlfpcf7931.h"
 
 static int CmdHelp(const char *Cmd);
 
 
 static int CmdHelp(const char *Cmd);
 
index e093039c98726988d57815488ab3185d2a8b79c7..8b24f03a3ab7038550357a6ced2489ded22b90a4 100644 (file)
@@ -12,6 +12,8 @@
 #ifndef CMDLFPCF7931_H__
 #define CMDLFPCF7931_H__
 
 #ifndef CMDLFPCF7931_H__
 #define CMDLFPCF7931_H__
 
+#include <stdint.h>
+
 struct pcf7931_config{
        uint8_t Pwd[7];
        uint16_t InitDelay;
 struct pcf7931_config{
        uint8_t Pwd[7];
        uint16_t InitDelay;
index 2f4bacfec29410c4a9149a6470c1daabc52af90a..865b384b38b0964e48d2796dd459d0f33c64d7f1 100644 (file)
@@ -7,11 +7,13 @@
 // Low frequency Presco tag commands
 // ASK/Manchester, rf/32, 128 bits (complete)
 //-----------------------------------------------------------------------------
 // Low frequency Presco tag commands
 // ASK/Manchester, rf/32, 128 bits (complete)
 //-----------------------------------------------------------------------------
+
+#include "cmdlfpresco.h"
+
 #include <string.h>
 #include <inttypes.h>
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdio.h>
-#include "cmdlfpresco.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index 366889f3f9ea2a68a0256ca95437f807b1b806ca..823677203a3ba9c7eeb7d89aad8d5ccb15fbcaed 100644 (file)
@@ -7,11 +7,13 @@
 // Low frequency Farpoint / Pyramid tag commands
 // FSK2a, rf/50, 128 bits (complete)
 //-----------------------------------------------------------------------------
 // Low frequency Farpoint / Pyramid tag commands
 // FSK2a, rf/50, 128 bits (complete)
 //-----------------------------------------------------------------------------
+
+#include "cmdlfpyramid.h"
+
 #include <string.h>
 #include <inttypes.h>
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdio.h>
-#include "cmdlfpyramid.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index 8ae81250fb06fb3b995ec048d937291b9eabb099..44b77060e7585c4c806ae942c99653ea643f0519 100644 (file)
@@ -7,11 +7,13 @@
 // Low frequency Securakey tag commands
 // ASK/Manchester, RF/40, 96 bits long (unknown cs)
 //-----------------------------------------------------------------------------
 // Low frequency Securakey tag commands
 // ASK/Manchester, RF/40, 96 bits long (unknown cs)
 //-----------------------------------------------------------------------------
+
 #include "cmdlfsecurakey.h"
 #include "cmdlfsecurakey.h"
+
 #include <string.h>
 #include <inttypes.h>
 #include <math.h>
 #include <string.h>
 #include <inttypes.h>
 #include <math.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index a9fbb71ec56d4ed48cabb8e075464447bd1dda8d..f53ff0d603632cb32238e1e2a8f46e165a1dfdba 100644 (file)
@@ -7,19 +7,20 @@
 // Low frequency T55xx commands\r
 //-----------------------------------------------------------------------------\r
 \r
 // Low frequency T55xx commands\r
 //-----------------------------------------------------------------------------\r
 \r
+#include "cmdlft55xx.h"\r
+\r
 #include <stdio.h>\r
 #include <string.h>\r
 #include <inttypes.h>\r
 #include <ctype.h>\r
 #include <time.h>\r
 #include <stdio.h>\r
 #include <string.h>\r
 #include <inttypes.h>\r
 #include <ctype.h>\r
 #include <time.h>\r
-#include "proxmark3.h"\r
+#include "comms.h"\r
 #include "ui.h"\r
 #include "graph.h"\r
 #include "cmdmain.h"\r
 #include "cmdparser.h"\r
 #include "cmddata.h"\r
 #include "cmdlf.h"\r
 #include "ui.h"\r
 #include "graph.h"\r
 #include "cmdmain.h"\r
 #include "cmdparser.h"\r
 #include "cmddata.h"\r
 #include "cmdlf.h"\r
-#include "cmdlft55xx.h"\r
 #include "util.h"\r
 #include "lfdemod.h"\r
 #include "cmdhf14a.h" //for getTagInfo\r
 #include "util.h"\r
 #include "lfdemod.h"\r
 #include "cmdhf14a.h" //for getTagInfo\r
index 4f0fd21d34aba79cc7e28efafd1070a93dbca25e..2ae3e69b571f0b11cd8d927fbec2dedac83080ac 100644 (file)
@@ -10,6 +10,9 @@
 #ifndef CMDLFT55XX_H__\r
 #define CMDLFT55XX_H__\r
 \r
 #ifndef CMDLFT55XX_H__\r
 #define CMDLFT55XX_H__\r
 \r
+#include <stdint.h>\r
+#include <stdbool.h>\r
+\r
 typedef struct {\r
        uint32_t bl1;\r
        uint32_t bl2; \r
 typedef struct {\r
        uint32_t bl1;\r
        uint32_t bl2; \r
index 7e0af94b00709b2e14cbf89de4d2cf74307e1b64..ff463971689ed830b43e4c5e514bbe3566907277 100644 (file)
@@ -14,7 +14,7 @@
 #include <stdlib.h>
 #include <inttypes.h>
 #include "crc16.h"
 #include <stdlib.h>
 #include <inttypes.h>
 #include "crc16.h"
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
 #include "ui.h"
 #include "graph.h"
 #include "cmdparser.h"
index 779156c8d9d4301708c6c1ab0a0153c6ab5c4e62..73a9126af568904dab306d19ccf217bf44bf052b 100644 (file)
@@ -7,11 +7,13 @@
 // Low frequency Viking tag commands (AKA FDI Matalec Transit)
 // ASK/Manchester, RF/32, 64 bits (complete)
 //-----------------------------------------------------------------------------
 // Low frequency Viking tag commands (AKA FDI Matalec Transit)
 // ASK/Manchester, RF/32, 64 bits (complete)
 //-----------------------------------------------------------------------------
+
+#include "cmdlfviking.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdio.h>
 #include <string.h>
 #include <inttypes.h>
-#include "proxmark3.h"
-#include "cmdlfviking.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index 04589ba51f872306e75664b3a85cf427505c3460..332597946984fa76e144ed296dd81f43645f2ed9 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <stdio.h>
 #include <string.h>
 
 #include <stdio.h>
 #include <string.h>
-#include "proxmark3.h"
+#include "comms.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
 #include "ui.h"
 #include "util.h"
 #include "graph.h"
index c3b46145a1157ca0cb4788682c5fe11fb5d36cac..01d4c9a7f7e2d04d58f26ea38f6a1ff191821970 100644 (file)
@@ -50,13 +50,13 @@ command_t* getTopLevelCommandTable()
   return CommandTable;
 }
 
   return CommandTable;
 }
 
-int CmdHelp(const char *Cmd)
+static int CmdHelp(const char *Cmd)
 {
   CmdsHelp(CommandTable);
   return 0;
 }
 
 {
   CmdsHelp(CommandTable);
   return 0;
 }
 
-int CmdQuit(const char *Cmd)
+static int CmdQuit(const char *Cmd)
 {
   return 99;
 }
 {
   return 99;
 }
index a833b41ebf2a03d2f3bb6ba9edb801c7106c02a2..42b491452afab407853a11fa4c5a98ac45d882e1 100644 (file)
 #ifndef CMDMAIN_H__
 #define CMDMAIN_H__
 
 #ifndef CMDMAIN_H__
 #define CMDMAIN_H__
 
-#include <stdint.h>
-#include <stddef.h>
-#include "usb_cmd.h"
 #include "cmdparser.h"
 #include "cmdparser.h"
-#include "comms.h"
-
 
 extern int CommandReceived(char *Cmd);
 extern command_t* getTopLevelCommandTable();
 
 extern int CommandReceived(char *Cmd);
 extern command_t* getTopLevelCommandTable();
index b62f6fda47e3f94c796345e118ae052b27c323b5..eeaff79cda8857082a16d4e261c442f347018e8f 100644 (file)
@@ -9,33 +9,42 @@
 // Code for communicating with the proxmark3 hardware.
 //-----------------------------------------------------------------------------
 
 // Code for communicating with the proxmark3 hardware.
 //-----------------------------------------------------------------------------
 
-#include <pthread.h>
-
 #include "comms.h"
 #include "comms.h"
+
+#include <pthread.h>
+#ifdef __linux__
+#include <unistd.h>            // for unlink()
+#endif
 #include "uart.h"
 #include "ui.h"
 #include "common.h"
 #include "util_posix.h"
 
 #include "uart.h"
 #include "ui.h"
 #include "common.h"
 #include "util_posix.h"
 
-// Declare globals.
 
 // Serial port that we are communicating with the PM3 on.
 
 // Serial port that we are communicating with the PM3 on.
-static serial_port sp;
+static serial_port sp = NULL;
+static char *serial_port_name = NULL;
 
 // If TRUE, then there is no active connection to the PM3, and we will drop commands sent.
 static bool offline;
 
 
 // If TRUE, then there is no active connection to the PM3, and we will drop commands sent.
 static bool offline;
 
+typedef struct {
+       bool run; // If TRUE, continue running the uart_communication thread
+       bool block_after_ACK; // if true, block after receiving an ACK package
+} communication_arg_t;
+
+static communication_arg_t conn;
+static pthread_t USB_communication_thread;
+
 // Transmit buffer.
 // Transmit buffer.
-// TODO: Use locks and execute this on the main thread, rather than the receiver
-// thread.  Running on the main thread means we need to be careful in the
-// flasher, as it means SendCommand is no longer async, and can't be used as a
-// buffer for a pending command when the connection is re-established.
-static UsbCommand txcmd;
-volatile static bool txcmd_pending = false;
+static UsbCommand txBuffer;
+static bool txBuffer_pending = false;
+static pthread_mutex_t txBufferMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t txBufferSig = PTHREAD_COND_INITIALIZER;
 
 // Used by UsbReceiveCommand as a ring buffer for messages that are yet to be
 // processed by a command handler (WaitForResponse{,Timeout})
 
 // Used by UsbReceiveCommand as a ring buffer for messages that are yet to be
 // processed by a command handler (WaitForResponse{,Timeout})
-static UsbCommand cmdBuffer[CMD_BUFFER_SIZE];
+static UsbCommand rxBuffer[CMD_BUFFER_SIZE];
 
 // Points to the next empty position to write to
 static int cmd_head = 0;
 
 // Points to the next empty position to write to
 static int cmd_head = 0;
@@ -43,8 +52,8 @@ static int cmd_head = 0;
 // Points to the position of the last unread command
 static int cmd_tail = 0;
 
 // Points to the position of the last unread command
 static int cmd_tail = 0;
 
-// to lock cmdBuffer operations from different threads
-static pthread_mutex_t cmdBufferMutex = PTHREAD_MUTEX_INITIALIZER;
+// to lock rxBuffer operations from different threads
+static pthread_mutex_t rxBufferMutex = 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.
 
 // These wrappers are required because it is not possible to access a static
 // global variable outside of the context of a single file.
@@ -57,38 +66,6 @@ bool IsOffline() {
        return offline;
 }
 
        return offline;
 }
 
-bool OpenProxmark(char *portname, bool waitCOMPort, int timeout) {
-       if (!waitCOMPort) {
-               sp = uart_open(portname);
-       } else {
-               printf("Waiting for Proxmark to appear on %s ", portname);
-               fflush(stdout);
-               int openCount = 0;
-               do {
-                       sp = uart_open(portname);
-                       msleep(1000);
-                       printf(".");
-                       fflush(stdout);
-               } while(++openCount < timeout && (sp == INVALID_SERIAL_PORT || sp == CLAIMED_SERIAL_PORT));
-               printf("\n");
-       }
-
-       // check result of uart opening
-       if (sp == INVALID_SERIAL_PORT) {
-               printf("ERROR: invalid serial port\n");
-               return false;
-       } else if (sp == CLAIMED_SERIAL_PORT) {
-               printf("ERROR: serial port is claimed by another process\n");
-               return false;
-       } else {
-               return true;
-       }
-}
-
-void CloseProxmark(void) {
-       uart_close(sp);
-}
-
 void SendCommand(UsbCommand *c) {
        #ifdef COMMS_DEBUG
        printf("Sending %04x cmd\n", c->cmd);
 void SendCommand(UsbCommand *c) {
        #ifdef COMMS_DEBUG
        printf("Sending %04x cmd\n", c->cmd);
@@ -98,15 +75,22 @@ void SendCommand(UsbCommand *c) {
                PrintAndLog("Sending bytes to proxmark failed - offline");
                return;
     }
                PrintAndLog("Sending bytes to proxmark failed - offline");
                return;
     }
+
+       pthread_mutex_lock(&txBufferMutex);
        /**
        /**
-       The while-loop below causes hangups at times, when the pm3 unit is unresponsive
-       or disconnected. The main console thread is alive, but comm thread just spins here.
-       Not good.../holiman
+       This causes hangups at times, when the pm3 unit is unresponsive or disconnected. The main console thread is alive, 
+       but comm thread just spins here. Not good.../holiman
        **/
        **/
-       while(txcmd_pending);
+       while (txBuffer_pending) {
+               pthread_cond_wait(&txBufferSig, &txBufferMutex); // wait for communication thread to complete sending a previous commmand
+       }
+
+       txBuffer = *c;
+       txBuffer_pending = true;
+       pthread_cond_signal(&txBufferSig); // tell communication thread that a new command can be send
+
+       pthread_mutex_unlock(&txBufferMutex);
 
 
-       txcmd = *c;
-       txcmd_pending = true;
 }
 
 
 }
 
 
@@ -119,18 +103,18 @@ void SendCommand(UsbCommand *c) {
 void clearCommandBuffer()
 {
        //This is a very simple operation
 void clearCommandBuffer()
 {
        //This is a very simple operation
-       pthread_mutex_lock(&cmdBufferMutex);
+       pthread_mutex_lock(&rxBufferMutex);
        cmd_tail = cmd_head;
        cmd_tail = cmd_head;
-       pthread_mutex_unlock(&cmdBufferMutex);
+       pthread_mutex_unlock(&rxBufferMutex);
 }
 
 /**
  * @brief storeCommand stores a USB command in a circular buffer
  * @param UC
  */
 }
 
 /**
  * @brief storeCommand stores a USB command in a circular buffer
  * @param UC
  */
-void storeCommand(UsbCommand *command)
+static void storeCommand(UsbCommand *command)
 {
 {
-       pthread_mutex_lock(&cmdBufferMutex);
+       pthread_mutex_lock(&rxBufferMutex);
        if( (cmd_head+1) % CMD_BUFFER_SIZE == cmd_tail)
        {
                // If these two are equal, we're about to overwrite in the
        if( (cmd_head+1) % CMD_BUFFER_SIZE == cmd_tail)
        {
                // If these two are equal, we're about to overwrite in the
@@ -139,11 +123,11 @@ void storeCommand(UsbCommand *command)
        }
 
        // Store the command at the 'head' location
        }
 
        // Store the command at the 'head' location
-       UsbCommand* destination = &cmdBuffer[cmd_head];
+       UsbCommand* destination = &rxBuffer[cmd_head];
        memcpy(destination, command, sizeof(UsbCommand));
 
        cmd_head = (cmd_head +1) % CMD_BUFFER_SIZE; //increment head and wrap
        memcpy(destination, command, sizeof(UsbCommand));
 
        cmd_head = (cmd_head +1) % CMD_BUFFER_SIZE; //increment head and wrap
-       pthread_mutex_unlock(&cmdBufferMutex);
+       pthread_mutex_unlock(&rxBufferMutex);
 }
 
 
 }
 
 
@@ -152,22 +136,22 @@ void storeCommand(UsbCommand *command)
  * @param response location to write command
  * @return 1 if response was returned, 0 if nothing has been received
  */
  * @param response location to write command
  * @return 1 if response was returned, 0 if nothing has been received
  */
-int getCommand(UsbCommand* response)
+static int getCommand(UsbCommand* response)
 {
 {
-       pthread_mutex_lock(&cmdBufferMutex);
+       pthread_mutex_lock(&rxBufferMutex);
        //If head == tail, there's nothing to read, or if we just got initialized
        if (cmd_head == cmd_tail){
        //If head == tail, there's nothing to read, or if we just got initialized
        if (cmd_head == cmd_tail){
-               pthread_mutex_unlock(&cmdBufferMutex);
+               pthread_mutex_unlock(&rxBufferMutex);
                return 0;
        }
 
        //Pick out the next unread command
                return 0;
        }
 
        //Pick out the next unread command
-       UsbCommand* last_unread = &cmdBuffer[cmd_tail];
+       UsbCommand* last_unread = &rxBuffer[cmd_tail];
        memcpy(response, last_unread, sizeof(UsbCommand));
        //Increment tail - this is a circular buffer, so modulo buffer size
        cmd_tail = (cmd_tail + 1) % CMD_BUFFER_SIZE;
 
        memcpy(response, last_unread, sizeof(UsbCommand));
        //Increment tail - this is a circular buffer, so modulo buffer size
        cmd_tail = (cmd_tail + 1) % CMD_BUFFER_SIZE;
 
-       pthread_mutex_unlock(&cmdBufferMutex);
+       pthread_mutex_unlock(&rxBufferMutex);
        return 1;
 }
 
        return 1;
 }
 
@@ -202,35 +186,54 @@ static void UsbCommandReceived(UsbCommand *UC)
 }
 
 
 }
 
 
-void
+static void
 #ifdef __has_attribute
 #if __has_attribute(force_align_arg_pointer)
 __attribute__((force_align_arg_pointer)) 
 #endif
 #endif
 #ifdef __has_attribute
 #if __has_attribute(force_align_arg_pointer)
 __attribute__((force_align_arg_pointer)) 
 #endif
 #endif
-*uart_receiver(void *targ) {
-       receiver_arg *conn = (receiver_arg*)targ;
+*uart_communication(void *targ) {
+       communication_arg_t *conn = (communication_arg_t*)targ;
        size_t rxlen;
        size_t rxlen;
-       uint8_t rx[sizeof(UsbCommand)];
-       uint8_t *prx = rx;
+       UsbCommand rx;
+       UsbCommand *prx = &rx;
 
        while (conn->run) {
                rxlen = 0;
 
        while (conn->run) {
                rxlen = 0;
-               if (uart_receive(sp, prx, sizeof(UsbCommand) - (prx-rx), &rxlen) && rxlen) {
+               bool ACK_received = false;
+               if (uart_receive(sp, (uint8_t *)prx, sizeof(UsbCommand) - (prx-&rx), &rxlen) && rxlen) {
                        prx += rxlen;
                        prx += rxlen;
-                       if (prx-rx < sizeof(UsbCommand)) {
+                       if (prx-&rx < sizeof(UsbCommand)) {
                                continue;
                        }
                                continue;
                        }
-                       UsbCommandReceived((UsbCommand*)rx);
+                       UsbCommandReceived(&rx);
+                       if (rx.cmd == CMD_ACK) {
+                               ACK_received = true;
+                       }
                }
                }
-               prx = rx;
+               prx = &rx;
+
+               
+               pthread_mutex_lock(&txBufferMutex);
 
 
-               if(txcmd_pending) {
-                       if (!uart_send(sp, (uint8_t*) &txcmd, sizeof(UsbCommand))) {
+               if (conn->block_after_ACK) {
+                       // if we just received an ACK, wait here until a new command is to be transmitted
+                       if (ACK_received) {
+                               while (!txBuffer_pending) {
+                                       pthread_cond_wait(&txBufferSig, &txBufferMutex);
+                               }
+                       }
+               }
+                               
+               if(txBuffer_pending) {
+                       if (!uart_send(sp, (uint8_t*) &txBuffer, sizeof(UsbCommand))) {
                                PrintAndLog("Sending bytes to proxmark failed");
                        }
                                PrintAndLog("Sending bytes to proxmark failed");
                        }
-                       txcmd_pending = false;
+                       txBuffer_pending = false;
+                       pthread_cond_signal(&txBufferSig); // tell main thread that txBuffer is empty
                }
                }
+
+               pthread_mutex_unlock(&txBufferMutex);
        }
 
        pthread_exit(NULL);
        }
 
        pthread_exit(NULL);
@@ -238,7 +241,6 @@ __attribute__((force_align_arg_pointer))
 }
 
 
 }
 
 
-
 /**
  * Data transfer from Proxmark to client. This method times out after
  * ms_timeout milliseconds.
 /**
  * Data transfer from Proxmark to client. This method times out after
  * ms_timeout milliseconds.
@@ -289,6 +291,58 @@ bool GetFromBigBuf(uint8_t *dest, int bytes, int start_index, UsbCommand *respon
        return false;
 }
 
        return false;
 }
 
+       
+bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode) {
+       char *portname = (char *)port;
+       if (!wait_for_port) {
+               sp = uart_open(portname);
+       } else {
+               printf("Waiting for Proxmark to appear on %s ", portname);
+               fflush(stdout);
+               int openCount = 0;
+               do {
+                       sp = uart_open(portname);
+                       msleep(1000);
+                       printf(".");
+                       fflush(stdout);
+               } while(++openCount < timeout && (sp == INVALID_SERIAL_PORT || sp == CLAIMED_SERIAL_PORT));
+               printf("\n");
+       }
+
+       // check result of uart opening
+       if (sp == INVALID_SERIAL_PORT) {
+               printf("ERROR: invalid serial port\n");
+               sp = NULL;
+               serial_port_name = NULL;
+               return false;
+       } else if (sp == CLAIMED_SERIAL_PORT) {
+               printf("ERROR: serial port is claimed by another process\n");
+               sp = NULL;
+               serial_port_name = NULL;
+               return false;
+       } else {
+               // start the USB communication thread
+               serial_port_name = portname;
+               conn.run = true;
+               conn.block_after_ACK = flash_mode;
+               pthread_create(&USB_communication_thread, NULL, &uart_communication, &conn);
+               return true;
+       }
+}
+
+
+void CloseProxmark(void) {
+       conn.run = false;
+       pthread_join(USB_communication_thread, NULL);
+       uart_close(sp);
+#ifdef __linux__
+       // Fix for linux, it seems that it is extremely slow to release the serial port file descriptor /dev/*
+       if (serial_port_name) {
+               unlink(serial_port_name);
+       }
+#endif
+}
+
 
 /**
  * Waits for a certain response type. This method waits for a maximum of
 
 /**
  * Waits for a certain response type. This method waits for a maximum of
index 111677ad78da385776d8ee1e3a12a62ee044f68a..689811658429a4503c614a5cfcfe01eb5bbc4409 100644 (file)
 #define CMD_BUFFER_SIZE 50
 #endif
 
 #define CMD_BUFFER_SIZE 50
 #endif
 
-typedef struct {
-       // If TRUE, continue running the uart_receiver thread
-       bool run;
-
-       // Lock around serial port receives
-       pthread_mutex_t recv_lock;
-} receiver_arg;
-
-
 void SetOffline(bool new_offline);
 bool IsOffline();
 
 void SetOffline(bool new_offline);
 bool IsOffline();
 
-bool OpenProxmark(char *portname, bool waitCOMPort, int timeout);
+bool OpenProxmark(void *port, bool wait_for_port, int timeout, bool flash_mode);
 void CloseProxmark(void);
 
 void SendCommand(UsbCommand *c);
 
 void CloseProxmark(void);
 
 void SendCommand(UsbCommand *c);
 
-void *uart_receiver(void *targ);
 void clearCommandBuffer();
 bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeout, bool show_warning);
 bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout);
 void clearCommandBuffer();
 bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeout, bool show_warning);
 bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout);
index e3714185dbf195ed1881c49a975f1a1a964ec36c..e43ebd1b6932e07ecf5dcb29fa821c066d92f77d 100644 (file)
 #include "elf.h"
 #include "proxendian.h"
 #include "usb_cmd.h"
 #include "elf.h"
 #include "proxendian.h"
 #include "usb_cmd.h"
-#include "uart.h"
-
-void SendCommand(UsbCommand* txcmd);
-void ReceiveCommand(UsbCommand* rxcmd);
-
-serial_port sp;
+#include "comms.h"
 
 #define FLASH_START            0x100000
 #define FLASH_SIZE             (256*1024)
 
 #define FLASH_START            0x100000
 #define FLASH_SIZE             (256*1024)
@@ -42,22 +37,6 @@ static const uint8_t elf_ident[] = {
        EV_CURRENT
 };
 
        EV_CURRENT
 };
 
-void CloseProxmark(const char *serial_port_name) {
-       // Clean up the port
-       uart_close(sp);
-       // Fix for linux, it seems that it is extremely slow to release the serial port file descriptor /dev/*
-       unlink(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 false;
-       }
-
-       return true;
-}
 
 // Turn PHDRs into flasher segments, checking for PHDR sanity and merging adjacent
 // unaligned segments if needed
 
 // Turn PHDRs into flasher segments, checking for PHDR sanity and merging adjacent
 // unaligned segments if needed
@@ -207,7 +186,7 @@ static int check_segs(flash_file_t *ctx, int can_write_bl) {
 }
 
 // Load an ELF file and prepare it for flashing
 }
 
 // Load an ELF file and prepare it for flashing
-int flash_load(flash_file_t *ctx, const char *name, int can_write_bl)
+int flash_load(flash_file_t *ctx, const char *name, bool can_write_bl)
 {
        FILE *fd = NULL;
        Elf32_Ehdr ehdr;
 {
        FILE *fd = NULL;
        Elf32_Ehdr ehdr;
@@ -295,7 +274,7 @@ static int get_proxmark_state(uint32_t *state)
        c.cmd = CMD_DEVICE_INFO;
        SendCommand(&c);
        UsbCommand resp;
        c.cmd = CMD_DEVICE_INFO;
        SendCommand(&c);
        UsbCommand resp;
-       ReceiveCommand(&resp);
+       WaitForResponse(CMD_UNKNOWN, &resp);  // wait for any response. No timeout.
 
        // Three outcomes:
        // 1. The old bootrom code will ignore CMD_DEVICE_INFO, but respond with an ACK
 
        // Three outcomes:
        // 1. The old bootrom code will ignore CMD_DEVICE_INFO, but respond with an ACK
@@ -355,17 +334,16 @@ static int enter_bootloader(char *serial_port_name)
                }
 
                msleep(100);
                }
 
                msleep(100);
-               CloseProxmark(serial_port_name);
-
-               fprintf(stderr,"Waiting for Proxmark to reappear on %s",serial_port_name);
-               do {
-                       sleep(1);
-                       fprintf(stderr, ".");
-               } while (!OpenProxmark(0, serial_port_name));
-
-               fprintf(stderr," Found.\n");
+               CloseProxmark();
 
 
-               return 0;
+               bool opened = OpenProxmark(serial_port_name, true, 120, true);   // wait for 2 minutes
+               if (opened) {
+                       fprintf(stderr," Found.\n");
+                       return 0;
+               } else {
+                       fprintf(stderr,"Error: Proxmark not found.\n");
+                       return -1;
+               }
        }
 
        fprintf(stderr, "Error: Unknown Proxmark mode\n");
        }
 
        fprintf(stderr, "Error: Unknown Proxmark mode\n");
@@ -375,7 +353,7 @@ static int enter_bootloader(char *serial_port_name)
 static int wait_for_ack(void)
 {
        UsbCommand ack;
 static int wait_for_ack(void)
 {
        UsbCommand ack;
-       ReceiveCommand(&ack);
+       WaitForResponse(CMD_UNKNOWN, &ack);
        if (ack.cmd != CMD_ACK) {
                printf("Error: Unexpected reply 0x%04" PRIx64 " (expected ACK)\n", ack.cmd);
                return -1;
        if (ack.cmd != CMD_ACK) {
                printf("Error: Unexpected reply 0x%04" PRIx64 " (expected ACK)\n", ack.cmd);
                return -1;
@@ -424,12 +402,12 @@ static int write_block(uint32_t address, uint8_t *data, uint32_t length)
 
        memset(block_buf, 0xFF, BLOCK_SIZE);
        memcpy(block_buf, data, length);
 
        memset(block_buf, 0xFF, BLOCK_SIZE);
        memcpy(block_buf, data, length);
-  UsbCommand c;
+       UsbCommand c;
        c.cmd = CMD_FINISH_WRITE;
        c.arg[0] = address;
        memcpy(c.d.asBytes, block_buf, length);
        c.cmd = CMD_FINISH_WRITE;
        c.arg[0] = address;
        memcpy(c.d.asBytes, block_buf, length);
-  SendCommand(&c);
-  return wait_for_ack();
+       SendCommand(&c);
+       return wait_for_ack();
 }
 
 // Write a file's segments to Flash
 }
 
 // Write a file's segments to Flash
index f8ffd221ae1ef793bc6ef7ad69212c04f5f13dee..06c7c96ecfae16b10db7470a7441a9de32eca623 100644 (file)
@@ -10,8 +10,7 @@
 #define __FLASH_H__
 
 #include <stdint.h>
 #define __FLASH_H__
 
 #include <stdint.h>
-#include "elf.h"
-#include "uart.h"
+#include <stdbool.h>
 
 typedef struct {
        void *data;
 
 typedef struct {
        void *data;
@@ -26,14 +25,10 @@ typedef struct {
        flash_seg_t *segments;
 } flash_file_t;
 
        flash_seg_t *segments;
 } flash_file_t;
 
-int flash_load(flash_file_t *ctx, const char *name, int can_write_bl);
+int flash_load(flash_file_t *ctx, const char *name, bool can_write_bl);
 int flash_start_flashing(int enable_bl_writes, char *serial_port_name);
 int flash_write(flash_file_t *ctx);
 void flash_free(flash_file_t *ctx);
 int flash_stop_flashing(void);
 int flash_start_flashing(int enable_bl_writes, char *serial_port_name);
 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);
-bool OpenProxmark(size_t i, const char *serial_port_name);
-
-extern serial_port sp;
 #endif
 
 #endif
 
index 2bb87df9a96ea1ab5ab63a56a9e387a545f72272..a008f7bc9d85c82cb3dac55a723e6dbac83e2a04 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
 #include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
+#include <pthread.h>
 #include "proxmark3.h"
 #include "util.h"
 #include "util_posix.h"
 #include "flash.h"
 #include "proxmark3.h"
 #include "util.h"
 #include "util_posix.h"
 #include "flash.h"
-#include "uart.h"
+#include "comms.h"
 #include "usb_cmd.h"
 
 #include "usb_cmd.h"
 
-#ifdef _WIN32
-# define unlink(x)
-#else
-# include <unistd.h>
-#endif
 
 void cmd_debug(UsbCommand* UC) {
   //  Debug
 
 void cmd_debug(UsbCommand* UC) {
   //  Debug
@@ -37,29 +33,6 @@ void cmd_debug(UsbCommand* UC) {
   printf("...\n");
 }
 
   printf("...\n");
 }
 
-void SendCommand(UsbCommand* txcmd) {
-//  printf("send: ");
-//  cmd_debug(txcmd);
-  if (!uart_send(sp,(uint8_t*)txcmd,sizeof(UsbCommand))) {
-    printf("Sending bytes to proxmark failed\n");
-    exit(1);
-  }
-}
-
-void ReceiveCommand(UsbCommand* rxcmd) {
-  uint8_t* prxcmd = (uint8_t*)rxcmd;
-  uint8_t* prx = prxcmd;
-  size_t rxlen;
-  while (true) {
-    if (uart_receive(sp, prx, sizeof(UsbCommand) - (prx-prxcmd), &rxlen)) {
-      prx += rxlen;
-      if ((prx-prxcmd) >= sizeof(UsbCommand)) {
-        return;
-      }
-    }
-  }
-}
-
 static void usage(char *argv0)
 {
        fprintf(stderr, "Usage:   %s <port> [-b] image.elf [image.elf...]\n\n", argv0);
 static void usage(char *argv0)
 {
        fprintf(stderr, "Usage:   %s <port> [-b] image.elf [image.elf...]\n\n", argv0);
@@ -77,7 +50,7 @@ static void usage(char *argv0)
 
 int main(int argc, char **argv)
 {
 
 int main(int argc, char **argv)
 {
-       int can_write_bl = 0;
+       int can_write_bl = false;
        int num_files = 0;
        int res;
        flash_file_t files[MAX_FILES];
        int num_files = 0;
        int res;
        flash_file_t files[MAX_FILES];
@@ -92,7 +65,7 @@ int main(int argc, char **argv)
        for (int i = 2; i < argc; i++) {
                if (argv[i][0] == '-') {
                        if (!strcmp(argv[i], "-b")) {
        for (int i = 2; i < argc; i++) {
                if (argv[i][0] == '-') {
                        if (!strcmp(argv[i], "-b")) {
-                               can_write_bl = 1;
+                               can_write_bl = true;
                        } else {
                                usage(argv[0]);
                                return -1;
                        } else {
                                usage(argv[0]);
                                return -1;
@@ -110,12 +83,12 @@ int main(int argc, char **argv)
 
        char* serial_port_name = argv[1];
 
 
        char* serial_port_name = argv[1];
 
-       fprintf(stderr,"Waiting for Proxmark to appear on %s", serial_port_name);
-       do {
-               msleep(1000);
-               fprintf(stderr, ".");
-       } while (!OpenProxmark(0, serial_port_name));
-       fprintf(stderr," Found.\n");
+       if (!OpenProxmark(serial_port_name, true, 120, true)) {   // wait for 2 minutes
+               fprintf(stderr, "Could not find Proxmark on %s.\n\n", serial_port_name);
+               return -1;
+       } else {
+               fprintf(stderr," Found.\n");
+       }
 
        res = flash_start_flashing(can_write_bl, serial_port_name);
        if (res < 0)
 
        res = flash_start_flashing(can_write_bl, serial_port_name);
        if (res < 0)
@@ -137,7 +110,8 @@ int main(int argc, char **argv)
        if (res < 0)
                return -1;
 
        if (res < 0)
                return -1;
 
-       CloseProxmark(serial_port_name);
+       // Stop the command thread.
+       CloseProxmark();
 
        fprintf(stderr, "All done.\n\n");
        fprintf(stderr, "Have a nice day!\n");
 
        fprintf(stderr, "All done.\n\n");
        fprintf(stderr, "Have a nice day!\n");
index e1ced176580166a7e7015418e8c8463e6fe7c549..2d69cfae14208f56f89a8dc03bcec1986272cd8d 100644 (file)
@@ -16,7 +16,7 @@
 #include <pthread.h>\r
 \r
 #include "crapto1/crapto1.h"\r
 #include <pthread.h>\r
 \r
 #include "crapto1/crapto1.h"\r
-#include "proxmark3.h"\r
+#include "comms.h"\r
 #include "usb_cmd.h"\r
 #include "cmdmain.h"\r
 #include "ui.h"\r
 #include "usb_cmd.h"\r
 #include "cmdmain.h"\r
 #include "ui.h"\r
index 88cb5fa76db22a705172e9318fa566f9205b9a15..40c466130f03f645f2e69d6d76f4000b2c688346 100644 (file)
@@ -9,6 +9,8 @@
 // Main binary
 //-----------------------------------------------------------------------------
 
 // Main binary
 //-----------------------------------------------------------------------------
 
+#include "proxmark3.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -17,7 +19,6 @@
 #include <readline/readline.h>
 #include <readline/history.h>
 
 #include <readline/readline.h>
 #include <readline/history.h>
 
-#include "proxmark3.h"
 #include "util_posix.h"
 #include "proxgui.h"
 #include "cmdmain.h"
 #include "util_posix.h"
 #include "proxgui.h"
 #include "cmdmain.h"
@@ -26,7 +27,7 @@
 #include "cmdparser.h"
 #include "cmdhw.h"
 #include "whereami.h"
 #include "cmdparser.h"
 #include "cmdhw.h"
 #include "whereami.h"
-
+#include "comms.h"
 
 void
 #ifdef __has_attribute
 
 void
 #ifdef __has_attribute
@@ -35,18 +36,12 @@ __attribute__((force_align_arg_pointer))
 #endif
 #endif
 main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) {
 #endif
 #endif
 main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) {
-       receiver_arg conn;
        char *cmd = NULL;
        char *cmd = NULL;
-       pthread_t reader_thread;
        bool execCommand = (script_cmd != NULL);
        bool stdinOnPipe = !isatty(STDIN_FILENO);
 
        bool execCommand = (script_cmd != NULL);
        bool stdinOnPipe = !isatty(STDIN_FILENO);
 
-       memset(&conn, 0, sizeof(receiver_arg));
-
        if (usb_present) {
        if (usb_present) {
-               conn.run = true;
                SetOffline(false);
                SetOffline(false);
-               pthread_create(&reader_thread, NULL, &uart_receiver, &conn);
                // cache Version information now:
                CmdVersion(NULL);
        } else {
                // cache Version information now:
                CmdVersion(NULL);
        } else {
@@ -138,8 +133,7 @@ main_loop(char *script_cmds_file, char *script_cmd, bool usb_present) {
        write_history(".history");
 
        if (usb_present) {
        write_history(".history");
 
        if (usb_present) {
-               conn.run = false;
-               pthread_join(reader_thread, NULL);
+               CloseProxmark();
        }
        
        if (script_file) {
        }
        
        if (script_file) {
@@ -294,7 +288,7 @@ int main(int argc, char* argv[]) {
        set_my_executable_path();
 
        // try to open USB connection to Proxmark
        set_my_executable_path();
 
        // try to open USB connection to Proxmark
-       usb_present = OpenProxmark(argv[1], waitCOMPort, 20);
+       usb_present = OpenProxmark(argv[1], waitCOMPort, 20, false);
 
 #ifdef HAVE_GUI
 #ifdef _WIN32
 
 #ifdef HAVE_GUI
 #ifdef _WIN32
index c6185c436457807c1adf4e9c08a8a9f2748d623b..86d09bc00e875bfd125d59e21054b0c1ad56f0ac 100644 (file)
@@ -20,7 +20,6 @@
 extern "C" {
 #endif
 
 extern "C" {
 #endif
 
-void SendCommand(UsbCommand *c);
 const char *get_my_executable_path(void);
 const char *get_my_executable_directory(void);
 void main_loop(char *script_cmds_file, char *script_cmd, bool usb_present);
 const char *get_my_executable_path(void);
 const char *get_my_executable_directory(void);
 void main_loop(char *script_cmds_file, char *script_cmd, bool usb_present);
index 0c761cb2e91c21ff4a78ff0000b9bce051dd8e67..e73c7138930e4734977f81c5ba3dd086b3e2e04c 100644 (file)
@@ -15,6 +15,7 @@
 #include <lualib.h>
 #include <lauxlib.h>
 #include "proxmark3.h"
 #include <lualib.h>
 #include <lauxlib.h>
 #include "proxmark3.h"
+#include "comms.h"
 #include "usb_cmd.h"
 #include "cmdmain.h"
 #include "util.h"
 #include "usb_cmd.h"
 #include "cmdmain.h"
 #include "util.h"
Impressum, Datenschutz