hdjd

Hercules DJ controller driver for Linux
git clone https://git.woozle.org/neale/hdjd.git

Neale Pickett  ·  2017-03-18

explore.c

  1#include <stdio.h>
  2#include <stdint.h>
  3#include <libusb.h>
  4#include <string.h>
  5
  6/*
  7 * Some things I use for debugging 
  8 */
  9#ifdef NODUMP
 10#define DUMPf(fmt, args...)
 11#else
 12#define DUMPf(fmt, args...) fprintf(stderr, "%s:%s:%d " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ##args)
 13#endif
 14#define DUMP() DUMPf("")
 15#define DUMP_d(v) DUMPf("%s = %d", #v, v)
 16#define DUMP_x(v) DUMPf("%s = 0x%x", #v, v)
 17#define DUMP_s(v) DUMPf("%s = %s", #v, v)
 18#define DUMP_c(v) DUMPf("%s = '%c' (0x%02x)", #v, v, v)
 19#define DUMP_p(v) DUMPf("%s = %p", #v, v)
 20
 21struct device {
 22  char *name;
 23  uint16_t product_id;
 24  uint8_t ep_in;
 25  uint8_t ep_out;
 26};
 27
 28const struct device devices[] = {
 29  {"Steel", 0xb102, 0x83, 0x04},
 30  {"MP3e2", 0xb105, 0x82, 0x03},
 31  {"4Set", 0xb10c, 0x84, 0x02},
 32  {0, 0, 0, 0}
 33};
 34
 35
 36int
 37main(int argc, char **argv)
 38{
 39  struct libusb_device_handle *dev;
 40  struct libusb_device_descriptor ddesc;
 41  unsigned char name[100];
 42  const struct device *d;
 43  int ret;
 44
 45  if (libusb_init(NULL) < 0) {
 46    return 69;
 47  }
 48
 49  for (d = devices; d->product_id; d += 1) {
 50    dev = libusb_open_device_with_vid_pid(NULL, 0x6f8, d->product_id);
 51    if (dev) {
 52      break;
 53    }
 54  }
 55  if (!dev) {
 56    printf("Couldn't find a controller\n");
 57    return 69;
 58  }
 59  // Figure out what this thing is called
 60  libusb_get_device_descriptor(libusb_get_device(dev), &ddesc);
 61  {
 62    unsigned char *p = name;
 63
 64    ret = libusb_get_string_descriptor_ascii(dev, ddesc.iManufacturer, name, sizeof(name));
 65    if (ret > 0) {
 66      p = name + ret;
 67      *p = ' ';
 68      p += 1;
 69      ret = libusb_get_string_descriptor_ascii(dev, ddesc.iProduct, p, sizeof(name) - ret - 1);
 70    }
 71
 72    if (ret < 0) {
 73      printf("Can't figure out what to call this thing.\n");
 74      return 69;
 75    }
 76  }
 77  printf("Opened a %s\n", name);
 78
 79
 80  while (1) {
 81    uint8_t data[256];
 82    int transferred;
 83    int i;
 84
 85    if ((ret = libusb_bulk_transfer(dev, d->ep_in, data, sizeof data, &transferred, 0))) {
 86      break;
 87    }
 88
 89    for (i = 0; i < transferred; i += 1) {
 90      printf("%02x ", data[i]);
 91    }
 92    printf("\n");
 93
 94    {
 95      uint8_t data[16];
 96			
 97      memset(data, 0xff, sizeof data);
 98      libusb_bulk_transfer(dev, d->ep_out, data, sizeof data, &transferred, 0);
 99    }
100
101  }
102
103  if (ret < 0) {
104    printf("ERROR: %s\n", libusb_error_name(ret));
105  }
106
107  libusb_exit(NULL);
108
109  return 0;
110}