2009-05-08 8 views
3

Je souhaite écrire et lire une réponse du périphérique USB HID sous Linux à l'aide de la bibliothèque d'espace utilisateur. Googling pendant un moment, j'ai trouvé que libhid sera une solution au problème.lors de la lecture et de l'écriture sur USB en utilisant libhid

Alors, quand je hid_interrupt_write et hid_interrupt_read pour envoyer et recevoir des données, cette erreur est survenue:

error submitting URB: No such file or directory 

Mais quand j'ai essayé d'utiliser hid_set_output_report et hid_get_input_report pour écrire et lire à partir du périphérique, cette erreur est survenue:

error sending control message: Connection timed out. 

et

error submitting URB: No such file or directory 

et, je ne suis pas sûr comment obtenir le Usage_Path.

Quelqu'un peut-il m'aider avec ce problème? Aucune suggestion?

Voici mon code source et son résultat lors de l'exécution:

#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; 
} 

Résultat:

# ./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. 

Répondre

0

Libhid est construit sur libusb. Et honnêtement, libusb est une bien meilleure bibliothèque. Il est très facile de communiquer dans les deux sens. En fait, si vous êtes intéressé, je peux vous envoyer un exemple de programme qui lit et écrit sur un appareil HID. Libhid nécessite beaucoup plus d'efforts et la documentation est bien pire. Bien sûr, vous devez vous assurer que vous écrivez sur le bon périphérique (en vérifiant le produit et l'identifiant du fournisseur) et en envoyant les paquets corrects au bon chemin si vous utilisez libhid. (Il existe trois chemins: entrée, sortie et fonctionnalité).

Je suggère vraiment d'utiliser libusb cependant.

Questions connexes