This allows to measure the USB data transfer speed for performance
tuning purposes.

Signed-off-by: Siarhei Siamashka <[email protected]>
---
 fel.c | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/fel.c b/fel.c
index d18a1d8..0942deb 100644
--- a/fel.c
+++ b/fel.c
@@ -28,8 +28,10 @@
 #include <ctype.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <stdarg.h>
 #include <errno.h>
 #include <unistd.h>
+#include <sys/time.h>
 
 #include "endian_compat.h"
 
@@ -59,6 +61,17 @@ static const int AW_USB_WRITE = 0x12;
 static int AW_USB_FEL_BULK_EP_OUT;
 static int AW_USB_FEL_BULK_EP_IN;
 static int timeout = 60000;
+static int verbose = 0; /* Makes the 'fel' tool more talkative if non-zero */
+
+static void pr_info(const char *fmt, ...)
+{
+       va_list arglist;
+       if (verbose) {
+               va_start(arglist, fmt);
+               vprintf(fmt, arglist);
+               va_end(arglist);
+       }
+}
 
 void usb_bulk_send(libusb_device_handle *usb, int ep, const void *data, int 
length)
 {
@@ -566,6 +579,14 @@ static int aw_fel_get_endpoint(libusb_device_handle *usb)
        return 0;
 }
 
+/* Less reliable than clock_gettime, but does not require linking with -lrt */
+static double gettime(void)
+{
+       struct timeval tv;
+       gettimeofday(&tv, NULL);
+       return tv.tv_sec + (double)tv.tv_usec / 1000000.;
+}
+
 int main(int argc, char **argv)
 {
        int rc;
@@ -575,7 +596,8 @@ int main(int argc, char **argv)
        assert(rc == 0);
 
        if (argc <= 1) {
-               printf("Usage: %s command arguments... [command...]\n"
+               printf("Usage: %s [options] command arguments... [command...]\n"
+                       "       -v, --verbose                   Verbose 
logging\n"
                        "       hex[dump] address length        Dumps memory 
region in hex\n"
                        "       dump address length             Binary memory 
dump\n"
                        "       exe[cute] address               Call function 
address\n"
@@ -616,6 +638,13 @@ int main(int argc, char **argv)
                exit(1);
        }
 
+       if (argc > 1 && (strcmp(argv[1], "--verbose") == 0 ||
+                        strcmp(argv[1], "-v") == 0)) {
+               verbose = 1;
+               argc -= 1;
+               argv += 1;
+       }
+
        while (argc > 1 ) {
                int skip = 1;
                if (strncmp(argv[1], "hex", 3) == 0 && argc > 3) {
@@ -632,9 +661,16 @@ int main(int argc, char **argv)
                        aw_fel_print_version(handle);
                        skip=1;
                } else if (strcmp(argv[1], "write") == 0 && argc > 3) {
+                       double t1, t2;
                        size_t size;
                        void *buf = load_file(argv[3], &size);
+                       t1 = gettime();
                        aw_fel_write(handle, buf, strtoul(argv[2], NULL, 0), 
size);
+                       t2 = gettime();
+                       if (t2 > t1)
+                               pr_info("Written %.1f KB in %.1f sec (speed: 
%.1f KB/s)\n",
+                                       (double)size / 1000., t2 - t1,
+                                       (double)size / (t2 - t1) / 1000.);
                        free(buf);
                        skip=3;
                } else if (strcmp(argv[1], "read") == 0 && argc > 4) {
-- 
2.0.5

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to