2 #include <ucw/unaligned.h>
9 #include <libusb-1.0/libusb.h>
11 struct libusb_context *usb_ctxt;
12 struct libusb_device_handle *devh;
14 static libusb_device *find_device(void)
16 libusb_device **devlist;
17 ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
20 fprintf(stderr, "Cannot enumerate USB devices: error %d\n", (int) devn);
24 for (ssize_t i=0; i<devn; i++)
26 struct libusb_device_descriptor desc;
27 libusb_device *dev = devlist[i];
28 if (!libusb_get_device_descriptor(dev, &desc))
30 if (desc.idVendor == 0x4242 && desc.idProduct == 0x0002)
32 printf("Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
33 // FIXME: Free device list
39 libusb_free_device_list(devlist, 1);
40 fprintf(stderr, "Device not found\n");
44 static byte req[64], resp[64];
46 static int transaction(uint req_len, uint resp_len)
49 if (err = libusb_bulk_transfer(devh, 0x01, req, req_len, &transferred, 2000))
50 die("Transfer failed: error %d\n", err);
51 // printf("Transferred %d bytes\n", transferred);
54 if (err = libusb_bulk_transfer(devh, 0x82, resp, 64, &received, 2000))
55 die("Receive failed: error %d\n", err);
56 // printf("Received %d bytes\n", received);
58 if ((uint) received < resp_len)
59 die("Received short packet (%u out of %u bytes)", received, resp_len);
63 uint status = get_u32_be(resp);
65 die("Received error status %08x", status);
74 if (err = libusb_init(&usb_ctxt))
76 fprintf(stderr, "Cannot initialize libusb: error %d\n", err);
79 libusb_set_debug(usb_ctxt, 3);
81 libusb_device *dev = find_device();
83 if (err = libusb_open(dev, &devh))
85 fprintf(stderr, "Cannot open device: error %d\n", err);
88 libusb_reset_device(devh);
89 if (err = libusb_claim_interface(devh, 0))
91 fprintf(stderr, "Cannot claim interface: error %d\n", err);
98 int t = get_u32_be(resp+4);
99 printf("Temp: %d\n", t);
106 put_u32_be(req+4, x);