quick shell script hack for tethered shooting with qiv
[alphamote.git] / alphamote.c
blobc7927aa0a98ebdb3f718eb9956c736e09bf344c4
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <assert.h>
5 #include <signal.h>
6 #include <ctype.h>
7 #include <usb.h>
9 struct usb_dev_handle *devh;
11 void release_usb_device(int dummy) {
12 int ret;
13 ret = usb_release_interface(devh, 0);
14 if (!ret)
15 printf("failed to release interface: %d\n", ret);
16 usb_close(devh);
17 if (!ret)
18 printf("failed to close interface: %d\n", ret);
19 exit(1);
22 struct usb_device *find_device(int vendor, int product) {
23 struct usb_bus *bus;
25 for (bus = usb_get_busses(); bus; bus = bus->next) {
26 struct usb_device *dev;
28 for (dev = bus->devices; dev; dev = dev->next) {
29 if (dev->descriptor.idVendor == vendor
30 && dev->descriptor.idProduct == product)
31 return dev;
34 return NULL;
37 void init_usb() {
38 int vendor, product, ret;
39 struct usb_device *dev;
40 char buf[65535];
42 usb_init();
43 usb_find_busses();
44 usb_find_devices();
46 // vendor and product code for Sony alpha 700
47 vendor = 0x054c;
48 product = 0x02e7;
49 dev = find_device(vendor, product);
50 if (! dev) {
51 fprintf(stderr, "No camera found!\n");
52 exit(1);
55 devh = usb_open(dev);
56 assert(devh);
58 signal(SIGTERM, release_usb_device);
60 ret = usb_get_driver_np(devh, 0, buf, sizeof(buf));
61 ret = usb_claim_interface(devh, 0);
62 if (ret != 0) {
63 printf("claim failed with error %d\n", ret);
64 exit(1);
67 ret = usb_set_altinterface(devh, 0);
68 assert(ret >= 0);
70 ret = usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
71 usleep(4*1000);
72 ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000009);
73 usleep(3*1000);
74 ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000027);
75 usleep(4*1000);
76 ret = usb_release_interface(devh, 0);
77 if (ret != 0) printf("failed to release interface before set_configuration: %d\n", ret);
78 ret = usb_set_configuration(devh, 0x0000001);
79 ret = usb_claim_interface(devh, 0);
80 if (ret != 0) printf("claim after set_configuration failed with error %d\n", ret);
81 ret = usb_set_altinterface(devh, 0);
83 return;