Skip to content

Instantly share code, notes, and snippets.

@lurch
Created October 25, 2017 10:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lurch/b7006507cc5885ebf9b8b1b1022bf356 to your computer and use it in GitHub Desktop.
Save lurch/b7006507cc5885ebf9b8b1b1022bf356 to your computer and use it in GitHub Desktop.
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