* Documentation - README.md * Do not require `core::fmt::Debug` on drivers. This is a temporary measure so I can show which driver had an issue when something goes wrong, but it's much more expansive than needed. * Investigate Pinning on transfer API. Ideally I think I would want to leave this up to API consumers, but I don't think that's possible, and Pin is desirable since it would allow for easier async/DMA. It is not necessary with the current API, though. * Driver API. ** More thorough errors. *** TransferError `TransferError` breaks everything down into `Retry`/`Permanent`, which isn't detailed enough. Depending on what's going on, we need to know at least `Stall` and `NAK`, and possibly more. *** DriverError The `Retry`/`Permanent` distinction is probably fine here, but there needs to be a better way of querying which device had the problem. Right now we early-abort on a problem so we can stuff the address into the error, but that means the rest of the devices don't get a chance to run. ** Device addition and removal. Device addition and removal is in both the top-level USB host driver and the individual drivers, so there are at least two lists of addresses floating around and it's not entirely clear who's authoritative for which devices are attached. The USB host driver should be the only source of this information. The `remove_device` call should be considered informative for the driver (as in: this device is already gone). ** Interface-level drivers. Most uses of the USB are done at the interface level, with devices just an agglomeration of interfaces. In particular, this is how HID works. However, to accomodate this, the USB host driver needs to, minimally, fetch a variable-length configuration from the device which can be passed to the driver layer so it can accept the interface and its associated data (e.g., endpoints and HID descriptors). I'd rather not invoke an allocator here, but there seems to be little choice. It would be possible to have a static buffer that gets used (and possibly zero-copied into various borrowed descriptors), but that's going to put an arbitrary limit on the length of the ConfigurationDescriptor we accept.