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 typedef unsigned char byte;
20 typedef unsigned int uint;
22 static void die(const char *msg, ...)
27 vfprintf(stderr, msg, args);
33 static void usb_error(const char *msg, ...)
37 vfprintf(stderr, msg, args);
47 static void open_device(void)
50 libusb_device **devlist;
51 ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
53 die("Cannot enumerate USB devices: error %d", (int) devn);
55 for (ssize_t i=0; i<devn; i++) {
56 struct libusb_device_descriptor desc;
57 libusb_device *dev = devlist[i];
58 if (!libusb_get_device_descriptor(dev, &desc)) {
59 if (desc.idVendor == 0x4242 && desc.idProduct == 0x0003) {
60 fprintf(stderr, "Found device at usb%d.%d\n", libusb_get_bus_number(dev), libusb_get_device_address(dev));
62 if (err = libusb_open(dev, &devh)) {
63 usb_error("Cannot open device: error %d", err);
66 libusb_reset_device(devh);
67 if (err = libusb_claim_interface(devh, 0)) {
68 usb_error("Cannot claim interface: error %d", err);
78 libusb_free_device_list(devlist, 1);
81 static inline uint get_u32_le(byte *p)
83 return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0];
89 if (err = libusb_init(&usb_ctxt))
90 die("Cannot initialize libusb: error %d", err);
91 // libusb_set_debug(usb_ctxt, 3);
96 fprintf(stderr, "Waiting for device to appear...\n");
106 if (err = libusb_bulk_transfer(devh, 0x81, resp, 64, &received, 2000)) {
107 usb_error("Receive failed: error %d", err);
111 printf("Received %d bytes\n", received);
113 usb_error("Receive failed: unexpected response size %d", received);
117 printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]);
121 if (err = libusb_interrupt_transfer(devh, 0x82, resp, 64, &received, 100)) {
122 usb_error("Receive failed: error %d", err);
126 printf("Interrupt received %d bytes\n", received);
128 usb_error("Receive failed: unexpected response size %d", received);
132 printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]);
136 if ((received = libusb_control_transfer(devh, 0xc0, 0x00, 0, 0, resp, sizeof(resp), 100)) < 0) {
137 usb_error("Receive failed: error %d", received);
142 for (int i=0; i+3 < received; i+=4)
143 printf(" %u", get_u32_le(resp+i));