tags:

views:

1258

answers:

1

Hello Everyone,

I want to write and read a response from USB HID device in Linux using user space library. Googling for a while, I found that libhid will be a solution for the problem.

So, 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? or any suggestions?

Thanks for your help

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

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.

With regards,

I Ketut Mustika Wiguna

A: 

Hi

i have problem with libhid too.

i found that there 2 way 4 accessing the usb-hid in linux

1)linux default libraries like input.h and hiddev.h and ... 2)using libhid

i found libhid some confusing and try to use input.h but i have problem with that 2.

i try to use libhid but had know idea how to use it.

can you tell me how you compiled your codes any IDE like eclipse or netbeans or just using terminal and gcc ???????please?????

(((i uses some example like yours and compiled it eith gcc in terminal and that works.

follow me: (i use ubuntu 9.04 and was root)

1))if you don't have libhid do this :

sudo aptitude install libhid-dev build-essential

2))then decompress test_libhid.c :

zcat /usr/share/doc/libhid-dev/examples/test_libhid.c.gz > test_libhid.c

3))then compile your code:

gcc $(pkg-config libhid --cflags --libs) -o test_libhid test_libhid.c

4))run your program :

./test_libhid

5))finish just enjoy and thinks about how to compile this code using eclipse or netbeans or codeblocks or mono.and if you find the solution please tell me because i need it badly.