Wio TerminalやSeeeduino XIAOでAdafruit TinyUSB Libraryを使おうとするとビルドに失敗する

Adafruit TinyUSB Libraryがv1.0.0以降にアップデートされている場合、USBスタックにTinyUSBを選択してビルドすると次のようなエラーとなってしまいます。

  • Board Wio Terminal
  • Seeed SAMD Boards v1.8.2
  • Adafruit TinyUSB Library v1.4.4
  • サンプルスケッチ Adafruit TinyUSB Library > MassStorage > msc_ramdiskの場合
"C:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\tools\\arm-none-eabi-gcc\\7-2017q4/bin/arm-none-eabi-g++" -mcpu=cortex-m4 -mthumb -c -g -Os -std=gnu++14 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD "-D__SKETCH_NAME__=\"\"\"msc_ramdisk.ino\"\"\"" -DF_CPU=120000000L -DARDUINO=10813 -DARDUINO_WIO_TERMINAL -DARDUINO_ARCH_SAMD -D__SAMD51P19A__ -DWIO_TERMINAL -DSEEED_WIO_TERMINAL -DSEEED_GROVE_UI_WIRELESS -D__SAMD51__ -DUSB_VID=0x2886 -DUSB_PID=0x802D -DUSBCON -DUSB_CONFIG_POWER=100 "-DUSB_MANUFACTURER=\"Seeed Studio\"" "-DUSB_PRODUCT=\"Seeed Wio Terminal\"" -DUSE_TINYUSB -DROLE=0 "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\hardware\\samd\\1.8.2\\cores\\arduino/TinyUSB" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\hardware\\samd\\1.8.2\\cores\\arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\hardware\\samd\\1.8.2\\cores\\arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src" -D__FPU_PRESENT -DARM_MATH_CM4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -DENABLE_CACHE -DTXRXLED_ENABLE -DROLE=0 -Os -DVARIANT_QSPI_BAUD_DEFAULT=50000000 -D__SAMD51P19A__ -DWIO_TERMINAL -DSEEED_WIO_TERMINAL -DSEEED_GROVE_UI_WIRELESS -D__SAMD51__ -DUSB_VID=0x2886 -DUSB_PID=0x802D -DUSBCON -DUSB_CONFIG_POWER=100 "-DUSB_MANUFACTURER=\"Seeed Studio\"" "-DUSB_PRODUCT=\"Seeed Wio Terminal\"" -DUSE_TINYUSB -DROLE=0 "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\hardware\\samd\\1.8.2\\cores\\arduino/TinyUSB" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\hardware\\samd\\1.8.2\\cores\\arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\hardware\\samd\\1.8.2\\cores\\arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src" -D__FPU_PRESENT -DARM_MATH_CM4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\tools\\CMSIS\\5.7.0/CMSIS/Core/Include/" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\tools\\CMSIS\\5.7.0/CMSIS/DSP/Include/" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\tools\\CMSIS-Atmel\\1.2.1/CMSIS-Atmel/CMSIS/Device/ATMEL/" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\hardware\\samd\\1.8.2\\cores\\arduino" "-IC:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\Seeeduino\\hardware\\samd\\1.8.2\\variants\\wio_terminal" "-IC:\\Users\\user\\Documents\\Arduino\\libraries\\Adafruit_TinyUSB_Arduino\\src" "C:\\Users\\user\\AppData\\Local\\Temp\\arduino_build_374642\\sketch\\msc_ramdisk.ino.cpp" -o "C:\\Users\\user\\AppData\\Local\\Temp\\arduino_build_374642\\sketch\\msc_ramdisk.ino.cpp.o"
msc_ramdisk:19:19: error: cannot declare variable 'usb_msc' to be of abstract type 'Adafruit_USBD_MSC'
 Adafruit_USBD_MSC usb_msc;
                   ^~~~~~~
In file included from C:\Users\user\Documents\Arduino\libraries\Adafruit_TinyUSB_Arduino\src/Adafruit_TinyUSB.h:44:0,
                 from C:\Users\user\Documents\Arduino\libraries\Adafruit_TinyUSB_Arduino\examples\MassStorage\msc_ramdisk\msc_ramdisk.ino:12:
C:\Users\user\Documents\Arduino\libraries\Adafruit_TinyUSB_Arduino\src/arduino/msc/Adafruit_USBD_MSC.h:30:7: note:   because the following virtual functions are pure within 'Adafruit_USBD_MSC':
 class Adafruit_USBD_MSC : public Adafruit_USBD_Interface {
       ^~~~~~~~~~~~~~~~~
In file included from C:\Users\user\AppData\Local\Arduino15\packages\Seeeduino\hardware\samd\1.8.2\cores\arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore/Adafruit_TinyUSB_Core.h:35:0,
                 from C:\Users\user\AppData\Local\Arduino15\packages\Seeeduino\hardware\samd\1.8.2\cores\arduino/Arduino.h:173,
                 from C:\Users\user\AppData\Local\Temp\arduino_build_374642\sketch\msc_ramdisk.ino.cpp:1:
C:\Users\user\AppData\Local\Arduino15\packages\Seeeduino\hardware\samd\1.8.2\cores\arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore/Adafruit_USBD_Device.h:38:22: note:     virtual uint16_t Adafruit_USBD_Interface::getDescriptor(uint8_t, uint8_t*, uint16_t)
     virtual uint16_t getDescriptor(uint8_t itfnum, uint8_t* buf, uint16_t bufsize) = 0;
                      ^~~~~~~~~~~~~
次のフォルダのライブラリAdafruit_TinyUSB_Arduinoバージョン1.4.4を使用中:C:\Users\user\Documents\Arduino\libraries\Adafruit_TinyUSB_Arduino 
exit status 1
cannot declare variable 'usb_msc' to be of abstract type 'Adafruit_USBD_MSC'

この問題はAdafruit TinyUSB Libraryがv1.0.0にアップデートされる際に、 従来2つあったリポジトリが統合されAdafruit TinyUSB Libraryに一本化されたことにより、 Seeed SAMD Boards内に内包されているAdafruit TinyUSB ArduinoCoreと競合することによって不具合が発生してしまいます。

f:id:mnakai:20210716091905p:plain

(いまのところの)回避策はライブラリをロールバック

2021年8月19日時点での不具合の回避策は、Adafruit TinyUSB Libraryのバージョンを0.10.5にロールバックすることです。

下記に手順を説明しておきます。

1. Arduino IDE ツール > ライブラリを管理...でライブラリマネージャを立ち上げる

f:id:mnakai:20210716092904p:plain

2. Adafruit TinyUSBを検索しバージョンを0.10.5に選択してインストールしなおす

f:id:mnakai:20210716093338p:plain

変更履歴

日付 変更者 変更内容
2021/8/19 mnakai 作成