在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用同步接口讀取鼠標(biāo)數(shù)據(jù)的方法

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:韋東山老師驅(qū)動(dòng)大 ? 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鼠標(biāo) */
                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) {
                        /* 找到了輸入的中斷端點(diǎn) */
                        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 上機(jī)實(shí)驗(yàn)

2.2.1 在 Ubuntu 上實(shí)驗(yàn)

// 1. 安裝開發(fā)包
$ sudo apt install libusb-1.0-0-dev
    
// 2. 修改源碼,包含libusb.h 頭文件時(shí)用如下代碼
#include < libusb-1.0/libusb.h >

// 3. 編譯程序指定庫
gcc -o readmouse readmouse.c -lusb-1.0

2.2.2 在 IMX6ULL 開發(fā)板上實(shí)驗(yàn)

  • 交叉編譯 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
    
  • 在開發(fā)板上插入 USB 鼠標(biāo),執(zhí)行命令
    ./readmouse
    
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8992

    瀏覽量

    153670
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8175

    瀏覽量

    272595
  • 鼠標(biāo)
    +關(guān)注

    關(guān)注

    6

    文章

    593

    瀏覽量

    40736
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32讀取鼠標(biāo)芯片<原相的PAN3204>移動(dòng)數(shù)據(jù)的問題

    不能讀取到移動(dòng)的數(shù)據(jù)(不管怎么動(dòng)鼠標(biāo)讀取數(shù)據(jù)就是不動(dòng),從紅色LED可以看出芯片檢測(cè)到移動(dòng)了),找了很久的問題還是不行,所以來這個(gè)論壇找找
    發(fā)表于 02-28 13:35

    PS2鼠標(biāo)使用USB接口的轉(zhuǎn)換器

    鼠標(biāo)與控制器間履行一種雙向同步串行數(shù)據(jù)幀協(xié)議,每幀為11~12Bit,如圖3所示。按照標(biāo)準(zhǔn)的三鍵鼠標(biāo)數(shù)據(jù)包有效
    發(fā)表于 12-06 10:14

    嵌入式設(shè)備鼠標(biāo)接口的設(shè)計(jì)與實(shí)現(xiàn)

    接口采用一種雙向同步串行協(xié)議。即每在時(shí)鐘線上發(fā)一個(gè)脈沖,就在數(shù)據(jù)線上發(fā)送一位數(shù)據(jù)。在相互傳輸中,主機(jī)擁有總線控制權(quán),即它可以在任何時(shí)候抑制鼠標(biāo)
    發(fā)表于 12-14 10:58

    PS/2鼠標(biāo)和單片機(jī)的接口

    鼠標(biāo)有RS232串口和PS/2二種接口,在單片機(jī)應(yīng)用中,由于PS/2鼠標(biāo)是1yrL電平,和單片接口更方便,通常PS/2鼠標(biāo)控制芯片采用TP8
    發(fā)表于 10-22 23:00 ?121次下載
    PS/2<b class='flag-5'>鼠標(biāo)</b>和單片機(jī)的<b class='flag-5'>接口</b>

    鼠標(biāo)接口

    鼠標(biāo)接口7.1   鼠標(biāo)的工作原理1.  鼠標(biāo)分機(jī)械式鼠標(biāo)和光電式鼠標(biāo)
    發(fā)表于 06-12 22:18 ?43次下載

    基于PS/2鼠標(biāo)接口單片機(jī)輸入設(shè)備的實(shí)現(xiàn)

    基于PS/2鼠標(biāo)接口單片機(jī)輸入設(shè)備的實(shí)現(xiàn):詳細(xì)介紹了PS/2鼠標(biāo)/鍵盤接口的工作原理.提出了基于PS/2接口的三鍵
    發(fā)表于 10-27 18:30 ?82次下載

    PS 2鼠標(biāo)接口轉(zhuǎn)串行鼠標(biāo)轉(zhuǎn)接器

    PS 2鼠標(biāo)接口轉(zhuǎn)串行鼠標(biāo)轉(zhuǎn)接器 本轉(zhuǎn)換口把一個(gè)串行鼠標(biāo)接到 PS/2 鼠標(biāo)口上,到鼠
    發(fā)表于 11-27 20:08 ?970次閱讀
    PS 2<b class='flag-5'>鼠標(biāo)</b><b class='flag-5'>接口</b>轉(zhuǎn)串行<b class='flag-5'>鼠標(biāo)</b>轉(zhuǎn)接器

    計(jì)算機(jī)鼠標(biāo)接口

    計(jì)算機(jī)鼠標(biāo)接口 目前,市場(chǎng)中的多
    發(fā)表于 07-25 08:15 ?2752次閱讀

    鼠標(biāo)接口類型

    鼠標(biāo)接口類型 接口類型是指鼠標(biāo)與電腦主機(jī)之間相連接的接口方式或類型。目前常見的鼠標(biāo)
    發(fā)表于 12-28 11:26 ?2431次閱讀

    什么是主板PS/2鼠標(biāo)接口

    什么是主板PS/2鼠標(biāo)接口  PS/2鼠標(biāo)接口:現(xiàn)今的一些流行的Pentium
    發(fā)表于 02-05 11:46 ?1612次閱讀

    通過I2C兼容接口讀取ADC數(shù)據(jù)

    本應(yīng)用筆記討論了通過I2C兼容接口讀取多字節(jié)數(shù)據(jù)時(shí)需要特別注意的地方。介紹了每次讀取一個(gè)字節(jié)時(shí)容易出現(xiàn)的問題,并給出了幾個(gè)具體示例。本文也描述了進(jìn)行
    發(fā)表于 08-26 22:13 ?963次閱讀
    通過I2C兼容<b class='flag-5'>接口</b><b class='flag-5'>讀取</b>ADC<b class='flag-5'>數(shù)據(jù)</b>

    KVM遠(yuǎn)程鼠標(biāo)同步方法

    提出一種基于高速USB2.0-HID 類規(guī)范的鼠標(biāo)同步方法。在傳統(tǒng)相對(duì)鼠標(biāo)同步方法中加入自適應(yīng)殘
    發(fā)表于 05-10 11:50 ?7060次閱讀
    KVM遠(yuǎn)程<b class='flag-5'>鼠標(biāo)</b><b class='flag-5'>同步</b><b class='flag-5'>方法</b>

    鼠標(biāo)PS2接口改USB方法

    現(xiàn)在,大多數(shù)最新的筆記本電腦已經(jīng)放棄了PS2接口,但是很多用戶都是要外接鼠標(biāo)的,特別是要求效率高的或者是作圖用途的用戶更是如此。這就有一個(gè)問題了,以前買的PS2接口鼠標(biāo)用不上了,一個(gè)
    的頭像 發(fā)表于 09-17 10:47 ?8.6w次閱讀

    使用鼠標(biāo)失靈時(shí)的解決方法

    步驟一:出現(xiàn)問題的鼠標(biāo)一般以USB接口鼠標(biāo)居多,原因當(dāng)然不外乎鼠標(biāo)自身和USB接口問題了,首先我們來看看是否是
    的頭像 發(fā)表于 07-04 11:21 ?3910次閱讀

    關(guān)于從I2C接口上的ADC讀取數(shù)據(jù)及處理方法

    本應(yīng)用筆記討論了通過I2C兼容接口讀取多字節(jié)數(shù)據(jù)時(shí)需要注意的問題。討論了一次讀取一個(gè)字節(jié)的陷阱,并提供了一些具體示例。本文還介紹了處理此類數(shù)據(jù)
    的頭像 發(fā)表于 01-29 15:53 ?2570次閱讀
    關(guān)于從I2C<b class='flag-5'>接口</b>上的ADC<b class='flag-5'>讀取</b><b class='flag-5'>數(shù)據(jù)</b>及處理<b class='flag-5'>方法</b>
    主站蜘蛛池模板: 免费在线观看a | 视频网站免费 | 黄网站色视频大全免费观看 | 亚洲国产一区二区三区在线观看 | 欧美亚洲三级 | 人人揉揉香蕉大青草 | 久久久美女视频 | 手机看片自拍自拍自拍 | 天天爽夜夜爽天天做夜夜做 | 日本中文字幕在线播放 | 日本免费色视频 | 国产三级精品在线观看 | 欧美黑人巨大日本人又爽又色 | 亚洲精品456人成在线 | 欧美成人免费全部观看天天性色 | 韩国三级理论在线观看视频 | 国产午夜视频高清 | 日本午夜片成年www 日本午夜三级 | 中文字幕第7页 | 在线天堂中文官网 | 拍拍拍成人免费高清视频 | 天堂网www在线 | 一级特黄a免费大片 | 欧美一级欧美三级在线 | 网站黄色在线观看 | 天天草天天干天天 | 国产三级在线观看视频 | 日韩一区二区三区免费 | 91操碰| 人与牲动交xxxbbb | 日本特黄在线观看免费 | a级男女性高爱潮高清试 | 日本加勒比黑人 | 国产欧美精品午夜在线播放 | 美女视频一区二区三区 | 69久久夜色精品国产69小说 | 毛片高清一区二区三区 | 色噜噜亚洲男人的天堂 | 老司机51精品视频在线观看 | www.亚洲色图.com | 日本午夜大片免费观看视频 |