#include "stdlib.h" #include "stdio.h" #include "stdint.h" #include "string.h" #include "stdbool.h" #include "libusb-1.0/libusb.h" void main(int argc, char **argv) { int err, found = 0; libusb_device *dev, **devs; int num_devices; int idx_intf, idx_ep; struct libusb_device_descriptor desc_dev; struct libusb_config_descriptor *desc_conf; struct libusb_device_handle *dev_handle = NULL; uint8_t buffer[6]; int transfered; err = libusb_init(NULL); if (err < 0) { printf("libusb_init failed: %s\n", libusb_error_name(err)); exit(1); } else { printf("libusb_init succeeded.\n"); } num_devices = libusb_get_device_list(NULL, &devs); if (num_devices < 0) { printf("libusb_get_device_list failed: %s\n", libusb_error_name(num_devices)); libusb_exit(NULL); exit(1); } else { printf("libusb_get_device_list succeeded. Number of devices found: %d\r\n", num_devices); } for (int i = 0; i < num_devices; i++) { dev = devs[i]; err = libusb_get_device_descriptor(dev, &desc_dev); if (err < 0) { printf("libusb_get_device_descriptor failed: %s\n", libusb_error_name(err)); continue; } else { printf("Device %d: Vendor ID: %04x, Product ID: %04x, ", i, desc_dev.idVendor, desc_dev.idProduct); printf("Number of configurations: %d\r\n", desc_dev.bNumConfigurations); for (int conf = 0; conf < desc_dev.bNumConfigurations; conf++) { err = libusb_get_config_descriptor(dev, conf, &desc_conf); if (err < 0) { printf("libusb_get_config_descriptor failed: %s\n", libusb_error_name(err)); continue; } else { printf(" Configuration %d: Number of interfaces: %d\r\n", conf, desc_conf->bNumInterfaces); for (int intf = 0; intf < desc_conf->bNumInterfaces; intf++) { const struct libusb_interface_descriptor *desc_intf = &desc_conf->interface[intf].altsetting[0]; idx_intf = desc_intf->bInterfaceNumber; if ((desc_intf->bInterfaceClass != 3) || (desc_intf->bInterfaceProtocol != 2)) { continue; } else { printf(" ======find usb mouse ok.======\r\n"); for (int ep = 0; ep < desc_intf->bNumEndpoints; ep++) { const struct libusb_endpoint_descriptor *desc_ep = &desc_intf->endpoint[ep]; if (((desc_ep->bmAttributes & 3) == LIBUSB_TRANSFER_TYPE_INTERRUPT) && ((desc_ep->bEndpointAddress & 0x80) == LIBUSB_ENDPOINT_IN)) { printf(" Endpoint %d: Address: %02x, Attributes: %02x\r\n", ep, desc_ep->bEndpointAddress, desc_ep->bmAttributes); idx_ep = desc_ep->bEndpointAddress; found = 1; break; } } } if (found) { break; } } } libusb_free_config_descriptor(desc_conf); if (found) { break; } } } if (found) { break; } } libusb_free_device_list(devs, true); if (!found) { printf("No USB mouse found.\r\n"); libusb_exit(NULL); exit(1); } else { printf("USB mouse found.\r\n"); err = libusb_open(dev, &dev_handle); if (err < 0) { printf("libusb_open failed: %s\n", libusb_error_name(err)); libusb_exit(NULL); exit(1); } else { printf("libusb_open succeeded.\r\n"); libusb_set_auto_detach_kernel_driver(dev_handle, true); err = libusb_claim_interface(dev_handle, idx_intf); if (err < 0) { printf("libusb_claim_interface failed: %s\n", libusb_error_name(err)); libusb_close(dev_handle); libusb_exit(NULL); exit(1); } else { printf("libusb_claim_interface succeeded.\r\n"); while (1) { err = libusb_interrupt_transfer(dev_handle, idx_ep, buffer, sizeof(buffer), &transfered, 0); if (err == 0) { printf("%04d data:", transfered); for (int i = 0; i < transfered; i++) { printf(" %02X", buffer[i]); } printf("\r\n"); } else if (err == LIBUSB_ERROR_TIMEOUT) { printf("libusb_interrupt_transfer timeout.\r\n"); } else { printf("libusb_interrupt_transfer failed: %s\n", libusb_error_name(err)); } } } } } libusb_release_interface(dev_handle, idx_intf); libusb_close(dev_handle); libusb_exit(NULL); }