usbtest.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * All rights reserved. 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met: 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Redistributions of source code must retain the above copyright 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer in 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the documentation and/or other materials provided with the 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distribution. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE. 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/time.h> 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "usb.h" 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic unsigned arg_size = 4096; 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic unsigned arg_count = 4096; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectlong long NOW(void) 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timeval tv; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gettimeofday(&tv, 0); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (((long long) tv.tv_sec) * ((long long) 1000000)) + 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (((long long) tv.tv_usec)); 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint printifc(usb_ifc_info *info) 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("dev: csp=%02x/%02x/%02x v=%04x p=%04x ", 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info->dev_class, info->dev_subclass, info->dev_protocol, 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info->dev_vendor, info->dev_product); 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("ifc: csp=%02x/%02x/%02x%s%s\n", 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info->ifc_class, info->ifc_subclass, info->ifc_protocol, 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info->has_bulk_in ? " in" : "", 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project info->has_bulk_out ? " out" : ""); 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint match_null(usb_ifc_info *info) 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->dev_vendor != 0x18d1) return -1; 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_class != 0xff) return -1; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_subclass != 0xfe) return -1; 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_protocol != 0x01) return -1; 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint match_zero(usb_ifc_info *info) 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->dev_vendor != 0x18d1) return -1; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_class != 0xff) return -1; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_subclass != 0xfe) return -1; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_protocol != 0x02) return -1; 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint match_loop(usb_ifc_info *info) 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->dev_vendor != 0x18d1) return -1; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_class != 0xff) return -1; 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_subclass != 0xfe) return -1; 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(info->ifc_protocol != 0x03) return -1; 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint test_null(usb_handle *usb) 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned char buf[4096]; 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(buf, 0xee, 4096); 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long long t0, t1; 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t0 = NOW(); 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 0; i < arg_count; i++) { 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(usb_write(usb, buf, arg_size) != arg_size) { 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"write failed (%s)\n", strerror(errno)); 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t1 = NOW(); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%d bytes in %lld uS\n", arg_count * arg_size, (t1 - t0)); 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint test_zero(usb_handle *usb) 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned char buf[4096]; 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long long t0, t1; 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t0 = NOW(); 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 0; i < arg_count; i++) { 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(usb_read(usb, buf, arg_size) != arg_size) { 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"read failed (%s)\n", strerror(errno)); 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t1 = NOW(); 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%d bytes in %lld uS\n", arg_count * arg_size, (t1 - t0)); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *cmd; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ifc_match_func match; 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int (*test)(usb_handle *usb); 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *help; 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} tests[] = { 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "list", printifc, 0, "list interfaces" }, 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "send", match_null, test_null, "send to null interface" }, 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "recv", match_zero, test_zero, "recv from zero interface" }, 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { "loop", match_loop, 0, "exercise loopback interface" }, 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project {}, 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint usage(void) 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"usage: usbtest <testname>\n\navailable tests:\n"); 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 0; tests[i].cmd; i++) { 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr," %-8s %s\n", tests[i].cmd, tests[i].help); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint process_args(int argc, char **argv) 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc-- > 0) { 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *arg = *argv++; 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strncmp(arg,"count=",6)) { 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project arg_count = atoi(arg + 6); 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strncmp(arg,"size=",5)) { 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project arg_size = atoi(arg + 5); 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"unknown argument: %s\n", arg); 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(arg_count == 0) { 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"count may not be zero\n"); 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(arg_size > 4096) { 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"size may not be greater than 4096\n"); 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint main(int argc, char **argv) 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb_handle *usb; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc < 2) 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc > 2) { 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(process_args(argc - 2, argv + 2)) 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 0; tests[i].cmd; i++) { 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[1], tests[i].cmd)) { 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usb = usb_open(tests[i].match); 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tests[i].test) { 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(usb == 0) { 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"usbtest: %s: could not find interface\n", 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tests[i].cmd); 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tests[i].test(usb)) { 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"usbtest: %s: FAIL\n", tests[i].cmd); 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"usbtest: %s: OKAY\n", tests[i].cmd); 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return usage(); 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 213