This library is a Arduino-friendly version of TinyUSB stack. It is designed with structure and APIs that are easily integrated to existing or new Arduino Core. Supported platform including:
- Adafruit_nRF52_Arduino
- Adafruit ArduinoCore-samd selectable via menu
Tools->USB Stack->TinyUSB
- earlephilhower/arduino-pico selected via menu
Tools->USB Stack->Adafruit TinyUSB
Current class drivers supported are
- Communication (CDC): which is used to implement
Serial
monitor - Human Interface Device (HID): Generic (In & Out), Keyboard, Mouse, Gamepad etc ...
- Mass Storage Class (MSC): with multiple LUNs
- Musical Instrument Digital Interface (MIDI)
- WebUSB with vendor specific class
For supported ArduinoCore, to use this library, you only need to have <Adafruit_TinyUSB.h>
in your sketch. If your ArduinoCore does not support TinyUSB library yet, it is rather simple to port.
More document to write ...
It is rather easy if you want to integrate TinyUSB lib to your ArduinoCore.
- Add this repo as submodule (or have local copy) at your ArduioCore/libraries/Adafruit_TinyUSB_Arduino (much like SPI).
- Since Serial as CDC is considered as part of the core, we need to have
#include "Adafruit_USBD_CDC.h"
within yourArduino.h
. For this to work, yourplatform.txt
include path need to have"-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino"
. - In your
main.cpp
before setup() invoke theTinyUSB_Device_Init(rhport)
. This will initialize usb device hardware and tinyusb stack and also include Serial as an instance of CDC class. TinyUSB_Device_Task()
must be called whenever there is new USB event. Depending on your core and MCU with or without RTOS. There are many ways to run the task. For example:
- Use USB IRQn to set flag then invoke function later on after exiting IRQ.
- Just invoke function after the loop(), within yield(), and delay()
TinyUSB_Device_FlushCDC()
should also be called often to send out Serial data as well.- Note: For low power platform that make use of WFI()/WFE(), extra care is required before mcu go into low power mode. Check out my PR to circuipython for reference adafruit/circuitpython#2956
In addition to core changes, library need to be ported to your platform. Don't worry, tinyusb stack has already done most of heavy-lifting. You only need to write a few APIs
TinyUSB_Port_InitDevice()
hardware specific (clock, phy) to enable usb hardware then call tud_init(). This API is called as part of TinyUSB_Device_Init() invocation.TinyUSB_Port_EnterDFU()
which is called when device need to enter DFU mode, usually by touch1200 featureTinyUSB_Port_GetSerialNumber()
which is called to get unique MCU Serial ID to used as Serial string descriptor.