diff --git a/Makefile b/Makefile index aee51a0..2f07591 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,15 @@ CFLAGS += -Wall CFLAGS += -Werror CFLAGS += -g -all: hdjd aac123 +all: hdjd aac123 explore hdjd: LDFLAGS += $(shell pkg-config --libs libusb-1.0) hdjd: LDFLAGS += $(shell pkg-config --libs alsa) hdjd: hdjd.o usb.o alsa.o +explore: LDFLAGS += $(shell pkg-config --libs libusb-1.0) +explore.o: CFLAGS += $(shell pkg-config --cflags libusb-1.0) + alsa.o: CFLAGS += $(shell pkg-config --cflags alsa) usb.o: CFLAGS += $(shell pkg-config --cflags libusb-1.0) diff --git a/explore.c b/explore.c new file mode 100644 index 0000000..45209d8 --- /dev/null +++ b/explore.c @@ -0,0 +1,105 @@ +#include +#include +#include +#include + +/* + * Some things I use for debugging + */ +#ifdef NODUMP +#define DUMPf(fmt, args...) +#else +#define DUMPf(fmt, args...) fprintf(stderr, "%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args) +#endif +#define DUMP() DUMPf("") +#define DUMP_d(v) DUMPf("%s = %d", #v, v) +#define DUMP_x(v) DUMPf("%s = 0x%x", #v, v) +#define DUMP_s(v) DUMPf("%s = %s", #v, v) +#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v) +#define DUMP_p(v) DUMPf("%s = %p", #v, v) + +struct device { + uint16_t product_id; + uint8_t ep_in; + uint8_t ep_out; +}; + +const struct device devices[] = { + {0xb102, 0x83, 0x04}, + {0xb105, 0x82, 0x03}, + {0xb10c, 0x84, 0x02}, + {0, 0, 0} +}; + + +int +main(int argc, char **argv) +{ + struct libusb_device_handle *dev; + struct libusb_device_descriptor ddesc; + unsigned char name[100]; + const struct device *d; + int ret; + + if (libusb_init(NULL) < 0) { + return 69; + } + + for (d = devices; d->product_id; d += 1) { + dev = libusb_open_device_with_vid_pid(NULL, 0x6f8, d->product_id); + if (dev) { + break; + } + } + if (!dev) { + printf("Couldn't find a controller\n"); + return 69; + } + // Figure out what this thing is called + libusb_get_device_descriptor(libusb_get_device(dev), &ddesc); + { + unsigned char *p = name; + + ret = libusb_get_string_descriptor_ascii(dev, ddesc.iManufacturer, name, sizeof(name)); + if (ret > 0) { + p = name + ret; + *p = ' '; + p += 1; + ret = libusb_get_string_descriptor_ascii(dev, ddesc.iProduct, p, sizeof(name) - ret - 1); + } + + if (ret < 0) { + printf("Can't figure out what to call this thing.\n"); + return 69; + } + } + printf("Opened a %s\n", name); + + + while (1) { + uint8_t data[8]; + int transferred; + int i; + + if ((ret = libusb_bulk_transfer(dev, d->ep_in, data, sizeof data, &transferred, 0))) { + break; + } + + for (i = 0; i < transferred; i += 1) { + printf("%02x ", data[i]); + } + printf("\n"); + + //memset(data, 0xff, sizeof data); + libusb_bulk_transfer(dev, d->ep_out, data, sizeof data, &transferred, 0); + + } + + if (ret < 0) { + printf("ERROR: %s\n", libusb_error_name(ret)); + } + + libusb_exit(NULL); + + return 0; +}