]> mj.ucw.cz Git - home-hw.git/blob - host/test.c
Communicating with the host
[home-hw.git] / host / test.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <libusb-1.0/libusb.h>
4
5 struct libusb_context *usb_ctxt;
6 struct libusb_device_handle *devh;
7
8 static libusb_device *find_device(void)
9 {
10   libusb_device **devlist;
11   ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
12   if (devn < 0)
13     {
14       fprintf(stderr, "Cannot enumerate USB devices: error %d\n", (int) devn);
15       exit(1);
16     }
17
18   for (ssize_t i=0; i<devn; i++)
19     {
20       struct libusb_device_descriptor desc;
21       libusb_device *dev = devlist[i];
22       if (!libusb_get_device_descriptor(dev, &desc))
23         {
24           if (desc.idVendor == 0x4242 && desc.idProduct == 0x0001)
25             {
26               printf("Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
27               // FIXME: Free device list
28               return dev;
29             }
30         }
31     }
32
33   libusb_free_device_list(devlist, 1);
34   fprintf(stderr, "Device not found\n");
35   exit(1);
36 }
37
38 int main(void)
39 {
40   int err;
41   if (err = libusb_init(&usb_ctxt))
42     {
43       fprintf(stderr, "Cannot initialize libusb: error %d\n", err);
44       exit(1);
45     }
46   libusb_set_debug(usb_ctxt, 3);
47
48   libusb_device *dev = find_device();
49
50   if (err = libusb_open(dev, &devh))
51     {
52       fprintf(stderr, "Cannot open device: error %d\n", err);
53       exit(1);
54     }
55   libusb_reset_device(devh);
56   if (err = libusb_claim_interface(devh, 0))
57     {
58       fprintf(stderr, "Cannot claim interface: error %d\n", err);
59       exit(1);
60     }
61
62   for (;;)
63     {
64       unsigned char req[64] = { 1, 2, 3, 4 };
65       int transferred;
66       if (err = libusb_bulk_transfer(devh, 0x01, req, 32, &transferred, 2000))
67         {
68           fprintf(stderr, "Transfer failed: error %d\n", err);
69           exit(1);
70         }
71       printf("Transferred %d bytes\n", transferred);
72
73 #if 1
74       unsigned char resp[1000];
75       int received;
76       if (err = libusb_bulk_transfer(devh, 0x81, resp, 1000, &received, 2000))
77         {
78           fprintf(stderr, "Receive failed: error %d\n", err);
79           exit(1);
80         }
81       printf("Received %d bytes [%02x]\n", received, resp[0]);
82 #endif
83     }
84
85   return 0;
86 }