From 323d04fd5f758e0b9fa173cef892ce287d204838 Mon Sep 17 00:00:00 2001 From: jzh Date: Sun, 1 Mar 2026 22:03:14 +0800 Subject: [PATCH] [feat] add libusb_get_mouse_data by sync api --- command.txt | 14 ++++ libusb_get_mouse_data/main.c | 131 +++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 command.txt create mode 100644 libusb_get_mouse_data/main.c diff --git a/command.txt b/command.txt new file mode 100644 index 0000000..2ea4e45 --- /dev/null +++ b/command.txt @@ -0,0 +1,14 @@ +lsusb ->show usb bus +lsusb -v ->show usb device details +apt install libusb-dev ->install version-0.1 libusb +apt install libusb-1.0-0-dev ->install version-1.0 libusb +apt-cache search libusb ->search for libusb packet +gcc main.c -v ->show detail of cmd execute,such as head file path +find -name libusb.h ->search head file + +sudo apt install pkg-config autoconf automake libtool +./autogen.sh +./configure --host=arm-linux-gnueabihf --prefix=$PWD/tmp --disable-udev +make +make install +ll tmp diff --git a/libusb_get_mouse_data/main.c b/libusb_get_mouse_data/main.c new file mode 100644 index 0000000..89c5285 --- /dev/null +++ b/libusb_get_mouse_data/main.c @@ -0,0 +1,131 @@ +#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); +}