(libusb) Further fleshing out
This commit is contained in:
parent
74a0b2614f
commit
b0d740ea09
|
@ -23,7 +23,7 @@ static int pad_connection_find_vacant_pad(joypad_connection_t *joyconn)
|
||||||
|
|
||||||
for (i = 0; i < MAX_USERS; i++)
|
for (i = 0; i < MAX_USERS; i++)
|
||||||
{
|
{
|
||||||
joypad_connection_t *conn = (joypad_connection_t*)&joyconn[i];
|
joypad_connection_t *conn = joyconn ? (joypad_connection_t*)&joyconn[i] : NULL;
|
||||||
|
|
||||||
if (conn && !conn->connected)
|
if (conn && !conn->connected)
|
||||||
return i;
|
return i;
|
||||||
|
@ -163,7 +163,7 @@ int16_t pad_connection_get_axis(joypad_connection_t *s,
|
||||||
|
|
||||||
bool pad_connection_has_interface(joypad_connection_t *s, unsigned pad)
|
bool pad_connection_has_interface(joypad_connection_t *s, unsigned pad)
|
||||||
{
|
{
|
||||||
if (s->connected && s->iface)
|
if (s && s->connected && s->iface)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ struct libusb_adapter
|
||||||
volatile bool quitting;
|
volatile bool quitting;
|
||||||
struct libusb_device *device;
|
struct libusb_device *device;
|
||||||
libusb_device_handle *handle;
|
libusb_device_handle *handle;
|
||||||
|
int interface_number;
|
||||||
|
|
||||||
uint8_t manufacturer_name[255];
|
uint8_t manufacturer_name[255];
|
||||||
uint8_t name[255];
|
uint8_t name[255];
|
||||||
|
@ -60,6 +61,17 @@ static void adapter_thread(void *data)
|
||||||
static void libusb_hid_device_send_control(void *data,
|
static void libusb_hid_device_send_control(void *data,
|
||||||
uint8_t* data_buf, size_t size)
|
uint8_t* data_buf, size_t size)
|
||||||
{
|
{
|
||||||
|
struct libusb_adapter *adapter = (struct libusb_adapter*)data;
|
||||||
|
int report_number = data_buf[0];
|
||||||
|
|
||||||
|
if(!adapter)
|
||||||
|
libusb_control_transfer(adapter->handle,
|
||||||
|
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,
|
||||||
|
0x09/*HID Set_Report*/,
|
||||||
|
(2/*HID output*/ << 8) | report_number,
|
||||||
|
adapter->interface_number,
|
||||||
|
data_buf, size,
|
||||||
|
1000/*timeout millis*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void libusb_hid_device_add_autodetect(unsigned idx,
|
static void libusb_hid_device_add_autodetect(unsigned idx,
|
||||||
|
@ -78,6 +90,43 @@ static void libusb_hid_device_add_autodetect(unsigned idx,
|
||||||
input_config_autoconfigure_joypad(¶ms);
|
input_config_autoconfigure_joypad(¶ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void libusb_get_description(struct libusb_device *device,
|
||||||
|
int *interface_number)
|
||||||
|
{
|
||||||
|
unsigned i, j, k;
|
||||||
|
struct libusb_config_descriptor *config;
|
||||||
|
|
||||||
|
libusb_get_config_descriptor(device, 0, &config);
|
||||||
|
|
||||||
|
fprintf(stderr, "Interfaces: %d.\n", (int)config->bNumInterfaces);
|
||||||
|
|
||||||
|
for(i=0; i < (int)config->bNumInterfaces; i++)
|
||||||
|
{
|
||||||
|
const struct libusb_interface *inter = &config->interface[i];
|
||||||
|
|
||||||
|
fprintf(stderr, "Number of alternate settings: %d.\n", inter->num_altsetting);
|
||||||
|
|
||||||
|
for(j = 0; j < inter->num_altsetting; j++)
|
||||||
|
{
|
||||||
|
const struct libusb_interface_descriptor *interdesc = &inter->altsetting[j];
|
||||||
|
|
||||||
|
*interface_number = (int)interdesc->bInterfaceNumber;
|
||||||
|
|
||||||
|
fprintf(stderr, "Interface Number: %d.\n", (int)interdesc->bInterfaceNumber);
|
||||||
|
fprintf(stderr, "Number of endpoints: %d.\n", (int)interdesc->bNumEndpoints);
|
||||||
|
|
||||||
|
for(k = 0; k < (int)interdesc->bNumEndpoints; k++)
|
||||||
|
{
|
||||||
|
const struct libusb_endpoint_descriptor *epdesc = &interdesc->endpoint[k];
|
||||||
|
fprintf(stderr, "Descriptor Type: %d.\n", (int)epdesc->bDescriptorType);
|
||||||
|
fprintf(stderr, "EP Address: %d.\n", (int)epdesc->bEndpointAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
libusb_free_config_descriptor(config);
|
||||||
|
}
|
||||||
|
|
||||||
static int add_adapter(void *data, struct libusb_device *dev)
|
static int add_adapter(void *data, struct libusb_device *dev)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -140,9 +189,12 @@ static int add_adapter(void *data, struct libusb_device *dev)
|
||||||
adapter->slot = pad_connection_pad_init(hid->slots,
|
adapter->slot = pad_connection_pad_init(hid->slots,
|
||||||
device_name, adapter, &libusb_hid_device_send_control);
|
device_name, adapter, &libusb_hid_device_send_control);
|
||||||
|
|
||||||
|
libusb_get_description(adapter->device, &adapter->interface_number);
|
||||||
|
|
||||||
if (!pad_connection_has_interface(hid->slots, adapter->slot))
|
if (!pad_connection_has_interface(hid->slots, adapter->slot))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
|
||||||
if (adapter->name[0] == '\0')
|
if (adapter->name[0] == '\0')
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue