Skip to content

Commit f5ecd97

Browse files
authored
USB comm: prepare for @micolous change (PR#463) (#587)
* move communication related code from proxmark3.c and cmdmain.c to new file comms.c * replace byte_t by uint8_t in uart_posix.c and uart_win32.c * move OpenProxmark() and CloseProxmark() from flasher.c to flash.c * move print_lock mutex including initializer to ui.c * minor changes in printing help texts * no changes in comms functionality yet
1 parent 3bcc4d7 commit f5ecd97

16 files changed

+384
-307
lines changed

client/Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ CMDSRCS = crapto1/crapto1.c\
170170
cmdscript.c\
171171
pm3_binlib.c\
172172
pm3_bitlib.c\
173-
protocols.c
173+
protocols.c\
174+
comms.c
174175

175176
cpu_arch = $(shell uname -m)
176177
ifneq ($(findstring 86, $(cpu_arch)), )

client/cmdmain.c

+1-151
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,6 @@ unsigned int current_command = CMD_UNKNOWN;
3434
static int CmdHelp(const char *Cmd);
3535
static int CmdQuit(const char *Cmd);
3636

37-
//For storing command that are received from the device
38-
#define CMD_BUFFER_SIZE 50
39-
static UsbCommand cmdBuffer[CMD_BUFFER_SIZE];
40-
//Points to the next empty position to write to
41-
static int cmd_head;//Starts as 0
42-
//Points to the position of the last unread command
43-
static int cmd_tail;//Starts as 0
44-
// to lock cmdBuffer operations from different threads
45-
static pthread_mutex_t cmdBufferMutex = PTHREAD_MUTEX_INITIALIZER;
4637

4738
static command_t CommandTable[] =
4839
{
@@ -61,6 +52,7 @@ command_t* getTopLevelCommandTable()
6152
{
6253
return CommandTable;
6354
}
55+
6456
int CmdHelp(const char *Cmd)
6557
{
6658
CmdsHelp(CommandTable);
@@ -72,113 +64,6 @@ int CmdQuit(const char *Cmd)
7264
return 99;
7365
}
7466

75-
/**
76-
* @brief This method should be called when sending a new command to the pm3. In case any old
77-
* responses from previous commands are stored in the buffer, a call to this method should clear them.
78-
* A better method could have been to have explicit command-ACKS, so we can know which ACK goes to which
79-
* operation. Right now we'll just have to live with this.
80-
*/
81-
void clearCommandBuffer()
82-
{
83-
//This is a very simple operation
84-
pthread_mutex_lock(&cmdBufferMutex);
85-
cmd_tail = cmd_head;
86-
pthread_mutex_unlock(&cmdBufferMutex);
87-
}
88-
89-
/**
90-
* @brief storeCommand stores a USB command in a circular buffer
91-
* @param UC
92-
*/
93-
void storeCommand(UsbCommand *command)
94-
{
95-
pthread_mutex_lock(&cmdBufferMutex);
96-
if( ( cmd_head+1) % CMD_BUFFER_SIZE == cmd_tail)
97-
{
98-
//If these two are equal, we're about to overwrite in the
99-
// circular buffer.
100-
PrintAndLog("WARNING: Command buffer about to overwrite command! This needs to be fixed!");
101-
}
102-
//Store the command at the 'head' location
103-
UsbCommand* destination = &cmdBuffer[cmd_head];
104-
memcpy(destination, command, sizeof(UsbCommand));
105-
106-
cmd_head = (cmd_head +1) % CMD_BUFFER_SIZE; //increment head and wrap
107-
pthread_mutex_unlock(&cmdBufferMutex);
108-
}
109-
110-
111-
/**
112-
* @brief getCommand gets a command from an internal circular buffer.
113-
* @param response location to write command
114-
* @return 1 if response was returned, 0 if nothing has been received
115-
*/
116-
int getCommand(UsbCommand* response)
117-
{
118-
pthread_mutex_lock(&cmdBufferMutex);
119-
//If head == tail, there's nothing to read, or if we just got initialized
120-
if(cmd_head == cmd_tail){
121-
pthread_mutex_unlock(&cmdBufferMutex);
122-
return 0;
123-
}
124-
//Pick out the next unread command
125-
UsbCommand* last_unread = &cmdBuffer[cmd_tail];
126-
memcpy(response, last_unread, sizeof(UsbCommand));
127-
//Increment tail - this is a circular buffer, so modulo buffer size
128-
cmd_tail = (cmd_tail +1 ) % CMD_BUFFER_SIZE;
129-
pthread_mutex_unlock(&cmdBufferMutex);
130-
return 1;
131-
}
132-
133-
134-
/**
135-
* Waits for a certain response type. This method waits for a maximum of
136-
* ms_timeout milliseconds for a specified response command.
137-
*@brief WaitForResponseTimeout
138-
* @param cmd command to wait for
139-
* @param response struct to copy received command into.
140-
* @param ms_timeout
141-
* @return true if command was returned, otherwise false
142-
*/
143-
bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeout, bool show_warning) {
144-
145-
UsbCommand resp;
146-
147-
if (response == NULL) {
148-
response = &resp;
149-
}
150-
151-
uint64_t start_time = msclock();
152-
153-
// Wait until the command is received
154-
while (true) {
155-
while(getCommand(response)) {
156-
if(response->cmd == cmd){
157-
return true;
158-
}
159-
}
160-
if (msclock() - start_time > ms_timeout) {
161-
break;
162-
}
163-
if (msclock() - start_time > 2000 && show_warning) {
164-
PrintAndLog("Waiting for a response from the proxmark...");
165-
PrintAndLog("You can cancel this operation by pressing the pm3 button");
166-
show_warning = false;
167-
}
168-
}
169-
return false;
170-
}
171-
172-
173-
bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout) {
174-
return WaitForResponseTimeoutW(cmd, response, ms_timeout, true);
175-
}
176-
177-
bool WaitForResponse(uint32_t cmd, UsbCommand* response) {
178-
return WaitForResponseTimeoutW(cmd, response, -1, true);
179-
}
180-
181-
18267
//-----------------------------------------------------------------------------
18368
// Entry point into our code: called whenever the user types a command and
18469
// then presses Enter, which the full command line that they typed.
@@ -187,38 +72,3 @@ int CommandReceived(char *Cmd) {
18772
return CmdsParse(CommandTable, Cmd);
18873
}
18974

190-
191-
//-----------------------------------------------------------------------------
192-
// Entry point into our code: called whenever we received a packet over USB
193-
// that we weren't necessarily expecting, for example a debug print.
194-
//-----------------------------------------------------------------------------
195-
void UsbCommandReceived(UsbCommand *UC)
196-
{
197-
switch(UC->cmd) {
198-
// First check if we are handling a debug message
199-
case CMD_DEBUG_PRINT_STRING: {
200-
char s[USB_CMD_DATA_SIZE+1];
201-
memset(s, 0x00, sizeof(s));
202-
size_t len = MIN(UC->arg[0],USB_CMD_DATA_SIZE);
203-
memcpy(s,UC->d.asBytes,len);
204-
PrintAndLog("#db# %s", s);
205-
return;
206-
} break;
207-
208-
case CMD_DEBUG_PRINT_INTEGERS: {
209-
PrintAndLog("#db# %08x, %08x, %08x \r\n", UC->arg[0], UC->arg[1], UC->arg[2]);
210-
return;
211-
} break;
212-
213-
case CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K: {
214-
memcpy(sample_buf+(UC->arg[0]),UC->d.asBytes,UC->arg[1]);
215-
return;
216-
} break;
217-
218-
default:
219-
storeCommand(UC);
220-
break;
221-
}
222-
223-
}
224-

client/cmdmain.h

+2-5
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@
1515
#include <stddef.h>
1616
#include "usb_cmd.h"
1717
#include "cmdparser.h"
18+
#include "comms.h"
19+
1820

19-
extern void UsbCommandReceived(UsbCommand *UC);
2021
extern int CommandReceived(char *Cmd);
21-
extern bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeout, bool show_warning);
22-
extern bool WaitForResponseTimeout(uint32_t cmd, UsbCommand* response, size_t ms_timeout);
23-
extern bool WaitForResponse(uint32_t cmd, UsbCommand* response);
24-
extern void clearCommandBuffer();
2522
extern command_t* getTopLevelCommandTable();
2623

2724
#endif

client/cmdparser.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88
// Command parser
99
//-----------------------------------------------------------------------------
1010

11+
#include "cmdparser.h"
12+
1113
#include <stdio.h>
1214
#include <stdlib.h>
1315
#include <string.h>
1416
#include "ui.h"
15-
#include "cmdparser.h"
1617
#include "proxmark3.h"
18+
#include "comms.h"
1719

1820

1921
void CmdsHelp(const command_t Commands[])

0 commit comments

Comments
 (0)