Dynamic Switch Example

Example source: examples/dual/dynamic_switch

This example demonstrates TinyUSB’s dual-role capability by allowing runtime switching between USB device and host modes.

Features

  • Button-triggered mode switching: Press the board button to switch between device and host modes

  • Device Mode: Acts as a USB CDC (Virtual Serial Port) that echoes all received data

  • Host Mode: Enumerates connected USB devices and prints device information

  • Dynamic switching: Deinitializes the current stack and reinitializes in the new mode

Configuration

Notable tusb_config.h settings:

#define CFG_TUD_CDC 1
#define CFG_TUH_HUB 1
#define CFG_TUH_DEVICE_MAX (CFG_TUH_HUB ? 4 : 1)
#define CFG_TUH_ENUMERATION_BUFSIZE 256

Usage

  1. Build and flash the example to your board

  2. Default behavior: The board starts in Device mode

  3. Device mode:

    • Connect the board to a PC

    • Open a serial terminal (e.g., screen /dev/ttyACM0 or PuTTY)

    • Type characters - they will be echoed back to you

  4. Switch to Host mode:

    • Press the board button

    • Connect a USB device to the board

    • The board will enumerate the device and print its descriptors to the debug console

  5. Switch back to Device mode: Press the button again

LED Patterns

The onboard LED indicates the USB connection status:

  • Fast blink (250ms): Not mounted/connected

  • Slow blink (1000ms): Successfully mounted/connected

  • Very slow blink (2500ms): Suspended (device mode only)

Serial Output

The example prints status messages to the debug UART:

======================================
TinyUSB Dynamic Switch Example
Press button to switch between device and host modes
Starting in DEVICE mode...
======================================

[DEVICE] Mounted

--- Switching USB mode ---
Stopping DEVICE mode...
Starting HOST mode...
Mode switch complete!

[HOST] Device attached, address = 1
Device 1: ID 1234:5678 SN ABC123
Device Descriptor:
  bLength             18
  bDescriptorType     1
  bcdUSB              0200
  bDeviceClass        239
  ...