I Ketut Mustika Wiguna
2009-05-08 02:24:40 UTC
Hello Everyone,
I am new to libhid and in USB device.
I have problem when I try to write and read data to the USB HID device, actually, I just want to read and write data to the USB.
When I use? "hid_interrupt_write" and? "hid_interrupt_read" to send and receive data, this error occured: error submitting URB: No such file or directory
But when I try to use "hid_set_output_report" and "hid_get_input_report" to write and read from the device, these error occured: error sending control message: Connection timed out. And error submitting URB: No such file or directory
and,? I am not sure how to get the Usage_Path.
Could anyone help me in this problem?
Thanks for your help
With regards,
I Ketut Mustika Wiguna
Here are my source code and its result when executed:
#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, USB_ENDPOINT_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;
}
Result:
# ./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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.alioth.debian.org/pipermail/libhid-discuss/attachments/20090507/b6b3b9b9/attachment.htm>
I am new to libhid and in USB device.
I have problem when I try to write and read data to the USB HID device, actually, I just want to read and write data to the USB.
When I use? "hid_interrupt_write" and? "hid_interrupt_read" to send and receive data, this error occured: error submitting URB: No such file or directory
But when I try to use "hid_set_output_report" and "hid_get_input_report" to write and read from the device, these error occured: error sending control message: Connection timed out. And error submitting URB: No such file or directory
and,? I am not sure how to get the Usage_Path.
Could anyone help me in this problem?
Thanks for your help
With regards,
I Ketut Mustika Wiguna
Here are my source code and its result when executed:
#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, USB_ENDPOINT_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;
}
Result:
# ./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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.alioth.debian.org/pipermail/libhid-discuss/attachments/20090507/b6b3b9b9/attachment.htm>