2009-05-08 30 views
3

ユーザスペースライブラリを使用してLinuxのUSB HIDデバイスからの応答を書き込み、読み取る必要があります。グーグルでしばらくの間、私はlibhidが問題の解決策になることを発見しました。libhidを使用してUSBに読み書きするとき

error submitting URB: No such file or directory 

をしかし、私は書いて、デバイスからの読み取りにhid_set_output_reporthid_get_input_reportを使用しようとしたときに、このエラーが発生しました:

だから私は、データを送受信するためにhid_interrupt_writehid_interrupt_readを使用する場合、このエラーが発生しました:

error sending control message: Connection timed out. 

error submitting URB: No such file or directory 

と、私はUsage_Pathを取得する方法がわかりません。

誰でもこの問題を解決できますか?助言がありますか?実行時にここで

は、私のソースコードとその結果である:

#include <hid.h> 
#include <stdio.h> 
#include <string.h> 


#define EP_HID_IN    0x81 
#define EP_HID_OUT   0x02 
#define PACKET_INT_LEN   8 

char command[8]; 
char answer[8]; 

const int PATHLEN = 2; 
int const PATH_IN[2] = { 0xffff0001, 0xffff0003 }; 
int const PATH_OUT[2] = {0xffff0001, 0xffff0005 }; 

const int SEND_PACKET_LEN = 8; 
const int RECV_PACKET_LEN = 8; 

bool match_serial_number(struct usb_dev_handle* usbdev, void* custom, unsigned int len) 
{ 
    bool ret; 
    char* buffer = (char*)malloc(len); 
    usb_get_string_simple(usbdev, usb_device(usbdev)->descriptor.iSerialNumber, 
     buffer, len); 
    ret = strncmp(buffer, (char*)custom, len) == 0; 
    free(buffer); 
    return ret; 
} 

int main(void) 
{ 
    HIDInterface* hid; 
    hid_return ret; 
    int i = 0; 

    HIDInterfaceMatcher matcher = { 0x03eb, 0x4b4e, NULL, NULL, 0 }; 

    /* see include/debug.h for possible values */ 
    hid_set_debug(HID_DEBUG_ALL); 
    hid_set_debug_stream(stderr); 
    /* passed directly to libusb */ 
    hid_set_usb_debug(1); 

    ret = hid_init(); 
    if (ret != HID_RET_SUCCESS) { 
    fprintf(stderr, "hid_init failed with return code %d\n", ret); 
    return 1; 
    } 

    hid = hid_new_HIDInterface(); 
    if (hid == 0) { 
    fprintf(stderr, "hid_new_HIDInterface() failed, out of memory?\n"); 
    return 1; 
    } 

    ret = hid_force_open(hid, 0, &matcher, 3); 
    if (ret != HID_RET_SUCCESS) { 
    fprintf(stderr, "hid_force_open failed with return code %d\n", ret); 
    return 1; 
    } 

    ret = hid_write_identification(stdout, hid); 
    if (ret != HID_RET_SUCCESS) { 
    fprintf(stderr, "hid_write_identification failed with return code %d\n", ret); 
    return 1; 
    } 

    ret = hid_dump_tree(stdout, hid); 
    if (ret != HID_RET_SUCCESS) { 
    fprintf(stderr, "hid_dump_tree failed with return code %d\n", ret); 
    return 1; 
    } 

    // Set command, 
    command[0] = 0x03; 
     command[1] = 0x01;  
     command[2] = 0x31; 
     command[3] = 0x31;   
     command[4] = 0x04; 
     command[5] = 0x00; 
     command[6] = 0x00; 
     command[7] = 0x00; 
/* 

    ret = hid_set_output_report(hid, PATH_IN, PATHLEN, command, SEND_PACKET_LEN); 
    if (ret != HID_RET_SUCCESS) { 
    fprintf(stderr, "hid_set_output_report failed with return code %d\n", ret); 
    } 
    ret = hid_get_input_report(hid, PATH_OUT, PATHLEN, answer, RECV_PACKET_LEN); 
     if (ret != HID_RET_SUCCESS) { 
     fprintf(stderr, "hid_get_input_report failed with return code %d\n", ret); 
     } 
    */ 
    ret = hid_interrupt_write(hid, EP_HID_OUT, command, PACKET_INT_LEN, 20); 
    if (ret < 0) { 
     printf("error in interrupt write\n"); 
     return 1; 
     } 
    printf("Reading interrupt\n"); 
    ret = hid_interrupt_read(hid, EP_HID_IN, answer, PACKET_INT_LEN, 4); 
    if(ret < 0) { 
    printf("error interrupt read\n"); 
    return 1; 
    } 

    printf("Interrupt Transfer Loop Test Result:\n"); 
    for(i = 0;i < PACKET_INT_LEN; i++) { 
     if(i%8 == 0) 
     printf("\n"); 
     printf("%02x; ",command[i]); 
    } 
    printf("\n"); 
    printf("\n"); 
    for(i = 0;i < PACKET_INT_LEN; i++) { 
     if(i%8 == 0) 
     printf("\n"); 
     printf("%02x; ",answer[i]); 
    } 
    printf("\n"); 
    printf("\n"); 

    ret = hid_close(hid); 
    if (ret != HID_RET_SUCCESS) { 
    fprintf(stderr, "hid_close failed with return code %d\n", ret); 
    return 1; 
    } 

    hid_delete_HIDInterface(&hid); 

    ret = hid_cleanup(); 
    if (ret != HID_RET_SUCCESS) { 
    fprintf(stderr, "hid_cleanup failed with return code %d\n", ret); 
    return 1; 
    } 

    return 0; 
} 

結果:

# ./test_libhid 
usb_set_debug: Setting debugging level to 1 (on) 
NOTICE: hid_init(): libhid 0.2.15+20060325.0.0 is being initialized. 
    TRACE: hid_init(): initialising USB subsystem... 
usb_os_init: Found USB VFS at /dev/bus/usb 

... 
... 
device identification of HIDInterface 002/009[0]: 
    dev_handle: 0x09a52098 
    device:  0x09a55068 
    location:  002/009 
    manufacturer: ATMEL 
    product:  Firmware Demo 
    TRACE: hid_reset_parser(): resetting the HID parser for USB device 002/009[0]... 
    TRACE: hid_dump_tree(): iterating the parse tree for USB device 002/009[0]... 
parse tree of HIDInterface 002/009[0]: 
    path: 0xffff0001.0xffff0002; type: 0x80 
    path: 0xffff0001.0xffff0003; type: 0x80 
    path: 0xffff0001.0x00000000; type: 0x80 
    path: 0xffff0001.0x00000000; type: 0x80 
    path: 0xffff0001.0x00000000; type: 0x80 
    path: 0xffff0001.0x00000000; type: 0x80 
    path: 0xffff0001.0x00000000; type: 0x80 
    path: 0xffff0001.0x00000000; type: 0x80 
    path: 0xffff0001.0xffff0004; type: 0x90 
    path: 0xffff0001.0xffff0005; type: 0x90 
    path: 0xffff0001.0x00000000; type: 0x90 
    path: 0xffff0001.0x00000000; type: 0x90 
    path: 0xffff0001.0x00000000; type: 0x90 
    path: 0xffff0001.0x00000000; type: 0x90 
    path: 0xffff0001.0x00000000; type: 0x90 
    path: 0xffff0001.0x00000000; type: 0x90 
    path: 0xffff0001.0xffff0006; type: 0xb0 
    path: 0xffff0001.0xffff0007; type: 0xb0 
    path: 0xffff0001.0x00000000; type: 0xb0 
    path: 0xffff0001.0x00000000; type: 0xb0 
    TRACE: hid_reset_parser(): resetting the HID parser for USB device 002/009[0]... 
    TRACE: hid_set_output_report(): looking up report ID... 
    TRACE: hid_prepare_parse_path(): preparing search path of depth 2 for parse tree of USB device 002/009[0]... 
    TRACE: hid_prepare_parse_path(): search path prepared for parse tree of USB device 002/009[0]. 
NOTICE: hid_find_object(): found requested item. 
    TRACE: hid_set_output_report(): sending report ID 0x00 (length: 8) to USB device 002/009[0]... 
WARNING: hid_set_output_report(): failed to send report to USB device 002/009[0]:error sending control message: Connection timed out. 
hid_set_output_report failed with return code 19 
Reading interrupt 
    TRACE: hid_interrupt_read(): retrieving interrupt report from device 002/009[0] ... 
WARNING: hid_interrupt_read(): failed to get interrupt read from device 002/009[0]: error submitting URB: No such file or directory 
Interrupt Transfer Loop Test Result: 

03; 01; 31; 31; 04; 00; 00; 00; 


00; 00; 00; 00; 00; 00; 00; 00; 

    TRACE: hid_close(): closing USB device 002/009[0]... 
    TRACE: hid_close(): closing handle of USB device 002/009[0]... 
NOTICE: hid_close(): successfully closed USB device 002/009[0]. 
    TRACE: hid_reset_parser(): resetting the HID parser for USB device 002/009[0]... 
    TRACE: hid_close(): freeing memory allocated for HID parser... 
    TRACE: hid_close(): resetting HIDInterface... 
NOTICE: hid_cleanup(): successfully deinitialised HID library. 

答えて

0

Libhidはのlibusbの上に構築されます。正直なところ、libusbははるかに優れたライブラリです。それは、前後に通信することを非常に容易にする。実際に興味があれば、HIDデバイスの読み書きを行うサンプルプログラムを送付することができます。

リビッドにはもっと多くの労力がかかり、ドキュメンテーションはさらに悪化しています。

もちろん、正しいデバイスに書いていることを確認し(製品とベンダーIDを確認して)、正しいパケットを正しいパスに送信する必要があります(libhidを使用している場合)。 (入力、出力、およびフィーチャーの3つのパスがあります)。

私は本当にlibusbを使用することをお勧めします。

関連する問題