0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用同步接口读取鼠标数据的方法

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:韦东山老师驱动大 2023-07-17 17:42 次阅读

编写源码

#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

    文章

    7640

    浏览量

    148507
  • usb
    usb
    +关注

    关注

    59

    文章

    7436

    浏览量

    258183
  • 鼠标
    +关注

    关注

    5

    文章

    576

    浏览量

    39196
收藏 人收藏

    评论

    相关推荐

    STM32读取鼠标芯片<原相的PAN3204>移动数据的问题

    不能读取到移动的数据(不管怎么动鼠标读取数据就是不动,从红色LED可以看出芯片检测到移动了),找了很久的问题还是不行,所以来这个论坛找找
    发表于 02-28 13:35

    PS2鼠标使用USB接口的转换器

    鼠标与控制器间履行一种双向同步串行数据帧协议,每帧为11~12Bit,如图3所示。按照标准的三键鼠标数据包有效
    发表于 12-06 10:14

    嵌入式设备鼠标接口的设计与实现

    接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标
    发表于 12-14 10:58

    PS/2鼠标和单片机的接口

    鼠标有RS232串口和PS/2二种接口,在单片机应用中,由于PS/2鼠标是1yrL电平,和单片接口更方便,通常PS/2鼠标控制芯片采用TP8
    发表于 10-22 23:00 121次下载
    PS/2<b class='flag-5'>鼠标</b>和单片机的<b class='flag-5'>接口</b>

    鼠标接口

    鼠标接口7.1   鼠标的工作原理1.  鼠标分机械式鼠标和光电式鼠标
    发表于 06-12 22:18 43次下载

    基于PS/2鼠标接口单片机输入设备的实现

    基于PS/2鼠标接口单片机输入设备的实现:详细介绍了PS/2鼠标/键盘接口的工作原理.提出了基于PS/2接口的三键
    发表于 10-27 18:30 81次下载

    PS 2鼠标接口转串行鼠标转接器

    PS 2鼠标接口转串行鼠标转接器 本转换口把一个串行鼠标接到 PS/2 鼠标口上,到鼠
    发表于 11-27 20:08 865次阅读
    PS 2<b class='flag-5'>鼠标</b><b class='flag-5'>接口</b>转串行<b class='flag-5'>鼠标</b>转接器

    鼠标接口类型

    鼠标接口类型 接口类型是指鼠标与电脑主机之间相连接的接口方式或类型。目前常见的鼠标
    发表于 12-28 11:26 1849次阅读

    什么是主板PS/2鼠标接口

    什么是主板PS/2鼠标接口  PS/2鼠标接口:现今的一些流行的Pentium
    发表于 02-05 11:46 1393次阅读

    通过I2C兼容接口读取ADC数据

    本应用笔记讨论了通过I2C兼容接口读取多字节数据时需要特别注意的地方。介绍了每次读取一个字节时容易出现的问题,并给出了几个具体示例。本文也描述了进行
    发表于 08-26 22:13 833次阅读
    通过I2C兼容<b class='flag-5'>接口</b><b class='flag-5'>读取</b>ADC<b class='flag-5'>数据</b>

    KVM远程鼠标同步方法

    提出一种基于高速USB2.0-HID 类规范的鼠标同步方法。在传统相对鼠标同步方法中加入自适应残
    发表于 05-10 11:50 6277次阅读
    KVM远程<b class='flag-5'>鼠标</b><b class='flag-5'>同步</b><b class='flag-5'>方法</b>

    鼠标PS2接口改USB方法

    现在,大多数最新的笔记本电脑已经放弃了PS2接口,但是很多用户都是要外接鼠标的,特别是要求效率高的或者是作图用途的用户更是如此。这就有一个问题了,以前买的PS2接口鼠标用不上了,一个
    的头像 发表于 09-17 10:47 8.2w次阅读

    使用鼠标失灵时的解决方法

    步骤一:出现问题的鼠标一般以USB接口鼠标居多,原因当然不外乎鼠标自身和USB接口问题了,首先我们来看看是否是
    的头像 发表于 07-04 11:21 3315次阅读

    关于从I²C接口上的ADC读取数据及处理方法

    本应用笔记讨论了通过I²C兼容接口读取多字节数据时需要注意的问题。讨论了一次读取一个字节的陷阱,并提供了一些具体示例。本文还介绍了处理此类数据
    的头像 发表于 01-29 15:53 1494次阅读
    关于从I²C<b class='flag-5'>接口</b>上的ADC<b class='flag-5'>读取</b><b class='flag-5'>数据</b>及处理<b class='flag-5'>方法</b>

    关于从I²C接口上的ADC读取数据

    本应用笔记讨论了通过I²C兼容接口读取多字节数据时需要注意的问题。讨论了一次读取一个字节的陷阱,并提供了一些具体示例。本文还介绍了处理此类数据
    的头像 发表于 04-04 10:59 492次阅读
    关于从I²C<b class='flag-5'>接口</b>上的ADC<b class='flag-5'>读取</b><b class='flag-5'>数据</b>