簡體   English   中英

檢查某個USB端口以獲取C Linux上的設備fd

[英]Check certain USB port to get device fd on C Linux

我正在編寫一個程序,檢查每個/dev/input/eventX並使用ioctl我可以獲得它的功能並檢查它是什么(鼠標,鍵盤,觸摸屏)。

現在我需要檢查某些USB輸出(端口)是否連接了設備,我打開它並執行與/dev/input/eventX 我在/sys/bus/usb/devices/找到一些符號鏈接,這里看起來像是關於USB端口的商店信息,但我不確定。 我嘗試用libudev打開它,但它尋找子系統“USB”中的所有文件,但我只需要例如/sys/bus/usb/devices/3-2/

我需要的:

  1. 檢查某個USB端口(只有我在定義的某處硬編碼或通過命令行)
  2. 如果設備已連接,請打開dev的fd並使用ioctl獲取信息
  3. 如果它(例如鼠標)程序開始工作,否則它說找不到設備...

這將足以描述如何做到這一點我不需要完整的代碼。

只需要普通的C就可以使用像libudev這樣的lib

我找到一個適合我的任務的解決方案,可能也是對它的幫助,所以我在這里留下這個例子。 我使用libudev庫

我找到一些例子並稍微改變一下:

1)創建枚舉並添加子系統:

enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, "input");

您可以在該文件夾中的ls /sys/class中查找子系統,我沒有看到input ,只是嘗試添加其工作。

2)使用foreach獲取每個列表條目和列表:

list = udev_enumerate_get_list_entry(enumerate);

    udev_list_entry_foreach(node, list) 
    {
        char *str = NULL;
        path = udev_list_entry_get_name(node);
        dev = udev_device_new_from_syspath(udev, path);
        if  (str = strstr(path, REQUESTED_USB_PORT))
        {
             if (str = strstr(str, "event"))
             {
                  dev_path = strdup(udev_device_get_devnode(dev));
                  udev_device_unref(dev);
                  break;
             }
        }
        udev_device_unref(dev);
    }

所以在這里我們收到這樣的路徑:

/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/0003:046D:C31C.0005/input/input9
/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/0003:046D:C31C.0005/input/input9/event6

為什么我要告訴你兩條路? 因為你可以看到它的返回字符串看起來是一樣的,但我們只需要一個,其中顯示了eventX。
REQUESTED_USB_PORT它是一個定義端口你需要檢查我的情況"1-1.6:1.0"

很多方法找到你需要的端口我停在cat /proc/bus/input/devices

它顯示每個設備的輸出:

I: Bus=0003 Vendor=046d Product=c31c Version=0110
N: Name="Logitech USB Keyboard"
P: Phys=usb-0000:00:1a.0-1.6/input0
S: Sysfs=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/0003:046D:C31C.0005/input/input9
U: Uniq=
H: Handlers=sysrq kbd event6 leds 
B: PROP=0
B: EV=120013
B: KEY=1000000000007 ff9f207ac14057ff febeffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=1f

另一個步驟是獲取/dev/input/eventX你可以使用udev_device_get_devnode()函數獲取它,該函數返回帶路徑的字符串。

所以我寫了我的get_devinfo_fromusb() ,上面的代碼我發布了返回字符串與/dev/input/eventXNULL如果它不是NULL我做這樣的事情:

調用另一個函數並將device_path作為參數傳遞

int get_dev_type(char *dev_event_path)
{
    int dev_fd;
    unsigned long eventBits = 0;

    if ((dev_fd = open(dev_event_path, O_RDONLY)) < 0)
    {
        puts("Dont have access to open file {%s}");
        puts("Run as root");
        exit(1);
    }
    ioctl(dev_fd, EVIOCGBIT(0, EV_MAX), &eventBits);

    if (((eventBits >> EV_KEY) & 1) &&
        ((eventBits >> EV_SYN) & 1) &&
        ((eventBits >> EV_REL) & 1) &&
        ((eventBits >> EV_MSC) & 1)) {
        puts("look like mouse");
        close(dev_fd);
        return (MOUSE_TYPE);
    }

    if (((eventBits >> EV_KEY) & 1) &&
        ((eventBits >> EV_LED) & 1) &&
        ((eventBits >> EV_REP) & 1)) {
        puts("looks like kbd");
        close(dev_fd);
        return (KBD_TYPE);
}

}

我認為這些小例子足以弄清楚發生了什么。 因此,您可以檢查某些USB端口並獲取有關該設備(鼠標或鍵盤)的信息,您還可以檢查耳機觸摸屏等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM