testugen2.c
author darius@Inchoate
Mon, 19 Jan 2009 22:54:19 +1030
changeset 71 553c061fda7c
permissions -rw-r--r--
Keep the newer GCC happy.
     1 #include <sys/types.h>
     2 #include <sys/ioctl.h>
     3 #include <dev/usb/usb.h>
     4 #include <sys/errno.h>
     5 #include <sys/uio.h>
     6 #include <unistd.h>
     7 #include <fcntl.h>
     8 #include <stdio.h>
     9 #include <string.h>
    10 #include <stdlib.h>
    11 
    12 /* Return codes for OWFirst()/OWNext() */
    13 #define OW_BADWIRE		-3
    14 #define OW_BADCRC		-2
    15 #define OW_NOPRESENCE		-1
    16 #define OW_NOMODULES		0
    17 #define OW_FOUND		1
    18 
    19 void	docmd(int fd, uint8_t *buffer, int rlen, int wlen);
    20 
    21 int
    22 main(int argc, char **argv) {
    23     int		endptfd, i;
    24     char	*endptname = "/dev/ugen0.2";
    25     uint8_t	buffer[9];
    26     
    27     if (argc < 2) {
    28 	fprintf(stderr,
    29 		"Bad usage:\n"
    30 		"\t%s cmd\n", argv[0]);
    31 	exit(1);
    32     }
    33     
    34     if ((endptfd = open(endptname, O_RDWR)) == -1) {
    35 	fprintf(stderr, "Unable to open %s: %s\n", endptname, strerror(errno));
    36 	exit(1);
    37     }
    38 
    39     i = 1;
    40     if (ioctl(endptfd, USB_SET_SHORT_XFER, &i) == -1) {
    41 	fprintf(stderr, "Unable to set short xfer on end point 1: %s\n", strerror(errno));
    42 	exit(1);
    43     }
    44     
    45     bzero(buffer, 9);
    46 
    47     if (!strcmp(argv[1], "reset")) {
    48 	buffer[0] = 0x00;
    49 	docmd(endptfd, buffer, 1, 1);
    50 	printf("OWTouchReset() reported %d\n", buffer[0]);
    51     } else if (!strcmp(argv[1], "first")) {
    52 	buffer[0] = 0x01;
    53 	docmd(endptfd, buffer, 1, 9);
    54 	printf("OWFirst() = %d\n", buffer[0]);
    55 	if (buffer[0] == OW_FOUND)
    56 	    printf("Found module %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
    57 		   buffer[1], buffer[2], buffer[3], buffer[4],
    58 		   buffer[5], buffer[6], buffer[7], buffer[8]);
    59     } else if (!strcmp(argv[1], "next")) {
    60 	if (scanf(argv[2], "%hh:%hh:%hh:%hh:%hh:%hh:%hh:%hh", &buffer[1], &buffer[2], &buffer[3],
    61 		  &buffer[4], &buffer[5], &buffer[6], &buffer[7], &buffer[8]) != 8) {
    62 	    fprintf(stderr, "Unable to parse ROM ID\n");
    63 	    exit(1);
    64 	}
    65 	buffer[0] = 0x02;
    66 	fprintf(stderr, "About to OWNext()\n");
    67 	docmd(endptfd, buffer, 9, 9);
    68 	fprintf(stderr, "OWNext() = %d\n", buffer[0]);
    69 	if (buffer[0] == OW_FOUND)
    70 	    printf("Found module %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
    71 		   buffer[1], buffer[2], buffer[3], buffer[4],
    72 		   buffer[5], buffer[6], buffer[7], buffer[8]);
    73 	
    74     } else if (!strcmp(argv[1], "scan")) {
    75 	buffer[0] = 0x00;
    76 	fprintf(stderr, "About to reset\n");
    77 	docmd(endptfd, buffer, 1, 1);
    78 	printf("OWReset() reported %d\n", buffer[0]);
    79 	if (buffer[0] != 0)
    80 	    exit(1);
    81 	
    82 	bzero(buffer, 9);
    83 	buffer[0] = 0x01;
    84 	fprintf(stderr, "About to OWFirst()\n");
    85 	docmd(endptfd, buffer, 1, 9);
    86 	printf("OWFirst() = %d\n", buffer[0]);
    87 
    88 	do {
    89 	    switch (buffer[0]) {
    90 		case OW_BADWIRE:
    91 		    printf("Bad wiring, either bus is held low, or a presence pulse was detected but no module found\n");
    92 		    break;
    93 		    
    94 		case OW_NOPRESENCE:
    95 		    printf("No presence pulse detected\n");
    96 		    break;
    97 		    
    98 		case OW_BADCRC:
    99 		    printf("Bad CRC\n");
   100 		    break;
   101 		    
   102 		case OW_NOMODULES:
   103 		case OW_FOUND:
   104 		    break;
   105 		    
   106 		default:
   107 		    printf("Unknown return code %d\n", buffer[0]);
   108 		    break;
   109 	    }
   110 	    
   111 	    if (buffer[0] != OW_FOUND) {
   112 		printf("No more modules\n");
   113 		break;
   114 	    } else {
   115 		printf("Found module %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
   116 		       buffer[1], buffer[2], buffer[3], buffer[4],
   117 		       buffer[5], buffer[6], buffer[7], buffer[8]);
   118 	    }
   119 	    
   120 	    buffer[0] = 0x02;
   121 	    fprintf(stderr, "About to OWNext()\n");
   122 	    docmd(endptfd, buffer, 9, 9);
   123 	} while(1);
   124     } else {
   125 	printf("Unknown command: %s\n", argv[1]);
   126 	exit(1);
   127     }
   128     
   129     
   130     exit(0);
   131 }
   132 
   133 void
   134 docmd(int fd, uint8_t *buffer, int wlen, int rlen) {
   135     char blah[20];
   136     int	i;
   137 
   138     fprintf(stderr, "About to write\n");
   139     gets(blah);
   140 
   141     if ((i = write(fd, buffer, wlen)) == -1) {
   142 	fprintf(stderr, "Unable to write end point: %s\n", strerror(errno));
   143 	exit(1);
   144     }
   145     if (i != wlen)
   146 	printf("Warning, only wrote %d of %d bytes\n", i, wlen);
   147     
   148     fprintf(stderr, "About to read\n");
   149     gets(blah);
   150 
   151     if ((i = read(fd, buffer, rlen)) == -1) {
   152 	fprintf(stderr, "Unable to read from end point: %s\n", strerror(errno));
   153 	exit(1);
   154     }
   155     if (i != rlen)
   156 	printf("Warning, only read %d of %d bytes\n", i, wlen);
   157 }
   158 
   159