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
|