USB comms: part 4 towards @micolous PR #463

* 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
This commit is contained in:
pwpiwi 2018-06-03 14:25:20 +02:00 committed by GitHub
commit ad939de501
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
50 changed files with 274 additions and 248 deletions

View file

@ -20,12 +20,7 @@
#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)
@ -42,22 +37,6 @@ static const uint8_t elf_ident[] = {
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
@ -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
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;
@ -295,7 +274,7 @@ static int get_proxmark_state(uint32_t *state)
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
@ -355,17 +334,16 @@ static int enter_bootloader(char *serial_port_name)
}
msleep(100);
CloseProxmark(serial_port_name);
CloseProxmark();
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");
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");
@ -375,7 +353,7 @@ static int enter_bootloader(char *serial_port_name)
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;
@ -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);
UsbCommand c;
UsbCommand c;
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