[libhid-discuss] setting output problems

Hans-Christoph Steiner hans at eds.org
Mon May 5 11:15:26 UTC 2008


So I worked on this stuff a bit more.  I haven't found a lot that is  
conclusive, but I did find one thing: with the exact same  
test_libhid.c code, the same device, and the same version of libhid  
(0.2.16), hid_interrupt_write() worked fine on GNU/Linux but did not  
work on Mac OS X 10.4.11/Intel at all.

Has anyone successfully used hid_interrupt_write() on Mac OS X?  I  
would be interested in helping debug this, if any of the libhid devs  
have time.

.hc

On May 3, 2008, at 7:18 PM, Hans-Christoph Steiner wrote:

>
> On May 3, 2008, at 4:58 PM, Charles Lepple wrote:
>
>> On May 3, 2008, at 9:05 AM, Hans-Christoph Steiner wrote:
>>
>>> Here's hid_set_output_report():
>>>
>>>    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 004/003-0925-1299-00-00[0]...
>>>    TRACE: hid_prepare_parse_path(): search path prepared for parse
>>> tree of USB device 004/003-0925-1299-00-00[0].
>>>   NOTICE: hid_find_object(): found requested item.
>>>    TRACE: hid_set_output_report(): sending report ID 0x00  
>>> (length: 2)
>>> to USB device 004/003-0925-1299-00-00[0]...
>>> usb_control_msg: 33 9 512 0 0xbffff140 2 10000
>>>   NOTICE: hid_set_output_report(): successfully sent report to USB
>>> device 004/003-0925-1299-00-00[0].
>>> wrote 0 0
>>
>> Not sure why this doesn't work, but if the device firmware doesn't
>> signal an error, then there's not much that libhid can do.
>>
>> I'll have to check and see if we can provide a little more debug
>> output there. Are you using the SVN trunk of libhid?
>>
>>> Here's the error I get for hid_interrupt_write():
>>>
>>> [usbhid] write failed with return code 21: HID_RET_FAIL_GET_REPORT
>>
>> Hmm, that error code is misleading.
>>
>>> wrote 1 1
>>>    TRACE: hid_interrupt_write(): writing interrupt report to device
>>> 004/003-0925-1299-00-00[0] ...
>>> libusb/darwin.c ep_to_pipeRef: Converting ep address to pipeRef.
>>> libusb/darwin.c ep_to_pipeRef: No pipeRef found with endpoint  
>>> address
>>> 0x01.
>>> USB error: libusb/darwin.c usb_bulk_transfer: Invalid pipe reference
>>> USB error: usb_bulk_write: An error occured during write (see
>>> messages above)
>>
>> That error message is coming from libusb - it can't seem to find the
>> "interrupt out" endpoint. (Strange, since it does seem to be defined
>> after endpoint 0x01.)
>>
>> What version of libusb are you using?
>>
>> I don't know offhand if the USB spec mandates that the endpoint
>> descriptors be in ascending order (that is, output before input since
>> the output address is 0x01, and input is 0x81) but if you have
>> control over the firmware, that's something you could try.
>
> Ok, I got something more concrete working, this time instead with a  
> Logitech iFeel mouse.  It works fine with hid_set_output_report(),  
> but I can't seem to get it working with hid_interrupt_write().  I  
> get the same error as above.  I am using libhid 0.2.16 and libusb  
> 0.1.12 on Mac OS X 10.4.11/Intel.  I tried hid_interrupt_write()  
> using 7 bytes and 8 bytes, since the Max Packet Size says 8.  7  
> bytes of data worked with hid_set_output_report().  Here's the code  
> for the iFeel (in test_libhid.c):
>
> int path[] ={0x00010002, 0x00000000, 0xff000002}; // iFeel
> unsigned int const depth = 3;  // number of 32bit chunks in the path
> unsigned char const SEND_PACKET_LEN = 8; // number of bytes in packet
> char PACKET[] = {0x11, 0x0a, 0xff, 0x0f, 0x00, 0xff, 0x00,  
> 0x00}; // the data to write
> unsigned int const timeout = 1000;
> int i;
>
>     ret = hid_set_output_report(hid, path, depth, PACKET,  
> SEND_PACKET_LEN);
> //    ret = hid_interrupt_write(hid, 0x01, PACKET, SEND_PACKET_LEN,  
> timeout);
>     if (ret != HID_RET_SUCCESS) {
>         fprintf(stderr, "[usbhid] write failed with return code %d:  
> %s\n", ret,
>                 hid_return_string(ret));
>     }
>
>     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;
>
>
>
>
> And here's the USB Prober output for that device:
>
>
>
> Low Speed device @ 2  
> (0x1D100000): .............................................    
> Composite device: "iFeel Mouse   "
>     Device Descriptor
>         Descriptor Version Number:   0x0100
>         Device Class:   0   (Composite)
>         Device Subclass:   0
>         Device Protocol:   0
>         Device MaxPacketSize:   8
>         Device VendorID/ProductID:   0x046D/0xC030   (Logitech Inc.)
>         Device Version Number:   0x0101
>         Number of Configurations:   1
>         Manufacturer String:   4 "Logitech Inc."
>         Product String:   32 "iFeel Mouse   "
>         Serial Number String:   0 (none)
>     Configuration Descriptor
>         Length (and contents):   41
>             Raw Descriptor (hex)    0000: 09 02 29 00 01 01 00 A0   
> FA 09 04 00 00 02 03 01
>             Raw Descriptor (hex)    0010: 02 00 09 21 00 01 21 01   
> 22 4A 00 07 05 81 03 08
>             Raw Descriptor (hex)    0020: 00 0A 07 05 01 03 08 00  0A
>         Number of Interfaces:   1
>         Configuration Value:   1
>         Attributes:   0xA0 (bus-powered, remote wakeup)
>         MaxPower:   500 ma
>         Interface #0 - HID/Boot Interface
>             Alternate Setting   0
>             Number of Endpoints   2
>             Interface Class:   3   (HID)
>             Interface Subclass;   1   (Boot Interface)
>             Interface Protocol:   2
>             HID Descriptor
>                 Descriptor Version Number:   0x0100
>                 Country Code:   33
>                 Descriptor Count:   1
>                 Descriptor 1
>                     Type:   0x22  (Report Descriptor)
>                     Length (and contents):   74
>                         Raw Descriptor (hex)    0000: 05 01 09 02  
> A1 01 A1 02  05 09 19 01 29 03 15 00
>                         Raw Descriptor (hex)    0010: 25 01 75 01  
> 95 03 81 02  95 05 06 00 FF 09 01 81
>                         Raw Descriptor (hex)    0020: 02 05 01 09  
> 01 A1 00 15  81 25 7F 75 08 95 02 09
>                         Raw Descriptor (hex)    0030: 30 09 31 81  
> 06 C0 09 38  95 01 81 06 C0 A1 02 06
>                         Raw Descriptor (hex)    0040: 00 FF 09 02  
> 95 07 91 02  C0 C0
>                     Parsed Report Descriptor:
>                           Usage Page    (Generic Desktop)
>                           Usage (Mouse)
>                               Collection (Application)
>                                     Collection (Logical)
>                                       Usage Page    (Button)
>                                       Usage Minimum...........    (1)
>                                       Usage Maximum...........    (3)
>                                       Logical Minimum.........    (0)
>                                       Logical Maximum.........    (1)
>                                       Report Size.............    (1)
>                                       Report Count............    (3)
>                                       Input...................    
> (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No  
> Null Position, Bitfield)
>                                       Report Count............    (5)
>                                       Usage Page    (65280)
>                                       Usage 1 (0x1)
>                                       Input...................    
> (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No  
> Null Position, Bitfield)
>                                       Usage Page    (Generic Desktop)
>                                       Usage (Pointer)
>                                           Collection (Physical)
>                                             Logical  
> Minimum.........    (-127)
>                                             Logical  
> Maximum.........    (127)
>                                             Report  
> Size.............    (8)
>                                             Report  
> Count............    (2)
>                                             Usage (X)
>                                             Usage (Y)
>                                              
> Input...................   (Data, Variable, Relative, No Wrap,  
> Linear, Preferred State, No Null Position, Bitfield)
>                                           End Collection
>                                       Usage (Wheel)
>                                       Report Count............    (1)
>                                       Input...................    
> (Data, Variable, Relative, No Wrap, Linear, Preferred State, No  
> Null Position, Bitfield)
>                                     End Collection
>                                     Collection (Logical)
>                                       Usage Page    (65280)
>                                       Usage 2 (0x2)
>                                       Report Count............    (7)
>                                       Output..................    
> (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No  
> Null Position, Nonvolatile, Bitfield)
>                                     End Collection
>                               End Collection
>             Endpoint 0x81 - Interrupt Input
>                 Address:   0x81  (IN)
>                 Attributes:   0x03  (Interrupt no synchronization  
> data endpoint)
>                 Max Packet Size:   8
>                 Polling Interval:   10 ms
>             Endpoint 0x01 - Interrupt Output
>                 Address:   0x01  (OUT)
>                 Attributes:   0x03  (Interrupt no synchronization  
> data endpoint)
>                 Max Packet Size:   8
>                 Polling Interval:   10 ms
>
>
> .hc
>
>
> ---------------------------------------------------------------------- 
> ------
>
> News is what people want to keep hidden and everything else is  
> publicity.          - Bill Moyers
>
>





------------------------------------------------------------------------ 
----

'You people have such restrictive dress for women,’ she said,  
hobbling away in three inch heels and panty hose to finish out  
another pink-collar temp pool day.  - “Hijab Scene #2", by Mohja Kahf





More information about the libhid-discuss mailing list