usleep is apparently not needed during bulk download - and makes it much faster!
[alphamote.git] / trigger.c
blob1d75fcc3199c27409d5eb1cd8ec3371583ee18b9
1 /* This file is generated with usbsnoop2libusb.pl from a usbsnoop log file. */
2 /* Latest version of the script should be in http://iki.fi/lindi/usb/usbsnoop2libusb.pl */
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <assert.h>
7 #include <signal.h>
8 #include <ctype.h>
9 #include <usb.h>
10 #if 0
11 #include <linux/usbdevice_fs.h>
12 #define LIBUSB_AUGMENT
13 #include "libusb_augment.h"
14 #endif
16 struct usb_dev_handle *devh;
18 void release_usb_device(int dummy) {
19 int ret;
20 ret = usb_release_interface(devh, 0);
21 if (!ret)
22 printf("failed to release interface: %d\n", ret);
23 usb_close(devh);
24 if (!ret)
25 printf("failed to close interface: %d\n", ret);
26 exit(1);
29 struct usb_device *find_device(int vendor, int product) {
30 struct usb_bus *bus;
32 for (bus = usb_get_busses(); bus; bus = bus->next) {
33 struct usb_device *dev;
35 for (dev = bus->devices; dev; dev = dev->next) {
36 if (dev->descriptor.idVendor == vendor
37 && dev->descriptor.idProduct == product)
38 return dev;
41 return NULL;
44 void print_bytes(char *bytes, int len) {
45 int i;
46 if (len > 0) {
47 for (i=0; i<len; i++) {
48 printf("%02x ", (int)((unsigned char)bytes[i]));
50 printf("\"");
51 for (i=0; i<len; i++) {
52 printf("%c", isprint(bytes[i]) ? bytes[i] : '.');
54 printf("\"");
59 int main(int argc, char **argv) {
60 int ret, vendor, product;
61 struct usb_device *dev;
62 char buf[65535], *endptr;
64 usb_init();
65 usb_find_busses();
66 usb_find_devices();
68 vendor = 0x054c;
69 product = 0x02e7;
70 dev = find_device(vendor, product);
71 assert(dev);
73 devh = usb_open(dev);
74 assert(devh);
76 signal(SIGTERM, release_usb_device);
78 ret = usb_get_driver_np(devh, 0, buf, sizeof(buf));
79 if (ret == 0) {
80 printf("interface 0 already claimed by driver \"%s\", attempting to detach it\n", buf);
81 ret = usb_detach_kernel_driver_np(devh, 0);
82 printf("usb_detach_kernel_driver_np returned %d\n", ret);
84 ret = usb_claim_interface(devh, 0);
85 if (ret != 0) {
86 printf("claim failed with error %d\n", ret);
87 exit(1);
90 ret = usb_set_altinterface(devh, 0);
91 assert(ret >= 0);
93 ret = usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
94 usleep(4*1000);
95 ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000009);
96 usleep(3*1000);
97 ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000027);
98 usleep(4*1000);
99 ret = usb_release_interface(devh, 0);
100 if (ret != 0) printf("failed to release interface before set_configuration: %d\n", ret);
101 ret = usb_set_configuration(devh, 0x0000001);
102 ret = usb_claim_interface(devh, 0);
103 if (ret != 0) printf("claim after set_configuration failed with error %d\n", ret);
104 ret = usb_set_altinterface(devh, 0);
106 usleep(5000*1000);
107 // shutter release
108 memcpy(buf, "\x10\x00\x00\x00\x01\x00\x07\x92\x0e\x05\x00\x00\xc7\xd2\x00\x00", 0x0000010);
109 ret = usb_bulk_write(devh, 0x00000001, buf, 0x0000010, 1000);
110 printf("3982 bulk write returned %d, bytes: ", ret);
111 print_bytes(buf, ret);
112 printf("\n");
113 usleep(7*1000);
114 memcpy(buf, "\x0e\x00\x00\x00\x02\x00\x07\x92\x0e\x05\x00\x00\x02\x00", 0x000000e);
115 ret = usb_bulk_write(devh, 0x00000001, buf, 0x000000e, 1000);
116 printf("3983 bulk write returned %d, bytes: ", ret);
117 print_bytes(buf, ret);
118 printf("\n");
119 usleep(6*1000);
120 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 1030);
121 printf("3984 bulk read returned %d, bytes: ", ret);
122 print_bytes(buf, ret);
123 printf("\n");
124 usleep(68*1000);
125 memcpy(buf, "\x0c\x00\x00\x00\x01\x00\x08\x92\x0f\x05\x00\x00", 0x000000c);
126 ret = usb_bulk_write(devh, 0x00000001, buf, 0x000000c, 1000);
127 printf("3985 bulk write returned %d, bytes: ", ret);
128 print_bytes(buf, ret);
129 printf("\n");
130 usleep(4*1000);
131 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 1030);
132 printf("3986 bulk read returned %d, bytes: ", ret);
133 print_bytes(buf, ret);
134 printf("\n");
135 usleep(9*1000);
136 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 1030);
137 printf("3987 bulk read returned %d, bytes: ", ret);
138 print_bytes(buf, ret);
139 printf("\n");
140 usleep(8*1000);
141 usleep(8*1000);
142 memcpy(buf, "\x10\x00\x00\x00\x01\x00\x07\x92\x10\x05\x00\x00\xc2\xd2\x00\x00", 0x0000010);
143 ret = usb_bulk_write(devh, 0x00000001, buf, 0x0000010, 1000);
144 printf("3988 bulk write returned %d, bytes: ", ret);
145 print_bytes(buf, ret);
146 printf("\n");
147 usleep(4*1000);
148 memcpy(buf, "\x0e\x00\x00\x00\x02\x00\x07\x92\x10\x05\x00\x00\x01\x00", 0x000000e);
149 ret = usb_bulk_write(devh, 0x00000001, buf, 0x000000e, 1000);
150 printf("3989 bulk write returned %d, bytes: ", ret);
151 print_bytes(buf, ret);
152 printf("\n");
153 usleep(10*1000);
154 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 1030);
155 printf("3990 bulk read returned %d, bytes: ", ret);
156 print_bytes(buf, ret);
157 printf("\n");
158 usleep(65*1000);
159 memcpy(buf, "\x10\x00\x00\x00\x01\x00\x07\x92\x11\x05\x00\x00\xc1\xd2\x00\x00", 0x0000010);
160 ret = usb_bulk_write(devh, 0x00000001, buf, 0x0000010, 1000);
161 printf("3991 bulk write returned %d, bytes: ", ret);
162 print_bytes(buf, ret);
163 printf("\n");
164 usleep(5*1000);
165 memcpy(buf, "\x0e\x00\x00\x00\x02\x00\x07\x92\x11\x05\x00\x00\x01\x00", 0x000000e);
166 ret = usb_bulk_write(devh, 0x00000001, buf, 0x000000e, 1000);
167 printf("3992 bulk write returned %d, bytes: ", ret);
168 print_bytes(buf, ret);
169 printf("\n");
170 usleep(3*1000);
171 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 1030);
172 printf("3993 bulk read returned %d, bytes: ", ret);
173 print_bytes(buf, ret);
174 printf("\n");
175 usleep(73*1000);
177 // retrieving image
178 usleep(2500*1000);
179 memcpy(buf, "\x10\x00\x00\x00\x01\x00\x08\x10\xfa\x06\x00\x00\x01\xc0\xff\xff", 0x0000010);
180 ret = usb_bulk_write(devh, 0x00000001, buf, 0x0000010, 1000);
181 printf("5469 bulk write returned %d, bytes: ", ret);
182 print_bytes(buf, ret);
183 printf("\n");
184 usleep(6*1000);
185 // 5470 contains the filename
186 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 1030);
187 printf("5470 bulk read returned %d, bytes: ", ret);
188 print_bytes(buf, ret);
189 printf("\n");
190 usleep(2*1000);
191 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 1030);
192 printf("5471 bulk read returned %d, bytes: ", ret);
193 print_bytes(buf, ret);
194 printf("\n");
195 usleep(4*1000);
196 ret = usb_interrupt_read(devh, 0x00000083, buf, 0x0000008, 1000);
197 printf("5472 interrupt read returned %d, bytes: ", ret);
198 print_bytes(buf, ret);
199 printf("\n");
200 usleep(16*1000);
201 memcpy(buf, "\x10\x00\x00\x00\x01\x00\x09\x10\xfb\x06\x00\x00\x01\xc0\xff\xff", 0x0000010);
202 ret = usb_bulk_write(devh, 0x00000001, buf, 0x0000010, 1000);
203 printf("5473 bulk write returned %d, bytes: ", ret);
204 print_bytes(buf, ret);
205 printf("\n");
206 usleep(5*1000);
207 FILE *out;
208 out = fopen("/tmp/foo.jpg", "w"); // TODO - error handling
209 // here, the actual image data starts (ignore 12 byte ptp headers)
210 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 4932);
211 int i;
212 for (i = 12; i < ret; i++) {
213 fputc(buf[i], out);
216 while (ret > 0) {
217 // something to read left
218 ret = usb_bulk_read(devh, 0x00000082, buf, 0x0000200, 4932);
219 // append to file
220 int i;
221 for (i = 0; i < ret; i++) {
222 fputc(buf[i], out);
225 fclose(out);
226 ret = usb_release_interface(devh, 0);
227 assert(ret == 0);
228 ret = usb_close(devh);
229 assert(ret == 0);
230 return 0;