diff options
Diffstat (limited to 'examples/drivertest/commandline/runtest.c')
-rw-r--r-- | examples/drivertest/commandline/runtest.c | 151 |
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; +} |