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