27
+ − 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