aboutsummaryrefslogtreecommitdiffstats
path: root/examples/drivertest/commandline/runtest.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/drivertest/commandline/runtest.c')
-rw-r--r--examples/drivertest/commandline/runtest.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/examples/drivertest/commandline/runtest.c b/examples/drivertest/commandline/runtest.c
new file mode 100644
index 0000000..c15bb42
--- /dev/null
+++ b/examples/drivertest/commandline/runtest.c
@@ -0,0 +1,151 @@
+/* Name: runtest.c
+ * Author: Christian Starkjohann
+ * Creation Date: 2008-04-10
+ * Tabsize: 4
+ * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
+ * License: GNU GPL v2 (see License.txt) or proprietary (CommercialLicense.txt)
+ * This Revision: $Id$
+ */
+
+/*
+General Description:
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <usb.h> /* this is libusb */
+#include "opendevice.h" /* common code moved to separate module */
+
+#include "../firmware/requests.h" /* custom request numbers */
+#include "../firmware/usbconfig.h" /* device's VID/PID and names */
+
+#define uchar unsigned char
+
+static void hexdump(uchar *buffer, int len, FILE *fp)
+{
+int i;
+
+ for(i = 0; i < len; i++){
+ if(i != 0){
+ if(i % 16 == 0){
+ fprintf(fp, "\n");
+ }else{
+ fprintf(fp, " ");
+ }
+ }
+ fprintf(fp, "%02x", buffer[i]);
+ }
+ if(i != 0)
+ fprintf(fp, "\n");
+}
+
+static void fillBuffer(char *buffer, int len)
+{
+static int type = 0;
+
+ if(type == 0){ /* all 0 */
+ bzero(buffer, len);
+ }else if(type == 1){ /* all 0xff */
+ memset(buffer, 0xff, len);
+ }else{ /* random */
+ int i;
+ for(i = 0; i < len; i++){
+ buffer[i] = random() & 0xff;
+ }
+ }
+ if(++type >= 1000)
+ type = 0;
+}
+
+static int compareBuffers(char *txBuffer, char *rxBuffer, int len)
+{
+int i, rval = 0;
+
+ for(i = 0; i < len; i++){
+ if(rxBuffer[i] != txBuffer[i]){
+ fprintf(stderr, "compare error at index %d: byte is 0x%x instead of 0x%x\n", i, rxBuffer[i], txBuffer[i]);
+ rval = 1;
+ }
+ }
+ if(rval){
+ fprintf(stderr, "txBuffer was:\n");
+ hexdump(txBuffer, len, stderr);
+ fprintf(stderr, "rxBuffer is:\n");
+ hexdump(rxBuffer, len, stderr);
+ }
+ return rval;
+}
+
+int main(int argc, char **argv)
+{
+usb_dev_handle *handle = NULL;
+const uchar rawVid[2] = {USB_CFG_VENDOR_ID}, rawPid[2] = {USB_CFG_DEVICE_ID};
+char vendor[] = {USB_CFG_VENDOR_NAME, 0}, product[] = {USB_CFG_DEVICE_NAME, 0};
+char txBuffer[64], rxBuffer[64];
+int cnt, vid, pid, i, j;
+
+ usb_init();
+ /* compute VID/PID from usbconfig.h so that there is a central source of information */
+ vid = rawVid[1] * 256 + rawVid[0];
+ pid = rawPid[1] * 256 + rawPid[0];
+ /* The following function is in opendevice.c: */
+ if(usbOpenDevice(&handle, vid, vendor, pid, product, NULL, NULL, NULL) != 0){
+ fprintf(stderr, "Could not find USB device \"%s\" with vid=0x%x pid=0x%x\n", product, vid, pid);
+ exit(1);
+ }
+ if(argc > 1 && strcasecmp(argv[1], "osccal") == 0){
+ if(argc > 2){ /* set osccal */
+ int osccal = atoi(argv[2]);
+ printf("setting osccal to %d\n", osccal);
+ cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, CUSTOM_RQ_SET_OSCCAL, osccal, 0, txBuffer, 0, 5000);
+ if(cnt < 0){
+ fprintf(stderr, "\nUSB error setting osccal: %s\n", usb_strerror());
+ }
+ }else{
+ cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, CUSTOM_RQ_GET_OSCCAL, 0, 0, rxBuffer, 1, 5000);
+ if(cnt < 0){
+ fprintf(stderr, "\nUSB error getting osccal: %s\n", usb_strerror());
+ }else{
+ printf("osccal = %d\n", (unsigned char)rxBuffer[0]);
+ }
+ }
+ }else{
+ srandomdev();
+ for(i = 0; i <= 100000; i++){
+ fillBuffer(txBuffer, sizeof(txBuffer));
+ cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, CUSTOM_RQ_SET_DATA, 0, 0, txBuffer, sizeof(txBuffer), 5000);
+ if(cnt < 0){
+ fprintf(stderr, "\nUSB tx error in iteration %d: %s\n", i, usb_strerror());
+ break;
+ }else if(cnt != sizeof(txBuffer)){
+ fprintf(stderr, "\nerror in iteration %d: %d bytes sent instead of %d\n", i, cnt, (int)sizeof(txBuffer));
+ break;
+ }
+ for(j = 0; j < sizeof(rxBuffer); j++){
+ rxBuffer[j] = ~txBuffer[j];
+ }
+ cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, CUSTOM_RQ_GET_DATA, 0, 0, rxBuffer, sizeof(rxBuffer), 5000);
+ if(cnt < 0){
+ fprintf(stderr, "\nUSB rx error in iteration %d: %s\n", i, usb_strerror());
+ break;
+ }else if(cnt != sizeof(txBuffer)){
+ fprintf(stderr, "\nerror in iteration %d: %d bytes received instead of %d\n", i, cnt, (int)sizeof(rxBuffer));
+ break;
+ }
+ if(compareBuffers(txBuffer, rxBuffer, sizeof(rxBuffer))){
+ fprintf(stderr, "\ncompare error in iteration %d.\n", i);
+ break;
+ }
+ if(i != 0 && i % 100 == 0){
+ printf(".");
+ fflush(stdout);
+ if(i % 5000 == 0)
+ printf(" %6d\n", i);
+ }
+ }
+ fprintf(stderr, "\nTest completed.\n");
+ }
+ usb_close(handle);
+ return 0;
+}