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}