modm API documentation
|
Modules | |
TinyUSB in Device Mode | |
TinyUSB in Host Mode | |
lbuild module: modm:tinyusb
TinyUSB is an open-source cross-platform USB Host/Device stack for embedded system, designed to be memory-safe with no dynamic allocation and thread-safe with all interrupt events are deferred then handled in the non-ISR task function.
This module provides a autogenerated port for TinyUSB, which includes the correct interrupt mapping, a serial number based on the UID of the device, as well as remapping the assertions of TinyUSB.
Some microcontroller have USB peripherals capable of using external high speed transceivers via an ULPI interface. TinyUSB can be configured to run device and host classes on one port or both on separate ports at the same time. You can configure this via these module options:
However, the high speed capable port can also run in full speed mode, in which case you must configure TinyUSB to not use the ULPI interface:
The modm:platform:usb
module provides the correct way of initializing the USB peripheral, however, you must connect the right signals too:
Note that depending on your specific hardware setup, you may need to fiddle around to find the right VBus sensing mechanism. Please look at the TinyUSB board definitions and examples for inspiration.
You can select the device classes you want to use via the modm:tinyusb:config
list option:
device.cdc
: Serial connection (uses two endpoints!)device.msc
: Mass Storage class.device.midi
: MIDI device.device.vendor
: WebUSB device.device.dfu_rt
: DFU runtime.Note that you can add multiple devices at the same time, as long as there are enough endpoints and USB RAM available:
modm will generate the USB descriptors automatically for the set of device classes you've chosen. You can then implement your app via TinyUSB callbacks.
You can overwrite or add configurations via a <tusb_config_local.h>
file, which will be included at the very beginning of the modm-generated tusb_config.h
file:
You can also replace the following weakly linked descriptor functions and objects in case you want to update only a small part of the autogenerated descriptors:
const uint8_t* tud_descriptor_device_cb(void)
to replace the autogenerated tusb_desc_device_t
descriptor.const uint8_t* tud_descriptor_configuration_cb(uint8_t index)
to replace the endpoint descriptions.const char* tud_string_desc_arr[]
to replace the string descriptors.const uint16_t* tud_descriptor_string_cb(uint8_t index, uint16_t langid)
If you leave the modm:tinyusb:config
option empty, no descriptors are generated, so you can implement them yourself. Note that you must also manually depend on the device classes you want to implement:
Some of these classes require a lot of configuration that you must provide via the <tusb_config_local.h>
file. Please consult the TinyUSB documentation and examples for their purpose.
To use the host classes you must depend on them manually as modm does not provide a configuration option for them:
Since we've made it so easy to add multiple device classes, it's also easy to run out of endpoints or RAM. Therefore we reroute TinyUSBs assertions to modm_assert
, so make sure you have implemented the modm_abandon
handler! See the modm:architecture:assert
module for details.
A TinyUSB assertion failure in release mode is fairly cryptic:
If you run this again in debug mode, you'll note a much more detailed assertion description. In this example you've exhaused the number of endpoints:
To trace the TinyUSB core, you can add CFG_TUSB_DEBUG=3
to your CPP flags and the output will be forwarded to MODM_LOG_DEBUG
.
Generated with: [] in [device.cdc, device.dfu_rt, device.midi, device.msc, device.vendor]
Generated with: high in [full, high]