[libhid-discuss] moving from hiddev/ioctl to libhid

Andreas Holzhammer - GMX andreas.holzhammer at gmx.de
Tue Dec 21 12:30:17 UTC 2010


Hi,

I'm trying to adapt a USB LCD driver (graphlcd, dm140gink) from using 
direct ioctls to a libhid based solution.

Unfortunately I can't get the dm140gink to accept the data I send. The 
original driver can be found at 
http://developer.berlios.de/patch/download.php?id=2627.

I've modified test_libhid.c to access my LCD display, and get the 
following paths:

device identification of HIDInterface 002/004[0]:
   dev_handle:    0x09a50580
   device:        0x09a4b178
   location:      002/004
   manufacturer:  DM-140GINK Demo
   product:       DM-140GINK Demo
   TRACE: hid_reset_parser(): resetting the HID parser for USB device 
002/004[0]...
   TRACE: hid_dump_tree(): iterating the parse tree for USB device 
002/004[0]...
parse tree of HIDInterface 002/004[0]:
   path: 0xffa00001.0xffa00002.0xffa10003; type: 0x80
   path: 0xffa00001.0xffa00002.0xffa10004; type: 0x80
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x80
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x80
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x80
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x80
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x80
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x80
   path: 0xffa00001.0xffa00002.0xffa10005; type: 0x90
   path: 0xffa00001.0xffa00002.0xffa10006; type: 0x90
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x90
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x90
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x90
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x90
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x90
   path: 0xffa00001.0xffa00002.0x00000000; type: 0x90
   TRACE: hid_reset_parser(): resetting the HID parser for USB device 
002/004[0]...

Then I added a first output command to test_libhid.c to send the the 
first initialisation command (taken from the above source, "panelCmd") 
to the device:

    unsigned char const PATHLEN = 3;
    int const PATH_IN[] = { 0xffa00001, 0xffa00002, 0xffa10003 };
    int const PATH_OUT[] = { 0xffa00001, 0xffa00002, 0xffa10005 };
    unsigned char const SEND_PACKET_LEN = 8;
    char const PACKET[]  = {0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
    ret = hid_set_output_report(hid, PATH_OUT, PATHLEN, PACKET, 
SEND_PACKET_LEN);
    if (ret != HID_RET_SUCCESS) {
      fprintf(stderr, "hid_set_output_report failed with return code 
%d\n", ret);
    }

But this command times out:

   TRACE: hid_set_output_report(): looking up report ID...
   TRACE: hid_prepare_parse_path(): preparing search path of depth 3 for 
parse tree of USB device 002/004[0]...
   TRACE: hid_prepare_parse_path(): search path prepared for parse tree 
of USB device 002/004[0].
  NOTICE: hid_find_object(): found requested item.
   TRACE: hid_set_output_report(): sending report ID 0x00 (length: 8) to 
USB device 002/004[0]...
WARNING: hid_set_output_report(): failed to send report to USB device 
002/004[0]:error sending control message: Connection timed out.
hid_set_output_report failed with return code 19
   TRACE: hid_close(): closing USB device 002/004[0]...

I've also tried to only pass 0xffa10005 as PATH, as suggested in the 
original code (in the SendReport function).

Not sure, but this might be related to the original drivers 
initialisation code, which I have no idea how to implement in libhid:
     //******************************************************
     // Initialize the internal report structures
     //******************************************************
     if(ioctl(fd, HIDIOCINITREPORT,0)<0)

Unfortunaltey I don't have any documentation on the DM140gink device, so 
I have to rely on the existing graphlcd source code (which doesn't 
provide access to some of the features of the LCD).

Any help greatly appreciated.

Thanks,

Andreas



More information about the libhid-discuss mailing list