• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

hidapi/H03-May-2022-

libusb/H05-Oct-2021-

.travis.ymlH A D05-Oct-2021866

AUTHORSH A D05-Oct-2021261

Dockerfile.alpineH A D05-Oct-2021174

Dockerfile.ubuntuH A D05-Oct-2021119

LICENSEH A D05-Oct-20217.5 KiB

README.mdH A D05-Oct-20214.2 KiB

appveyor.ymlH A D05-Oct-2021812

demo.goH A D05-Oct-20212.3 KiB

dummy.goH A D05-Oct-2021859

go.modH A D05-Oct-202140

hid_disabled.goH A D05-Oct-20211.6 KiB

hid_enabled.goH A D05-Oct-20215.1 KiB

libs.goH A D05-Oct-20212.2 KiB

raw_disabled.goH A D05-Oct-20211.6 KiB

raw_enabled.goH A D05-Oct-20218.9 KiB

raw_errors.goH A D05-Oct-20212.3 KiB

usb.goH A D05-Oct-20212.9 KiB

usb_disabled.goH A D05-Oct-20212.1 KiB

usb_enabled.goH A D05-Oct-20213.6 KiB

usb_test.goH A D05-Oct-20212.5 KiB

wchar.goH A D05-Oct-20214.7 KiB

wchar_test.goH A D05-Oct-20211.5 KiB

README.md

1[![Travis][travisimg]][travisurl]
2[![AppVeyor][appveyorimg]][appveyorurl]
3[![GoDoc][docimg]][docurl]
4
5[travisimg]:   https://travis-ci.org/karalabe/usb.svg?branch=master
6[travisurl]:   https://travis-ci.org/karalabe/usb
7[appveyorimg]: https://ci.appveyor.com/api/projects/status/u96eq262bj2itprh/branch/master?svg=true
8[appveyorurl]: https://ci.appveyor.com/project/karalabe/usb
9[docimg]:      https://godoc.org/github.com/karalabe/usb?status.svg
10[docurl]:      https://godoc.org/github.com/karalabe/usb
11
12# Yet another USB library for Go
13
14The `usb` package is a cross platform, fully self-contained library for accessing and communicating with USB devices **either via HID or low level interrupts**. The goal of the library was to create a simple way to find-, attach to- and read/write form USB devices.
15
16There are multiple already existing USB libraries:
17
18 * The original `gousb` package [created by @kylelemons](https://github.com/kylelemons/gousb) and nowadays [maintained by @google](https://github.com/google/gousb) is a CGO wrapper around `libusb`. It is the most advanced USB library for Go out there.
19   * Unfortunately, `gousb` requires the `libusb` C library to be installed both during build as well as during runtime on the host operating system. This breaks binary portability and also adds unnecessary hurdles on Windows.
20   * Furthermore, whilst HID devices are supported by `libusb`, the OS on Macos and Windows explicitly takes over these devices, so only native system calls can be used on recent versions (i.e. you **cannot** use `libusb` for HID).
21 * There is a fork of `gousb` [created by @karalabe](https://github.com/karalabe/gousb) that statically linked `libusb` during build, but with the lack of HID access, that work was abandoned.
22 * For HID-only devices, a previous self-contained package was created at [`github.com/karalabe/hid`](https://github.com/karalabe/hid), which worked well for hardware wallet uses cases in [`go-ethereum`](https://github.com/ethereum/go-ethereum). It's a simple package that does it's thing well.
23   * Unfortunately, `hid` is not capable of talking to generic USB devices. When multiple different devices are needed, eventually some will not support the HID spec (e.g. WebUSB). Pulling in both `hid` and `gousb` will break down due to both depending internally on different versions of `libusb` on Linux.
24
25This `usb` package is a proper integration of `hidapi` and `libusb` so that communication with HID devices is done via system calls, whereas communication with lower level USB devices is done via interrupts. All this detail is hidden away behind a tiny interface.
26
27The package supports Linux, macOS, Windows and FreeBSD. Exclude constraints are also specified for Android and iOS to allow smoother vendoring into cross platform projects.
28
29## Cross-compiling
30
31Using `go get`, the embedded C library is compiled into the binary format of your host OS. Cross compiling to a different platform or architecture entails disabling CGO by default in Go, causing device enumeration `hid.Enumerate()` to yield no results.
32
33To cross compile a functional version of this library, you'll need to enable CGO during cross compilation via `CGO_ENABLED=1` and you'll need to install and set a cross compilation enabled C toolkit via `CC=your-cross-gcc`.
34
35## Acknowledgements
36
37Although the `usb` package is an implementation from scratch, HID support was heavily inspired by the existing [`go.hid`](https://github.com/GeertJohan/go.hid) library, which seems abandoned since 2015; is incompatible with Go 1.6+; and has various external dependencies.
38
39Wide character support in the HID support is done via the [`gowchar`](https://github.com/orofarne/gowchar) library, unmaintained since 2013; non buildable with a modern Go release and failing `go vet` checks. As such, `gowchar` was also vendored in inline.
40
41Error handling for the `libusb` integration originates from the [`gousb`](https://github.com/google/gousb) library.
42
43## License
44
45This USB library is licensed under the [GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html) (dictated by libusb).
46
47If you are only interested in Human Interface devices, a less restrictive package can be found at [`github.com/karalabe/hid`](https://github.com/karalabe/hid).
48