Skip to content
This repository

Dec 13, 2013

  1. linux: Better kernel version detection

    Refactor version detection into a function.
    Handle versions of form X.Y.Z as well as X.Y.
    Don't do workarounds for old kernels if version cannot be detected.
    authored signal11 committed

Nov 01, 2013

  1. Alan Ott

    header: Clarify comment on hid_read() and hid_read_timeout()

    Clarify that a return value of zero means no packet was available.

Oct 06, 2013

  1. Alan Ott

    HIDAPI 0.8.0-rc1

  2. Alan Ott

    autotools: Add mac_support.h to

    Not sure how this got missed.
  3. Alan Ott

    testgui: Remove pre-built testgui executable

    Executables should have never been in the repo to begin with.
  4. Mario Kleiner

    libusb: Fix 'dev' memory leak on hid_init() failure.

    Signed-off-by: Mario Kleiner <>
    authored signal11 committed
  5. Bei Zhang - Ikarienator

    all: Fix license name

    "GNU Public License" does not exist. It is called "GNU General Public
    License", "GNU GPL" or simply "GPL".
    authored signal11 committed

Sep 09, 2013

  1. Alan Ott

    mac: Fix incorrect device list after device removal

    On Mac OS X 10.8.x (Mountain Lion), if a device is connected, opened, then
    closed, then unplugged, subsequent calls to hid_enumerate() will still
    list the device (even though it's been unplugged).  If the device is
    plugged in again, a second instance will show up in the list and often it
    will be impossible to open either.  Github user TamToucan figured out that
    in hid_enumerate() if a call is made to IOHIDManagerSetDeviceMatching()
    before the call to IOHIDManagerCopyDevices() that this will clear the
    Thanks to TamToucan for figuring this out.
  2. Alan Ott

    README: Add build dependencies

    Some build system dependencies were missing from the documentation.
  3. Spencer Oliver

    gitignore: add config.* to .gitignore

    This makes HIDAPI less noisy when used a git submodule.
    Signed-off-by: Spencer Oliver <>
    authored signal11 committed
  4. Hans de Goede

    libusb: Properly wait for transfer cancellation on read_thread() exit

    While triaging libusb bugs, I took an indepth look at:
    This has lead me to the conclusion that there are 2 issues with hidapi's
    libusb code wrt waiting for the transfer cancellation on read_thread()
    1) There is a race where hid_close() can successfully cancel the transfer
    after a read_callback() has submitted it but before read_thread() checks
    shutdown_thread.  If this race is hit, then the libusb_cancel_transfer()
    in read_thread() will fail, causing read_thread() to not call
    libusb_handle_events() to complete the cancelled transfer.  hid_close()
    will then free the transfer, and if later on libusb_handle_events() gets
    called on the same context, it will try to complete the now freed
    transfer.  This is what I believe leads to the segfault described in
    2) hidapi uses one read_thread() per hid_device, so if there are multiple
    hid_devices then there are multiple threads calling
    libusb_handle_events(), in this case there is no guarantee that a single
    libusb_handle_events() call will successfully lead to the cancelled
    transfer being completed.  If the transfer completion is already handled
    by another read_thread() and there are no other events, then the
    libusb_handle_events() call will hang, and thus the pthread_join() and
    thus hidapi_close() will hang.
    As number 2 is a generic problem found in more libusb apps, libusb has
    gotten a new API called libusb_handle_events_completed(), which takes an
    extra pointer to an int, whose contents must be set to nonzero on
    completion by the callback, which allows waiting for the completion of a
    specific transfer in a race-free manner.
    This patch switches the waiting for the transfer's final completion to
    using libusb_handle_events_completed(), thereby fixing both issues.  Note
    the while is necessary since libusb_handle_events_completed(), like
    libusb_handle_events(), will return as soon as it has handled *any* event.
    The difference with libusb_handle_events_completed() is that once it has
    all the necessary internal libusb locks, it checks the contents of the
    completed parameter, and will bail if that has become nonzero without
    waiting for further events.
    Signed-off-by: Hans de Goede <>
    authored signal11 committed

Apr 23, 2013

  1. Alan Ott

    windows: Fix leak of event handle on open_device() failure

    Create a new free_hid_device() function which takes care of all the
    resources in hid_device which may need to be freed/released.
    Reported-by: Johan Lindh <>

Mar 05, 2013

  1. Alan Ott

    mac: Unregister the proper removal callback in hid_close()

    Unregister from IOHIDManager instead of IOHIDDevice.
    Thanks to github user tomsor for noticing this.

Jan 21, 2013

  1. Alan Ott

    linux: Use poll() even in non-blocking mode

    It appears that calls to read() when in non-blocking mode will not set errno
    to other than EAGAIN when the a device has been disconnected.  Note that
    this is the same errno code set when there is simply no data to return.
    Make it so that poll() is used, in non-blocking mode, to check the
    status of the device. In blocking mode though, poll() is not needed.
  2. Spencer Oliver

    linux/libusb: do not check bDeviceClass on enumeration

    Some composite devices do not have bDeviceClass set to
    LIBUSB_CLASS_PER_INTERFACE and were ignored when enumerating HID devices.
    Ignore checking the bDeviceClass as we will be checking interface
    bInterfaceClass later anyway.
    Signed-off-by: Spencer Oliver <>
    authored signal11 committed
  3. Atsushi NAGASE

    libusb: check for failure of hid_init()

    Return NULL from hid_enumerate() and hid_open_path() if hid_init() fails.
    authored signal11 committed

Nov 28, 2012

  1. Ludovic Rousseau

    libusb: remove extra spaces

    Remove spaces and tabs at end of lines.
    authored signal11 committed
  2. Ludovic Rousseau

    all: make hid_enumerate() able to match any vendor or any product

    Passing product_id=0 will match any product of a given vendor.  This patch
    makes it also possible to use vendor_id=0 to match any vendor for a given
    product id.
    Windows code added to Ludovic's patch by Alan Ott.
    authored signal11 committed

Nov 27, 2012

  1. Alan Ott

    testgui: more robust handling of report length fields

    Improve logic of report length field handling for empty fields.
    Add column headers for data and length fields.
    Add documentation statement about length fields.
    Increase window size.
    Add message boxes when invalid values are entered.
    memset() buffers to zero.
  2. Michael

    testgui: Add fields for lengths of reports

    Windows platforms return errors When you do not specify the proper buffer
    size and length.
    authored signal11 committed
  3. nikolajsheller

    windows: replace magic number 2 with sizeof(wchar_t)

    Changed for readability, as I think this is what was intended by
    the author.
    authored signal11 committed
  4. Alan Ott

    Merge branch 'master' of

  5. Justin R. Cutler

    libusb/mac: gcc -pedantic warning fixes

    authored signal11 committed
  6. Justin R. Cutler

    windows: mingw: minor gcc -pedantic warning fixes

    authored signal11 committed

Nov 26, 2012

  1. Justin R. Cutler

    All: Convert C99 comments (//) into C89 comments (/* */)

    authored signal11 committed
  2. Justin R. Cutler

    linux: fix gcc warnings when INVASIVE_GET_USAGE is defined.

    authored signal11 committed
  3. stanhu

    linux: Fix memory leaks on serial number and product name

    In get_device_string() serial_number_utf8 and product_name_utf8 could end
    up not getting freed if certain errors occurred.
    authored signal11 committed
  4. stanhu

    linux: check for EINPROGRESS from read()

    Non-blocking I/O can cause read() to return EINPROGRESS in addition to
    EAGAIN.  Handle this case.
    authored signal11 committed
  5. stanhu

    mac: Use Location ID in make_path instead of pointers

    Using locations makes the path the same for each run of a HIDAPI based
    program.  This is useful for opening devices which don't have a serial
    number, and where multiple devices of the same type are attached to the
    system at once.
    This references pull request #78.
    authored signal11 committed
  6. Alan Ott

    mac: Fix string handling

    There were errors regarding the length of strings in conversion from CFString
    to wchar_t.
    Thanks to github user nikolajsheller for pointing this out in pull request #80.
  7. Ludovic Rousseau

    mac: Use exclusivce device access

    Use kIOHIDOptionsTypeSeizeDevice instead of kIOHIDOptionsTypeNone to
    avoid interferences with other applications trying to use the HID device
    at the same time.
    authored signal11 committed
  8. Ludovic Rousseau

    hidtest: Use hid_init()

    Use hid_init() in hidtest/hidtest.cpp
    authored signal11 committed
  9. Ludovic Rousseau

    README.txt: Improve sample code

    - use hid_init()/hid_exit()
    - include windows.h only on Windows
    authored signal11 committed
  10. linux/hidraw: Fix compiler warning

    hid.c: In function 'uses_numbered_reports':
    hid.c:126:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    hid.c:143:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    authored signal11 committed

Sep 21, 2012

  1. Linux: Fix warning: function declaration isn't a prototype

    linux/hid.c:83:13: warning: function declaration isn't a prototype [-Wstrict-prototypes]
    linux/hid.c: In function 'new_hid_device':
    linux/hid.c:83:13: warning: old-style function definition [-Wold-style-definition]
    authored signal11 committed
Something went wrong with that request. Please try again.