Created
October 25, 2017 10:39
-
-
Save lurch/b7006507cc5885ebf9b8b1b1022bf356 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/main.c b/main.c | |
index e8e9b59..28475f0 100755 | |
--- a/main.c | |
+++ b/main.c | |
@@ -5,6 +5,22 @@ | |
#include <unistd.h> | |
+#include <sys/time.h> | |
+ | |
+struct timeval starttime, nowtime; | |
+float lastdelta = 0.0; | |
+ | |
+void printelapsed() { | |
+ gettimeofday(&nowtime, NULL); | |
+ float delta = nowtime.tv_sec - starttime.tv_sec + (nowtime.tv_usec / 1000000.0); | |
+ if (lastdelta == 0.0) { | |
+ printf("[%.3f] ", delta); | |
+ } else { | |
+ printf("[%.4f (+%.6f)] ", delta, delta - lastdelta); | |
+ } | |
+ lastdelta = delta; | |
+} | |
+ | |
int signed_boot = 0; | |
int verbose = 0; | |
int loop = 0; | |
@@ -133,24 +149,39 @@ int Initialize_Device(libusb_context ** ctx, libusb_device_handle ** usb_device) | |
return ret; | |
} | |
+#define LIBUSB_MAX_TRANSFER (496 * 1024) | |
+ | |
int ep_write(void *buf, int len, libusb_device_handle * usb_device) | |
{ | |
int a_len = 0; | |
+ int sending, sent, abort = 0; | |
int ret = | |
libusb_control_transfer(usb_device, LIBUSB_REQUEST_TYPE_VENDOR, 0, | |
len & 0xffff, len >> 16, NULL, 0, 1000); | |
if(ret != 0) | |
{ | |
+ printelapsed(); | |
printf("Failed control transfer\n"); | |
return ret; | |
} | |
if(len > 0) | |
{ | |
- ret = libusb_bulk_transfer(usb_device, out_ep, buf, len, &a_len, 100000); | |
- if(verbose) | |
- printf("libusb_bulk_transfer returned %d\n", ret); | |
+ while((abort++ < 200) && (len > 0)) | |
+ { | |
+ sending = len < LIBUSB_MAX_TRANSFER ? len : LIBUSB_MAX_TRANSFER; | |
+ ret = libusb_bulk_transfer(usb_device, 0x01, buf, sending, &sent, 5000); | |
+ if (ret) | |
+ break; | |
+ a_len += sent; | |
+ buf += sent; | |
+ len -= sent; | |
+ } | |
+ if(verbose) { | |
+ printelapsed(); | |
+ printf("libusb_bulk_transfer sent %d bytes; returned %d\n", a_len, ret); | |
+ } | |
} | |
return a_len; | |
@@ -255,7 +286,11 @@ int second_stage_boot(libusb_device_handle *usb_device) | |
return -1; | |
} | |
- if(verbose) printf("Writing %d bytes\n", boot_message.length); | |
+ if(verbose) | |
+ { | |
+ printelapsed(); | |
+ printf("Writing %d bytes\n", boot_message.length); | |
+ } | |
size = ep_write(second_stage_txbuf, boot_message.length, usb_device); | |
if (size != boot_message.length) | |
{ | |
@@ -268,10 +303,12 @@ int second_stage_boot(libusb_device_handle *usb_device) | |
if (size > 0 && retcode == 0) | |
{ | |
+ printelapsed(); | |
printf("Successful read %d bytes \n", size); | |
} | |
else | |
{ | |
+ printelapsed(); | |
printf("Failed : 0x%x", retcode); | |
} | |
@@ -325,7 +362,11 @@ int file_server(libusb_device_handle * usb_device) | |
sleep(1); | |
continue; | |
} | |
- if(verbose) printf("Received message %s: %s\n", message_name[message.command], message.fname); | |
+ if(verbose) | |
+ { | |
+ printelapsed(); | |
+ printf("Received message %s: %s\n", message_name[message.command], message.fname); | |
+ } | |
// Done can also just be null filename | |
if(strlen(message.fname) == 0) | |
@@ -348,7 +389,11 @@ int file_server(libusb_device_handle * usb_device) | |
file_size = ftell(fp); | |
fseek(fp, 0, SEEK_SET); | |
- if(verbose) printf("File size = %d bytes\n", file_size); | |
+ if(verbose) | |
+ { | |
+ printelapsed(); | |
+ printf("File size = %d bytes\n", file_size); | |
+ } | |
int sz = libusb_control_transfer(usb_device, LIBUSB_REQUEST_TYPE_VENDOR, 0, | |
file_size & 0xffff, file_size >> 16, NULL, 0, 1000); | |
@@ -359,7 +404,10 @@ int file_server(libusb_device_handle * usb_device) | |
else | |
{ | |
ep_write(NULL, 0, usb_device); | |
- if(verbose) printf("Cannot open file %s\n", message.fname); | |
+ if(verbose) { | |
+ printelapsed(); | |
+ printf("Cannot open file %s\n", message.fname); | |
+ } | |
break; | |
} | |
break; | |
@@ -370,6 +418,7 @@ int file_server(libusb_device_handle * usb_device) | |
int file_size; | |
void *buf; | |
+ printelapsed(); | |
printf("File read: %s\n", message.fname); | |
fseek(fp, 0, SEEK_END); | |
@@ -379,12 +428,14 @@ int file_server(libusb_device_handle * usb_device) | |
buf = malloc(file_size); | |
if(buf == NULL) | |
{ | |
+ printelapsed(); | |
printf("Failed to allocate buffer for file %s\n", message.fname); | |
return -1; | |
} | |
int read = fread(buf, 1, file_size, fp); | |
if(read != file_size) | |
{ | |
+ printelapsed(); | |
printf("Failed to read from input file\n"); | |
free(buf); | |
return -1; | |
@@ -398,13 +449,18 @@ int file_server(libusb_device_handle * usb_device) | |
if(sz != file_size) | |
{ | |
+ printelapsed(); | |
printf("Failed to write complete file to USB device\n"); | |
return -1; | |
} | |
} | |
else | |
{ | |
- if(verbose) printf("No file %s found\n", message.fname); | |
+ if(verbose) | |
+ { | |
+ printelapsed(); | |
+ printf("No file %s found\n", message.fname); | |
+ } | |
ep_write(NULL, 0, usb_device); | |
} | |
break; | |
@@ -414,11 +470,13 @@ int file_server(libusb_device_handle * usb_device) | |
break; | |
default: | |
+ printelapsed(); | |
printf("Unknown message\n"); | |
return -1; | |
} | |
} | |
+ printelapsed(); | |
printf("Second stage boot server done\n"); | |
return 0; | |
} | |
@@ -498,9 +556,15 @@ int main(int argc, char *argv[]) | |
if(ret == 0) | |
{ | |
libusb_get_device_descriptor(libusb_get_device(usb_device), &desc); | |
+ if (desc.iSerialNumber == 0) | |
+ { | |
+ gettimeofday(&starttime, NULL); | |
+ } | |
- if(verbose) | |
+ if(verbose) { | |
+ printelapsed(); | |
printf("Found serial number %d\n", desc.iSerialNumber); | |
+ } | |
// Make sure we've re-enumerated since the last time | |
if(desc.iSerialNumber == last_serial) | |
@@ -522,11 +586,13 @@ int main(int argc, char *argv[]) | |
last_serial = desc.iSerialNumber; | |
if(desc.iSerialNumber == 0) | |
{ | |
+ printelapsed(); | |
printf("Sending bootcode.bin\n"); | |
second_stage_boot(usb_device); | |
} | |
else | |
{ | |
+ printelapsed(); | |
printf("Second stage boot server\n"); | |
file_server(usb_device); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment