编写源码
#include < errno.h >
#include < signal.h >
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include < libusb-1.0/libusb.h >
int main(int argc, char **argv)
{
int err;
libusb_device *dev, **devs;
int num_devices;
int endpoint;
int interface_num;
int found = 0;
int transferred;
int count = 0;
unsigned char buffer[16];
struct libusb_config_descriptor *config_desc;
struct libusb_device_handle *dev_handle = NULL;
/* libusb_init */
err = libusb_init(NULL);
if (err < 0) {
fprintf(stderr, "failed to initialise libusb %d - %sn", err, libusb_strerror(err));
exit(1);
}
/* get device list */
if ((num_devices = libusb_get_device_list(NULL, &devs)) < 0) {
fprintf(stderr, "libusb_get_device_list() failedn");
libusb_exit(NULL);
exit(1);
}
fprintf(stdout, "libusb_get_device_list() okn");
/* for each device, get config descriptor */
for (int i = 0; i < num_devices; i++) {
dev = devs[i];
/* parse interface descriptor, find usb mouse */
err = libusb_get_config_descriptor(dev, 0, &config_desc);
if (err) {
fprintf(stderr, "could not get configuration descriptorn");
continue;
}
fprintf(stdout, "libusb_get_config_descriptor() okn");
for (int interface = 0; interface < config_desc- >bNumInterfaces; interface++) {
const struct libusb_interface_descriptor *intf_desc = &config_desc- >interface[interface].altsetting[0];
interface_num = intf_desc- >bInterfaceNumber;
if (intf_desc- >bInterfaceClass != 3 || intf_desc- >bInterfaceProtocol != 2)
continue;
else
{
/* 找到了USB鼠标 */
fprintf(stdout, "find usb mouse okn");
for (int ep = 0; ep < intf_desc- >bNumEndpoints; ep++)
{
if ((intf_desc- >endpoint[ep].bmAttributes & 3) == LIBUSB_TRANSFER_TYPE_INTERRUPT ||
(intf_desc- >endpoint[ep].bEndpointAddress & 0x80) == LIBUSB_ENDPOINT_IN) {
/* 找到了输入的中断端点 */
fprintf(stdout, "find in int endpointn");
endpoint = intf_desc- >endpoint[ep].bEndpointAddress;
found = 1;
break;
}
}
}
if (found)
break;
}
libusb_free_config_descriptor(config_desc);
if (found)
break;
}
if (!found)
{
/* free device list */
libusb_free_device_list(devs, 1);
libusb_exit(NULL);
exit(1);
}
if (found)
{
/* libusb_open */
err = libusb_open(dev, &dev_handle);
if (err)
{
fprintf(stderr, "failed to open usb mousen");
exit(1);
}
fprintf(stdout, "libusb_open okn");
}
/* free device list */
libusb_free_device_list(devs, 1);
/* claim interface */
libusb_set_auto_detach_kernel_driver(dev_handle, 1);
err = libusb_claim_interface(dev_handle, interface_num);
if (err)
{
fprintf(stderr, "failed to libusb_claim_interfacen");
exit(1);
}
fprintf(stdout, "libusb_claim_interface okn");
/* libusb_interrupt_transfer */
while (1)
{
err = libusb_interrupt_transfer(dev_handle, endpoint, buffer, 16, &transferred, 5000);
if (!err) {
/* parser data */
printf("%04d datas: ", count++);
for (int i = 0; i < transferred; i++)
{
printf("%02x ", buffer[i]);
}
printf("n");
} else if (err == LIBUSB_ERROR_TIMEOUT){
fprintf(stderr, "libusb_interrupt_transfer timoutn");
} else {
fprintf(stderr, "libusb_interrupt_transfer err : %dn", err);
//exit(1);
}
}
/* libusb_close */
libusb_release_interface(dev_handle, interface_num);
libusb_close(dev_handle);
libusb_exit(NULL);
}
2.2 上机实验
2.2.1 在 Ubuntu 上实验
// 1. 安装开发包
$ sudo apt install libusb-1.0-0-dev
// 2. 修改源码,包含libusb.h 头文件时用如下代码
#include < libusb-1.0/libusb.h >
// 3. 编译程序指定库
gcc -o readmouse readmouse.c -lusb-1.0
2.2.2 在 IMX6ULL 开发板上实验
- 交叉编译 libusb
sudo apt-get install libtool unzip libusb-1.0.26.zip cd libusb-1.0.26 ./autogen.sh ./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/tmp make make install ls tmp/ include lib
- 安装库、头文件到工具链的目录里
libusb-1.0.26/tmp/lib$ cp * -rfd /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/ libusb-1.0.26/tmp/include$ cp libusb-1.0 -rf /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/
- 交叉编译 app
arm-buildroot-linux-gnueabihf-gcc -o readmouse.c -lusb-1.0
- 在开发板上插入 USB 鼠标,执行命令
./readmouse
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
接口
+关注
关注
33文章
8441浏览量
150704 -
usb
+关注
关注
60文章
7872浏览量
263657 -
鼠标
+关注
关注
6文章
588浏览量
39689
发布评论请先 登录
相关推荐
读取鼠标传感器遇到问题求解决!!
不能读取到移动的数据(不管怎么动鼠标,读取到数据就是不动,从红色LED可以看出芯片检测到移动了),找了很久的问题还是不行,所以来到论坛找找大
发表于 02-28 01:15
STM32读取鼠标芯片<原相的PAN3204>移动数据的问题
不能读取到移动的数据(不管怎么动鼠标,读取到数据就是不动,从红色LED可以看出芯片检测到移动了),找了很久的问题还是不行,所以来这个论坛找找
发表于 02-28 13:35
嵌入式设备鼠标接口的设计与实现
接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标
发表于 12-14 10:58
基于PS/2鼠标接口单片机输入设备的实现
基于PS/2鼠标接口单片机输入设备的实现:详细介绍了PS/2鼠标/键盘接口的工作原理.提出了基于PS/2接口的三键
发表于 10-27 18:30
•82次下载
通过I2C兼容接口读取ADC数据
本应用笔记讨论了通过I2C兼容接口读取多字节数据时需要特别注意的地方。介绍了每次读取一个字节时容易出现的问题,并给出了几个具体示例。本文也描述了进行
发表于 08-26 22:13
•874次阅读
鼠标PS2接口改USB方法
现在,大多数最新的笔记本电脑已经放弃了PS2接口,但是很多用户都是要外接鼠标的,特别是要求效率高的或者是作图用途的用户更是如此。这就有一个问题了,以前买的PS2接口的鼠标用不上了,一个
评论