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.