mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-19 21:03:23 -07:00
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:
parent
9b4661c53b
commit
ad939de501
50 changed files with 274 additions and 248 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue