Discussion:
[libhid-discuss] Problem when read and write to USB HID device
I Ketut Mustika Wiguna
2009-05-08 02:24:40 UTC
Permalink
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>
Peter Stuge
2009-05-12 00:21:41 UTC
Permalink
Hello,
Post by I Ketut Mustika Wiguna
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.
That is not possible.

USB is a protocol with many(!!) layers.

They should be understood to be used best.

That said, in Linux, you can try using the hidraw API. There isn't a
lot of documentation even in the kernel sources, but use google and
you'll find some. One particular project is about the PS3 controller.
It has some source code which should be easy to understand.


//Peter

Loading...