2 * Boiler System Bus Interface Daemon
4 * (c) 2020 Martin Mares <mj@ucw.cz>
14 #include <libusb-1.0/libusb.h>
16 static struct libusb_context *usb_ctxt;
17 static struct libusb_device_handle *devh;
19 static void die(const char *msg, ...)
24 vfprintf(stderr, msg, args);
30 static void usb_error(const char *msg, ...)
34 vfprintf(stderr, msg, args);
44 static void open_device(void)
47 libusb_device **devlist;
48 ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
50 die("Cannot enumerate USB devices: error %d", (int) devn);
52 for (ssize_t i=0; i<devn; i++) {
53 struct libusb_device_descriptor desc;
54 libusb_device *dev = devlist[i];
55 if (!libusb_get_device_descriptor(dev, &desc)) {
56 if (desc.idVendor == 0x4242 && desc.idProduct == 0x0003) {
57 fprintf(stderr, "Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
59 if (err = libusb_open(dev, &devh)) {
60 usb_error("Cannot open device: error %d", err);
63 libusb_reset_device(devh);
64 if (err = libusb_claim_interface(devh, 0)) {
65 usb_error("Cannot claim interface: error %d", err);
75 libusb_free_device_list(devlist, 1);
81 if (err = libusb_init(&usb_ctxt))
82 die("Cannot initialize libusb: error %d", err);
83 // libusb_set_debug(usb_ctxt, 3);
88 fprintf(stderr, "Waiting for device to appear...\n");
97 unsigned char resp[64];
98 if (err = libusb_bulk_transfer(devh, 0x81, resp, 64, &received, 2000)) {
99 usb_error("Receive failed: error %d", err);
103 printf("Received %d bytes\n", received);
105 usb_error("Receive failed: unexpected response size %d", received);
109 printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]);
112 unsigned char resp[64];
113 if (err = libusb_interrupt_transfer(devh, 0x82, resp, 64, &received, 100)) {
114 usb_error("Receive failed: error %d", err);
118 printf("Interrupt received %d bytes\n", received);
120 usb_error("Receive failed: unexpected response size %d", received);
124 printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]);
126 unsigned char resp[64] = { 1, 2, 3, 4 };
127 if ((err = libusb_control_transfer(devh, 0xc0, 0x00, 0, 0, resp, 4, 100)) < 0) {
128 usb_error("Receive failed: error %d", err);
132 printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]);