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 */
11 #include <linux/usbdevice_fs.h>
12 #define LIBUSB_AUGMENT
13 #include "libusb_augment.h"
16 struct usb_dev_handle
*devh
;
18 void release_usb_device(int dummy
) {
20 ret
= usb_release_interface(devh
, 0);
22 printf("failed to release interface: %d\n", ret
);
25 printf("failed to close interface: %d\n", ret
);
29 struct usb_device
*find_device(int vendor
, int product
) {
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
)
44 void print_bytes(char *bytes
, int len
) {
47 for (i
=0; i
<len
; i
++) {
48 printf("%02x ", (int)((unsigned char)bytes
[i
]));
51 for (i
=0; i
<len
; i
++) {
52 printf("%c", isprint(bytes
[i
]) ? bytes
[i
] : '.');
59 int main(int argc
, char **argv
) {
60 int ret
, vendor
, product
;
61 struct usb_device
*dev
;
62 char buf
[65535], *endptr
;
70 dev
= find_device(vendor
, product
);
76 signal(SIGTERM
, release_usb_device
);
78 ret
= usb_get_driver_np(devh
, 0, buf
, sizeof(buf
));
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);
86 printf("claim failed with error %d\n", ret
);
90 ret
= usb_set_altinterface(devh
, 0);
93 ret
= usb_get_descriptor(devh
, 0x0000001, 0x0000000, buf
, 0x0000012);
95 ret
= usb_get_descriptor(devh
, 0x0000002, 0x0000000, buf
, 0x0000009);
97 ret
= usb_get_descriptor(devh
, 0x0000002, 0x0000000, buf
, 0x0000027);
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);
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
);
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
);
120 ret
= usb_bulk_read(devh
, 0x00000082, buf
, 0x0000200, 1030);
121 printf("3984 bulk read returned %d, bytes: ", ret
);
122 print_bytes(buf
, ret
);
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
);
131 ret
= usb_bulk_read(devh
, 0x00000082, buf
, 0x0000200, 1030);
132 printf("3986 bulk read returned %d, bytes: ", ret
);
133 print_bytes(buf
, ret
);
136 ret
= usb_bulk_read(devh
, 0x00000082, buf
, 0x0000200, 1030);
137 printf("3987 bulk read returned %d, bytes: ", ret
);
138 print_bytes(buf
, ret
);
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
);
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
);
154 ret
= usb_bulk_read(devh
, 0x00000082, buf
, 0x0000200, 1030);
155 printf("3990 bulk read returned %d, bytes: ", ret
);
156 print_bytes(buf
, ret
);
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
);
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
);
171 ret
= usb_bulk_read(devh
, 0x00000082, buf
, 0x0000200, 1030);
172 printf("3993 bulk read returned %d, bytes: ", ret
);
173 print_bytes(buf
, ret
);
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
);
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
);
191 ret
= usb_bulk_read(devh
, 0x00000082, buf
, 0x0000200, 1030);
192 printf("5471 bulk read returned %d, bytes: ", ret
);
193 print_bytes(buf
, ret
);
196 ret
= usb_interrupt_read(devh
, 0x00000083, buf
, 0x0000008, 1000);
197 printf("5472 interrupt read returned %d, bytes: ", ret
);
198 print_bytes(buf
, ret
);
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
);
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);
212 for (i
= 12; i
< ret
; i
++) {
217 // something to read left
218 ret
= usb_bulk_read(devh
, 0x00000082, buf
, 0x0000200, 4932);
221 for (i
= 0; i
< ret
; i
++) {
226 ret
= usb_release_interface(devh
, 0);
228 ret
= usb_close(devh
);