]> mj.ucw.cz Git - home-hw.git/blob - bsb/daemon/burrow-bsb.c
BSB: Build firmware for DFU boot-loader
[home-hw.git] / bsb / daemon / burrow-bsb.c
1 /*
2  *      Boiler System Bus Interface Daemon
3  *
4  *      (c) 2020 Martin Mares <mj@ucw.cz>
5  */
6
7 #include <stdarg.h>
8 #include <stdio.h>
9 #include <stdint.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <unistd.h>
13
14 #include <libusb-1.0/libusb.h>
15
16 static struct libusb_context *usb_ctxt;
17 static struct libusb_device_handle *devh;
18
19 static void die(const char *msg, ...)
20 {
21         va_list args;
22         va_start(args, msg);
23
24         vfprintf(stderr, msg, args);
25         fputc('\n', stderr);
26
27         exit(1);
28 }
29
30 static void usb_error(const char *msg, ...)
31 {
32         va_list args;
33         va_start(args, msg);
34         vfprintf(stderr, msg, args);
35         fputc('\n', stderr);
36         va_end(args);
37
38         if (devh) {
39                 libusb_close(devh);
40                 devh = NULL;
41         }
42 }
43
44 static void open_device(void)
45 {
46         int err;
47         libusb_device **devlist;
48         ssize_t devn = libusb_get_device_list(usb_ctxt, &devlist);
49         if (devn < 0)
50                 die("Cannot enumerate USB devices: error %d", (int) devn);
51
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));
58
59                                 if (err = libusb_open(dev, &devh)) {
60                                         usb_error("Cannot open device: error %d", err);
61                                         goto out;
62                                 }
63                                 libusb_reset_device(devh);
64                                 if (err = libusb_claim_interface(devh, 0)) {
65                                         usb_error("Cannot claim interface: error %d", err);
66                                         goto out;
67                                 }
68
69                                 goto out;
70                         }
71                 }
72         }
73
74 out:
75         libusb_free_device_list(devlist, 1);
76 }
77
78 int main(void)
79 {
80         int err;
81         if (err = libusb_init(&usb_ctxt))
82                 die("Cannot initialize libusb: error %d", err);
83         // libusb_set_debug(usb_ctxt, 3);
84         open_device();
85
86         for (;;) {
87                 if (!devh) {
88                         fprintf(stderr, "Waiting for device to appear...\n");
89                         while (!devh) {
90                                 sleep(5);
91                                 open_device();
92                         }
93                 }
94
95 #if 0
96                 int received;
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);
100                         continue;
101                 }
102
103                 printf("Received %d bytes\n", received);
104                 if (received < 4) {
105                         usb_error("Receive failed: unexpected response size %d", received);
106                         continue;
107                 }
108
109                 printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]);
110 #elif 0
111                 int received;
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);
115                         continue;
116                 }
117
118                 printf("Interrupt received %d bytes\n", received);
119                 if (received < 4) {
120                         usb_error("Receive failed: unexpected response size %d", received);
121                         continue;
122                 }
123
124                 printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]);
125 #else
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);
129                         continue;
130                 }
131
132                 printf("-> %02x%02x%02x%02x\n", resp[0], resp[1], resp[2], resp[3]);
133 #endif
134
135                 sleep(1);
136         }
137 }