Merge changes from github.com/xmos/usb_audio_testing/dfu/OSX/xmosdfu.cpp

This was merge from commit 74c206628de79230f3f9191361fe5fcfa3058e87 of
usb_audio_testing.
This commit is contained in:
Sam Chesney
2017-06-15 14:32:12 +01:00
parent 22c312ffb4
commit b0d69e12b1

View File

@@ -6,23 +6,21 @@
/* the device's vendor and product id */ /* the device's vendor and product id */
#define XMOS_VID 0x20b1 #define XMOS_VID 0x20b1
#define XMOS_XCORE_AUDIO_AUDIO2_PID 0x3066 typedef struct device_pid_t {
#define XMOS_L1_AUDIO2_PID 0x0002 const char *device_name;
#define XMOS_L1_AUDIO1_PID 0x0003 unsigned int pid;
#define XMOS_L2_AUDIO2_PID 0x0004 } device_pid_t;
#define XMOS_SU1_AUDIO2_PID 0x0008
#define XMOS_U8_MFA_AUDIO2_PID 0x000A
#define XMOS_SMP_AUDIO2_PID 0x0010
#define XMOS_SMP_AUDIO1_PID 0x0011
unsigned short pidList[] = {XMOS_XCORE_AUDIO_AUDIO2_PID, device_pid_t pidList[] = {
XMOS_L1_AUDIO2_PID, { "XMOS_XCORE_AUDIO_AUDIO2_PID", 0x3066},
XMOS_L1_AUDIO1_PID, { "XMOS_L1_AUDIO2_PID", 0x0002},
XMOS_L2_AUDIO2_PID, { "XMOS_L1_AUDIO1_PID", 0x0003},
XMOS_SU1_AUDIO2_PID, { "XMOS_L2_AUDIO2_PID", 0x0004},
XMOS_U8_MFA_AUDIO2_PID, { "XMOS_SU1_AUDIO2_PID", 0x0008},
XMOS_SMP_AUDIO1_PID, { "XMOS_U8_MFA_AUDIO2_PID", 0x000A},
XMOS_SMP_AUDIO2_PID}; { "XMOS_SMP_AUDIO2_PID", 0x0010},
{ "XMOS_SMP_AUDIO1_PID", 0x0011}
};
unsigned int XMOS_DFU_IF = 0; unsigned int XMOS_DFU_IF = 0;
@@ -48,14 +46,18 @@ unsigned int XMOS_DFU_IF = 0;
static libusb_device_handle *devh = NULL; static libusb_device_handle *devh = NULL;
static int find_xmos_device(unsigned int id, unsigned int list) static int find_xmos_device(unsigned int id, unsigned int pid, unsigned int list)
{ {
libusb_device *dev; libusb_device *dev;
libusb_device **devs; libusb_device **devs;
int i = 0; int i = 0;
int found = 0; int found = 0;
libusb_get_device_list(NULL, &devs); size_t count = libusb_get_device_list(NULL, &devs);
if ((int)count < 0) {
printf("ERROR: get_device_list returned %d\n", (int)count);
exit(1);
}
while ((dev = devs[i++]) != NULL) while ((dev = devs[i++]) != NULL)
{ {
@@ -66,13 +68,9 @@ static int find_xmos_device(unsigned int id, unsigned int list)
if(desc.idVendor == XMOS_VID) if(desc.idVendor == XMOS_VID)
{ {
for(int j = 0; j < sizeof(pidList)/sizeof(unsigned short); j++) if (desc.idProduct == pid && !list)
{ {
if(desc.idProduct == pidList[j] && !list) foundDev = 1;
{
foundDev = 1;
break;
}
} }
} }
@@ -119,18 +117,22 @@ static int find_xmos_device(unsigned int id, unsigned int list)
int xmos_dfu_resetdevice(void) { int xmos_dfu_resetdevice(void) {
libusb_control_transfer(devh, DFU_REQUEST_TO_DEV, XMOS_DFU_RESETDEVICE, 0, 0, NULL, 0, 0); libusb_control_transfer(devh, DFU_REQUEST_TO_DEV, XMOS_DFU_RESETDEVICE, 0, 0, NULL, 0, 0);
return 0;
} }
int xmos_dfu_revertfactory(void) { int xmos_dfu_revertfactory(void) {
libusb_control_transfer(devh, DFU_REQUEST_TO_DEV, XMOS_DFU_REVERTFACTORY, 0, 0, NULL, 0, 0); libusb_control_transfer(devh, DFU_REQUEST_TO_DEV, XMOS_DFU_REVERTFACTORY, 0, 0, NULL, 0, 0);
return 0;
} }
int xmos_dfu_resetintodfu(unsigned int interface) { int xmos_dfu_resetintodfu(unsigned int interface) {
libusb_control_transfer(devh, DFU_REQUEST_TO_DEV, XMOS_DFU_RESETINTODFU, 0, interface, NULL, 0, 0); libusb_control_transfer(devh, DFU_REQUEST_TO_DEV, XMOS_DFU_RESETINTODFU, 0, interface, NULL, 0, 0);
return 0;
} }
int xmos_dfu_resetfromdfu(unsigned int interface) { int xmos_dfu_resetfromdfu(unsigned int interface) {
libusb_control_transfer(devh, DFU_REQUEST_TO_DEV, XMOS_DFU_RESETFROMDFU, 0, interface, NULL, 0, 0); libusb_control_transfer(devh, DFU_REQUEST_TO_DEV, XMOS_DFU_RESETFROMDFU, 0, interface, NULL, 0, 0);
return 0;
} }
int dfu_detach(unsigned int interface, unsigned int timeout) { int dfu_detach(unsigned int interface, unsigned int timeout) {
@@ -287,10 +289,56 @@ int read_dfu_image(char *file) {
} }
fclose(outFile); fclose(outFile);
return 0;
}
static void print_device_list(FILE *file, const char *indent) {
for (int i = 0; i < sizeof(pidList)/sizeof(pidList[0]); i++) {
fprintf(file, "%s%-30s (0x%0x)\n", indent, pidList[i].device_name, pidList[i].pid);
}
}
static void print_usage(const char *program_name, const char *error_msg) {
fprintf(stderr, "ERROR: %s\n\n", error_msg);
fprintf(stderr, "Usage:\n");
fprintf(stderr, " %s --listdevices\n", program_name);
fprintf(stderr, " %s DEVICE_PID COMMAND\n", program_name);
fprintf(stderr, " Where DEVICE_PID can be a hex value or a name from:\n");
print_device_list(stderr, " ");
fprintf(stderr, " And COMMAND is one of:\n");
fprintf(stderr, " --download <firmware> : install a new firmware\n");
fprintf(stderr, " --upload <firmware> : extract a firmware image\n");
fprintf(stderr, " --revertfactory : revert to the factory image\n");
fprintf(stderr, " --savecustomstate : \n");
fprintf(stderr, " --restorecustomstate : \n");
exit(1);
}
static unsigned int select_pid(char *device_pid) {
// Try interpreting the name as a hex value
char * endptr = device_pid;
int pid = strtol(device_pid, &endptr, 16);
if (endptr != device_pid && *endptr == '\0') {
return pid;
}
// Otherwise do a lookup of names
for (int i = 0; i < sizeof(pidList)/sizeof(pidList[0]); i++) {
if (strcmp(device_pid, pidList[i].device_name) == 0) {
return pidList[i].pid;
}
}
fprintf(stderr, "Failed to find device '%s', should have been one of:\n", device_pid);
print_device_list(stderr, " ");
return 0;
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
int r = 1;
unsigned char dfuState = 0; unsigned char dfuState = 0;
unsigned char nextDfuState = 0; unsigned char nextDfuState = 0;
unsigned int timeout = 0; unsigned int timeout = 0;
@@ -305,65 +353,67 @@ int main(int argc, char **argv) {
char *firmware_filename = NULL; char *firmware_filename = NULL;
if (argc < 2) { const char *program_name = argv[0];
fprintf(stderr, "No options passed to dfu application\n");
return -1;
}
if (strcmp(argv[1], "--download") == 0) { int r = libusb_init(NULL);
if (argv[2]) {
firmware_filename = argv[2];
} else {
fprintf(stderr, "No filename specified for download option\n");
return -1;
}
download = 1;
} else if (strcmp(argv[1], "--upload") == 0) {
if (argv[2]) {
firmware_filename = argv[2];
} else {
fprintf(stderr, "No filename specified for upload option\n");
return -1;
}
upload = 1;
} else if (strcmp(argv[1], "--revertfactory") == 0) {
revert = 1;
}
else if(strcmp(argv[1], "--savecustomstate") == 0)
{
save = 1;
}
else if(strcmp(argv[1], "--restorecustomstate") == 0)
{
restore = 1;
}
else if(strcmp(argv[1], "--listdevices") == 0)
{
listdev = 1;
}
else {
fprintf(stderr, "Invalid option passed to dfu application\n");
return -1;
}
r = libusb_init(NULL);
if (r < 0) { if (r < 0) {
fprintf(stderr, "failed to initialise libusb\n"); fprintf(stderr, "failed to initialise libusb\n");
return -1; return -1;
} }
if (argc == 2) {
if (strcmp(argv[1], "--listdevices") == 0) {
find_xmos_device(0, 0, 1);
return 0;
}
print_usage(program_name, "Not enough options passed to dfu application");
}
if (argc < 3) {
print_usage(program_name, "Not enough options passed to dfu application");
}
char *device_pid = argv[1];
char *command = argv[2];
if (strcmp(command, "--download") == 0) {
if (argc < 4) {
print_usage(program_name, "No filename specified for download option");
}
firmware_filename = argv[3];
download = 1;
} else if (strcmp(command, "--upload") == 0) {
if (argc < 4) {
print_usage(program_name, "No filename specified for upload option");
}
firmware_filename = argv[3];
upload = 1;
} else if (strcmp(command, "--revertfactory") == 0) {
revert = 1;
}
else if(strcmp(command, "--savecustomstate") == 0)
{
save = 1;
}
else if(strcmp(command, "--restorecustomstate") == 0)
{
restore = 1;
}
else {
print_usage(program_name, "Invalid option passed to dfu application");
}
unsigned int pid = select_pid(device_pid);
if (pid == 0) {
return -1;
}
//#define START_IN_DFU 1 //#define START_IN_DFU 1
#ifndef START_IN_DFU #ifndef START_IN_DFU
r = find_xmos_device(0, listdev); r = find_xmos_device(0, pid, 0);
if (r < 0) if (r < 0)
{ {
if(!listdev) fprintf(stderr, "Could not find/open device\n");
{ return -1;
fprintf(stderr, "Could not find/open device\n");
return -1;
}
return 0;
} }
r = libusb_claim_interface(devh, XMOS_DFU_IF); r = libusb_claim_interface(devh, XMOS_DFU_IF);
@@ -401,7 +451,7 @@ int main(int argc, char **argv) {
// NOW IN DFU APPLICATION MODE // NOW IN DFU APPLICATION MODE
r = find_xmos_device(0, 0); r = find_xmos_device(0, pid, 0);
if (r < 0) { if (r < 0) {
fprintf(stderr, "Could not find/open device\n"); fprintf(stderr, "Could not find/open device\n");
return -1; return -1;