summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openpcd/opcd_test/opcd_test.c8
-rw-r--r--openpcd/opcd_test/opcd_usb.c34
-rw-r--r--openpcd/opcd_test/opcd_usb.h1
3 files changed, 42 insertions, 1 deletions
diff --git a/openpcd/opcd_test/opcd_test.c b/openpcd/opcd_test/opcd_test.c
index 7b58aca..2aa1753 100644
--- a/openpcd/opcd_test/opcd_test.c
+++ b/openpcd/opcd_test/opcd_test.c
@@ -74,6 +74,7 @@ static struct option opts[] = {
{ "fifo-read", 1, 0, 'R' },
{ "set-bits", 1, 0, 's' },
{ "clear-bits", 1, 0, 'c' },
+ { "usb-perf", 1, 0, 'u' },
{ "help", 0, 0, 'h'},
};
@@ -91,7 +92,7 @@ int main(int argc, char **argv)
while (1) {
int option_index = 0;
- c = getopt_long(argc, argv, "l:r:w:R:W:s:c:h?", opts,
+ c = getopt_long(argc, argv, "l:r:w:R:W:s:c:h?u:", opts,
&option_index);
if (c == -1)
@@ -149,6 +150,11 @@ int main(int argc, char **argv)
exit(2);
opcd_send_command(od, OPENPCD_CMD_REG_BITS_CLEAR, i, j, 0, NULL);
break;
+ case 'u':
+ if (get_number(optarg, 1, 255, &i) < 0)
+ exit(2);
+ opcd_usbperf(od, i);
+ break;
case 'h':
case '?':
print_help();
diff --git a/openpcd/opcd_test/opcd_usb.c b/openpcd/opcd_test/opcd_usb.c
index 9ac5263..00ee3d2 100644
--- a/openpcd/opcd_test/opcd_usb.c
+++ b/openpcd/opcd_test/opcd_usb.c
@@ -20,6 +20,8 @@
#include <unistd.h>
#include <stdio.h>
#include <string.h>
+#include <time.h>
+#include <sys/time.h>
#include <sys/types.h>
@@ -199,3 +201,35 @@ int opcd_send_command(struct opcd_handle *od, u_int8_t cmd,
return ret;
}
+
+int opcd_usbperf(struct opcd_handle *od, unsigned int frames)
+{
+ int i;
+ char buf[256*64];
+ struct timeval tv_start, tv_stop;
+ unsigned int num_xfer = 0;
+ unsigned int diff_msec;
+ unsigned int transfers = 255;
+
+ printf("starting DATA IN performance test (%u frames of 64 bytes)\n",
+ frames);
+ opcd_send_command(od, OPENPCD_CMD_USBTEST_IN, transfers, frames, 0, NULL);
+ gettimeofday(&tv_start, NULL);
+ for (i = 0; i < transfers; i++) {
+ int ret;
+ ret = ausb_bulk_read(od->hdl, OPCD_IN_EP, buf, sizeof(buf), 0);
+ if (ret < 0) {
+ fprintf(stderr, "error receiving data in transaction\n");
+ return ret;
+ }
+ num_xfer += ret;
+ }
+ gettimeofday(&tv_stop, NULL);
+ diff_msec = (tv_stop.tv_sec - tv_start.tv_sec)*1000;
+ diff_msec += (tv_stop.tv_usec - tv_start.tv_usec)/1000;
+
+ printf("%u transfers (total %u bytes) in %u miliseconds => %u bytes/sec\n",
+ i, num_xfer, diff_msec, (num_xfer*1000)/diff_msec);
+
+ return 0;
+}
diff --git a/openpcd/opcd_test/opcd_usb.h b/openpcd/opcd_test/opcd_usb.h
index 953f983..e9698f0 100644
--- a/openpcd/opcd_test/opcd_usb.h
+++ b/openpcd/opcd_test/opcd_usb.h
@@ -19,5 +19,6 @@ extern int opcd_recv_reply(struct opcd_handle *od, char *buf, int len);
extern int opcd_send_command(struct opcd_handle *od, u_int8_t cmd,
u_int8_t reg, u_int8_t val, u_int16_t len,
const unsigned char *data);
+extern int opcd_usbperf(struct opcd_handle *od, unsigned int frames);
#endif
personal git repositories of Harald Welte. Your mileage may vary