| Index: third_party/libusb/PORTING
 | 
| diff --git a/third_party/libusb/PORTING b/third_party/libusb/PORTING
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..7070784d04761562e38208d9d2fa4c2460eefc30
 | 
| --- /dev/null
 | 
| +++ b/third_party/libusb/PORTING
 | 
| @@ -0,0 +1,95 @@
 | 
| +PORTING LIBUSB TO OTHER PLATFORMS
 | 
| +
 | 
| +Introduction
 | 
| +============
 | 
| +
 | 
| +This document is aimed at developers wishing to port libusb to unsupported
 | 
| +platforms. I believe the libusb API is OS-independent, so by supporting
 | 
| +multiple operating systems we pave the way for cross-platform USB device
 | 
| +drivers.
 | 
| +
 | 
| +Implementation-wise, the basic idea is that you provide an interface to
 | 
| +libusb's internal "backend" API, which performs the appropriate operations on
 | 
| +your target platform.
 | 
| +
 | 
| +In terms of USB I/O, your backend provides functionality to submit
 | 
| +asynchronous transfers (synchronous transfers are implemented in the higher
 | 
| +layers, based on the async interface). Your backend must also provide
 | 
| +functionality to cancel those transfers.
 | 
| +
 | 
| +Your backend must also provide an event handling function to "reap" ongoing
 | 
| +transfers and process their results.
 | 
| +
 | 
| +The backend must also provide standard functions for other USB operations,
 | 
| +e.g. setting configuration, obtaining descriptors, etc.
 | 
| +
 | 
| +
 | 
| +File descriptors for I/O polling
 | 
| +================================
 | 
| +
 | 
| +For libusb to work, your event handling function obviously needs to be called
 | 
| +at various points in time. Your backend must provide a set of file descriptors
 | 
| +which libusb and its users can pass to poll() or select() to determine when
 | 
| +it is time to call the event handling function.
 | 
| +
 | 
| +On Linux, this is easy: the usbfs kernel interface exposes a file descriptor
 | 
| +which can be passed to poll(). If something similar is not true for your
 | 
| +platform, you can emulate this using an internal library thread to reap I/O as
 | 
| +necessary, and a pipe() with the main library to raise events. The file
 | 
| +descriptor of the pipe can then be provided to libusb as an event source.
 | 
| +
 | 
| +
 | 
| +Interface semantics and documentation
 | 
| +=====================================
 | 
| +
 | 
| +Documentation of the backend interface can be found in libusbi.h inside the
 | 
| +usbi_os_backend structure definition.
 | 
| +
 | 
| +Your implementations of these functions will need to call various internal
 | 
| +libusb functions, prefixed with "usbi_". Documentation for these functions
 | 
| +can be found in the .c files where they are implemented.
 | 
| +
 | 
| +You probably want to skim over *all* the documentation before starting your
 | 
| +implementation. For example, you probably need to allocate and store private
 | 
| +OS-specific data for device handles, but the documentation for the mechanism
 | 
| +for doing so is probably not the first thing you will see.
 | 
| +
 | 
| +The Linux backend acts as a good example - view it as a reference
 | 
| +implementation which you should try to match the behaviour of.
 | 
| +
 | 
| +
 | 
| +Getting started
 | 
| +===============
 | 
| +
 | 
| +1. Modify configure.ac to detect your platform appropriately (see the OS_LINUX
 | 
| +stuff for an example).
 | 
| +
 | 
| +2. Implement your backend in the libusb/os/ directory, modifying
 | 
| +libusb/os/Makefile.am appropriately.
 | 
| +
 | 
| +3. Add preprocessor logic to the top of libusb/core.c to statically assign the
 | 
| +right usbi_backend for your platform.
 | 
| +
 | 
| +4. Produce and test your implementation.
 | 
| +
 | 
| +5. Send your implementation to libusb-devel mailing list.
 | 
| +
 | 
| +
 | 
| +Implementation difficulties? Questions?
 | 
| +=======================================
 | 
| +
 | 
| +If you encounter difficulties porting libusb to your platform, please raise
 | 
| +these issues on the libusb-devel mailing list. Where possible and sensible, I
 | 
| +am interested in solving problems preventing libusb from operating on other
 | 
| +platforms.
 | 
| +
 | 
| +The libusb-devel mailing list is also a good place to ask questions and
 | 
| +make suggestions about the internal API. Hopefully we can produce some
 | 
| +better documentation based on your questions and other input.
 | 
| +
 | 
| +You are encouraged to get involved in the process; if the library needs
 | 
| +some infrastructure additions/modifications to better support your platform,
 | 
| +you are encouraged to make such changes (in cleanly distinct patch
 | 
| +submissions). Even if you do not make such changes yourself, please do raise
 | 
| +the issues on the mailing list at the very minimum.
 | 
| +
 | 
| 
 |