The USB submodule of libmaple is responsible for: Initializing the USB peripheral, scaling the peripheral clocks appropriately, enabling the interrupt channels to USB, defining the USB IRQ, resetting the USB DISC pin (used to tell the host were alive). Additionally, the USB submodule defines the virtual COM port interface that is exposed to user sketches via SerialUSB. To use it: SerialUSB.print/ln, available(), read(), write() implement the same interface as Serial1/2/3. Current Status: Currently, the USB submodule relies on the low level core library provided by ST to implement the USB transfer protocol for control endpoint transfers. The high level virtual com port application is unfortunately hard to untangle from this low level dependence, and when a new USB core library is written (to nix ST dependence) changes will likely have to be made to virtual com application code. Ideally, the new core library should mimic the form of MyUSB (LUFA), since this library (USB for AVR) is growing in popularity and in example applications. The virtual com port serves two important purposes. 1) It allows serial data transfers between user sketches an a host computer. 2) It allows the host machine to issue a system reset by asserting the DTR signal. After reset, Maple will run the DFU bootloader for a few seconds, during which the user can begin a DFU upload operation (uploads application binary into RAM/FLASH). Thus, without this virtual com port, it would be necessary to find an alternative means to reset the chip in order to enable the bootloader. If you would like to develop your own USB application for whatever reason (uses faster isochronous enpoints for streaming audio, or implements the USB HID or Mass Storage specs for examples) then ensure that you leave some hook for resetting Maple remotely in order to spin up the DFU bootloader. Please make sure to give yourself a unique vendor/product ID pair in your application, as some operating systems will assign a host-side driver based on these tags. It would be possible to build a compound USB device, that implements endpoints for both the virtual COM port as well as some other components (mass storage etc.). However, this turns out to be a burden from the host driver side, as Windows and *nix handle compound USB devices quite differently. Be mindful that enabling the USB peripheral isnt "free." The device must respond to periodic bus activity (every few milliseconds) by servicing an ISR. Therefore, the USB application should be disabled inside of timing critical applications. In order to disconnect the device from the host, the USB_DISC pin can be asserted (on Maple this is GPIO C12). Alternatively, the NVIC can be directly configured to disable the USB LP/HP IRQ's. The files inside of usb_lib were provided by ST and are subject to their own license, all other files were written by the LeafLabs team and fall under the MIT license. Todo: - write custom low level USB stack to strip out any remaining dependence on ST code - add a high level USB application library that would allow users to make their own HID/Mass Storage/Audio/Video devices.