[feat] add libusb_get_mouse_data by sync api
This commit is contained in:
commit
323d04fd5f
14
command.txt
Normal file
14
command.txt
Normal file
@ -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
|
||||
131
libusb_get_mouse_data/main.c
Normal file
131
libusb_get_mouse_data/main.c
Normal file
@ -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);
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user