【问题标题】:Usb mouse driver using LIBUSB使用 LIBUSB 的 USB 鼠标驱动程序
【发布时间】:2014-03-25 17:57:33
【问题描述】:

我想在 Ubuntu 上尝试“用户空间”驱动程序(这不是我的代码)。我有这个代码:

#include <stdio.h>
#include <string.h>
#include <usb.h>
#include <usbpp.h>

#define DEBUG_LEVEL 0

struct usb_bus *busses,*bus,*dbus;

int main(int argc, char *argv[])
{
        struct usb_device *dev;
        char *buf;
        int n,x,r, ret;
        char *ibus, *idev;
        char string[64];
        int found = 0;       
        usb_dev_handle *udev;

        usb_set_debug(DEBUG_LEVEL);

        usb_init(); //initilize the usb library
        usb_find_busses();
        usb_find_devices();
        busses=usb_get_busses();

        //use the command line arguments for Bus and Device
        if (argc >= 3) {
                ibus = argv[1];
                idev = argv[2];
        }
        else { printf("Usage: usbtest <Bus> <Device> [<numBytes>])\n"); exit(1); }

        printf("Bus = %s Device = %s\n", ibus, idev);

        for (bus=busses; bus && (found == 0); bus=bus->next) { // busses loop
                if (strcmp(bus->dirname, ibus) == 0) {
                        for (dev=bus->devices; dev; dev=dev->next) { // devices loop
                                if (strcmp(dev->filename, idev) == 0) { dbus=bus; found=1; break; }
                        }
                }
        }

        if (found == 0) { printf("Unable to find the required device !\nexiting\n"); exit(1); }

        printf("Found device\n");
        printf("Now we are dealing with device from vendor ID : %d (%x) \n",dev->descriptor.idVendor,dev->descriptor.idVendor);
        printf("Trying to open the device...\n");

        if (udev=usb_open(dev)) printf("Device opened successfully.\n");
        else { printf("Operation failed :-("); exit(1);}

        buf=(char*)calloc(1,100);
        if (usb_get_driver_np(udev,0,buf,100)) printf("Could not read the driver name :-( %s\n",buf); 
        else printf("Kernel Using Driver :\n");

        // detach the driver from the kernel , seems to be just like rmmod? 
        if (usb_detach_kernel_driver_np(udev,0)) printf("Error detaching the device :-(\n"); 
        else printf("Device detached successfully from the kernel.\n");

        // reserving the device interface for our application, if another driver/software
        //is using the device , it will return 'interface busy'
        if (r=usb_claim_interface(udev,0)) printf("Interface Claimed !!\n"); 
        printf("Interface Claim Status : %d\n",r);

        printf("Device Protocol : %d\n",dev->descriptor.bDeviceProtocol);
        printf("Report Length : %d\n",dev->descriptor.bLength);
        printf("Decriptor Type : %d\n",dev->descriptor.bDescriptorType);
        printf("End Points : %d\n",dev->config->interface->altsetting->bNumEndpoints);
        printf("Interface Class : %d\n",dev->config->interface->altsetting->bInterfaceClass);
        printf("Protocol : %d\n",dev->config->interface->altsetting->bInterfaceProtocol);
        printf("Interface Number: %d\n",dev->config->interface->altsetting->bInterfaceNumber);
        printf("Device Filename : %s\n",dev->filename);
        printf("Bus Dir Name : %s\n",dbus->dirname);

        usb_get_string_simple(udev,dev->descriptor.iManufacturer,string,sizeof(string));
        printf("Device Manfucaturer : %s\n",string);
        usb_get_string_simple(udev,dev->descriptor.iProduct,string,sizeof(string));
        printf("Product Name : %s\n",string);
        usb_get_string_simple(udev,dev->descriptor.iSerialNumber,string,sizeof(string));
        printf("Device Serial Number: %s\n",string);
        printf("End point addresses : 0x%x\n",dev->config->interface->altsetting->endpoint->bEndpointAddress);

        int numBytes = 4;
        int errCount = 0;
        unsigned char endPoint = 0x81;
    int i;
    int tmp1 = 5;
    int tmp2 = 5;

        // reset usb device if command line numBytes = 0 and exit
        if (argc == 4 && atoi(argv[3]) == 0) { usb_reset(udev); exit(0); }

        // use command line value for numBytes if supplied
        if (argc == 4) numBytes = atoi(argv[3]);
        if (numBytes > 64) numBytes = 64;

        while (1) {  
                for (x=0; x<numBytes; x++)  string[x]=0;

                // read numBytes bytes using interrupt_read,
                r = usb_interrupt_read(udev, endPoint, string, numBytes, 0); 

                system("clear");

        tmp1+=string[1];
        tmp2+=string[2];
        if (tmp1>=0 && tmp2>=0 && tmp1<=150 && tmp2<=50){
        for (i=0;i<tmp2;i++) printf("\n");
        for (i=0;i<tmp1;i++) printf(".");
        if (string[0]==0) printf ("X");
        else if (string[0]==1) printf("L");
        else if(string[0]==2) printf("R");
        else if(string[0]==3) printf("LR");
        else if(string[0]==4) printf("M");
        }
        else {
          if(tmp1<0) tmp1=0;
          else if (tmp1>150) tmp1=150;
          if (tmp2<0) tmp2=0;
          else if (tmp2>50) tmp2=50;
        }
        if (string[3]==1) printf ("\nSCROLL UP");
        if (string[3]==-1) printf ("\nSCROLL DOWN");
        printf ("\n(%d, %d)",tmp1,tmp2);
        if ( r < 0 ) errCount++;
                if (errCount >= 100) break; 

                usb_clear_halt(udev,endPoint); 
        }

        printf("Closing Device.\n");
        usb_release_interface(udev,0);
        usb_close(udev);

        return EXIT_SUCCESS;
}

在此代码中使用来自 libusb-0.1 的 API - 但我不知道它的确切版本。可能 - 它是 libusb-0.1.12(它有两个标头“usb.h”和“usbpp.h”,在此代码中使用)。我已经在 ubuntu 上下载了这个版本,安装它,使用

./configure && make && make install && sudo ldconfig

然后我试着做

gcc -c mouse.c -w

编译这段代码。位它不编译。它在“usbpp.h”中有不同的错误(在标准中包括“字符串”或“列表”)或其他...... 谁能告诉我,我做错了什么?我该如何尝试这段代码? PS - 我尝试在 ubuntu 9.04 和 ubuntu 12> 上测试此代码,两者都作为虚拟机。这是我在大学的任务。

【问题讨论】:

    标签: c++ ubuntu mouse driver libusb


    【解决方案1】:

    usbpp.h 是一个 c++ 头文件,但你运行 gcc,它是一个 c 编译器。改为运行 g++。

    【讨论】:

    • 这是个好主意!但现在由于 libusb 库,我无法获取输出文件。我尝试“g++ -c mouse.cpp”,然后 - “g++ -o mouse mouse.o” - 只有 libusb API 函数有错误。例如 - “mouse.cpp:(.text+0x37): undefined reference to `usb_init'”。我应该如何编译代码?
    • 链接时你必须告诉它也链接 libusb。在命令中添加 -lusb 应该可以解决这个问题。
    • 非常感谢!这是一个非常愚蠢的错误)我使用:“cc -o mouse mouse.cpp -lusb” - 我的文件被编译了!甚至工作..)
    【解决方案2】:

    我找到了另一种方法来解决这个问题:

    gcc -o mouse ./mouse.cpp -lstdc++ -lusb
    

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 2012-12-25
      相关资源
      最近更新 更多