STM32F103 で USBComposite ライブラリを使う

「STM32F103でHIDデバイス」
https://qiita.com/nanbuwks/items/f7f2377c2b252e936baa
で紹介したライブラリ
https://github.com/arpruss/USBHID_stm32f1

が
「USB Composite library for STM32F1 (HID, Serial, MIDI and XBox360 controller)」
https://github.com/arpruss/USBComposite_stm32f1
になった。

試してみる。

# インストール

元々インストールしていた、USBHIDドライバを削除しました。

../(ポータブル環境ディレクトリ)/hardware/Arduino_STM32-master/STM32F1/USBHID_stm32f1 
このフォルダごと削除します。
../(ポータブル環境ディレクトリ)/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1

フォルダを作り、
https://github.com/arpruss/USBComposite_stm32f1
からダウンロードしたZIPを解凍、ここに入れる。
../(ポータブル環境ディレクトリ)/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1
の直下に、
AbsMouse.cpp            USBHID.cpp              usb_hid.c
Consumer.cpp            USBHID.h                usb_hid.h
HIDReports.cpp          USBMIDI.cpp             usb_mass.c
Joystick.cpp            USBMIDI.h               usb_mass.h
Keyboard.cpp            USBMassStorage.cpp      usb_mass_int
などがあるようにする。


Arduino IDEを実行。

# HID Keyboard

ミニマムコードは以下の通り。

```

#include <USBComposite.h>

USBHID HID;
HIDKeyboard Keyboard(HID);

void setup() {
  HID.begin(HID_KEYBOARD);
  Keyboard.begin();
  delay(2000);
}

void loop() {

    Keyboard.println("Hello,world.");
    delay(5000);
}

```

先のUSBHIDでのコードとは、ちょと違っている。

# microSDリーダー

## コンパイル

次に、ライブラリサンプルの、sdreader を実行しようとしたら、以下のようにエラー



```

/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino:6:19: fatal error: SdFat.h: No such file or directory
 #include "SdFat.h"
                   ^
compilation terminated.
次のフォルダのライブラリUSBComposite_stm32f1バージョン0.91を使用中：/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1 
次のフォルダのライブラリSPIバージョン1.0を使用中：/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/SPI 
exit status 1
ボードGeneric STM32F103C seriesに対するコンパイル時にエラーが発生しました。

```


SdFat.h が無いということなので、library manager から sdfat で検索してインストールしたが、うまくいかない。

```


・・・

スケッチをコンパイルしています...
"/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/portable/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8002000 -DERROR_LED_PORT=GPIOB -DERROR_LED_PIN=1 -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10805 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1  -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8  -mthumb  -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8  -mthumb  -march=armv7-m -D__STM32F1__ "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple/include" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple/stm32f1/include"                                                           "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple/usb/stm32f1" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/system/libmaple/usb/usb_lib" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/cores/maple" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/variants/generic_stm32f103c" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/SPI/src" "-I/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/portable/sketchbook/libraries/SdFat/src" "/tmp/arduino_build_276687/sketch/sdreader.ino.cpp" -o "/tmp/arduino_build_276687/sketch/sdreader.ino.cpp.o"
sdreader:14: error: 'SdFatEX' does not name a type
 SdFatEX sd;
 ^
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino: In function 'bool write(const uint8_t*, uint32_t, uint16_t)':
sdreader:21: error: 'sd' was not declared in this scope
   return sd.card()->writeBlocks(startSector, writebuff, numSectors);
          ^
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino: In function 'bool read(uint8_t*, uint32_t, uint16_t)':
sdreader:25: error: 'sd' was not declared in this scope
   return sd.card()->readBlocks(startSector, readbuff, numSectors);
          ^
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino: In function 'void initReader()':
sdreader:36: error: 'sd' was not declared in this scope
   cardSize = sd.card()->cardSize();  
              ^
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1/examples/sdreader/sdreader.ino: In function 'void loop()':
sdreader:46: error: 'sd' was not declared in this scope
     if (sd.begin(SD_CHIP_SELECT)) {
         ^
次のフォルダのライブラリUSBComposite_stm32f1バージョン0.91を使用中：/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/USBComposite_stm32f1 
次のフォルダのライブラリSPIバージョン1.0を使用中：/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/hardware/Arduino_STM32-master/STM32F1/libraries/SPI 
次のフォルダのライブラリSdFatバージョン1.0.7を使用中：/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.5_STM32/portable/sketchbook/libraries/SdFat 
exit status 1
'SdFatEX' does not name a type

```


・・・/libraries/SdFat/src/SdFatConfig.h 

内で、

```

#define ENABLE_EXTENDED_TRANSFER_CLASS 1
```
としたらコンパイルできた。


## 接続

aitendoのアダプタを買ってきて、接続してみました。

![IMG_20181015_163941.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/871c74bd-f33f-6416-8a66-07b661de7831.jpeg)




SD CS = PA4
SD SCK = PA5
SD MISO = PA6
SD MOSI = PA7

![IMG_20181015_163245.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/8378823b-be4d-695a-3457-f8230aa5399d.jpeg)

として接続しました。


## 動作

適当なmicro SDカードを入れて接続してみました。

```

[19099.436744] usb 1-1.2: new full-speed USB device number 27 using ehci-pci
[19099.546459] usb 1-1.2: New USB device found, idVendor=1eaf, idProduct=0003
[19099.546461] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[19099.546462] usb 1-1.2: Product: Maple 003
[19099.546463] usb 1-1.2: Manufacturer: LeafLabs
[19099.546463] usb 1-1.2: SerialNumber: LLM 003
[19101.005794] usb 1-1.2: USB disconnect, device number 27
[19101.228836] usb 1-1.2: new full-speed USB device number 28 using ehci-pci
[19101.342356] usb 1-1.2: New USB device found, idVendor=1eaf, idProduct=0029
[19101.342358] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[19101.342359] usb 1-1.2: Product: Maple
[19101.342360] usb 1-1.2: Manufacturer: LeafLabs
[19101.342797] usb-storage 1-1.2:1.0: USB Mass Storage device detected
[19101.343985] scsi host6: usb-storage 1-1.2:1.0
[19101.344028] scsi host6: runtime PM trying to activate child device host6 but parent (1-1.2:1.0) is not active
[19101.344191] cdc_acm 1-1.2:1.1: ttyACM3: USB ACM device
[19102.366263] scsi 6:0:0:0: Direct-Access     STM      SD Flash Disk    1.0  PQ: 0 ANSI: 2
[19102.366584] sd 6:0:0:0: Attached scsi generic sg1 type 0
[19102.367951] sd 6:0:0:0: [sdb] 15523840 512-byte logical blocks: (7.95 GB/7.40 GiB)
[19102.369456] sd 6:0:0:0: [sdb] Write Protect is off
[19102.369459] sd 6:0:0:0: [sdb] Mode Sense: 03 00 00 00
[19102.370244] sd 6:0:0:0: [sdb] No Caching mode page found
[19102.370248] sd 6:0:0:0: [sdb] Assuming drive cache: write through
[19102.384302]  sdb: sdb1 sdb2
[19102.389664] sd 6:0:0:0: [sdb] Attached SCSI removable disk

```
さて、このmicroSDカードはRaspberryPi用に設定したものです。パーティーションは前64MBytesがFat,その後の2GBytesがextファイルシステムです。


```

$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1f9084d7

デバイス   起動  Start 最後から セクタ Size Id タイプ
/dev/sdb1         8192   137215  129024  63M  c W95 FAT32 (LBA)
/dev/sdb2       137216  4233215 4096000   2G 83 Linux
```

SdFatということでFatファイルシステムだけかなと思ったのですがextファイルシステムもLinuxPCから読めました。

## 速度計測

適当なファイルをコピーして速度を測ってみます。


```


$ time cp -a /media/nanbuwks/202638e1-4ce4-45df-9a00-ad725c2537bb/var/cache/ ~/$
cp: '/media/nanbuwks/202638e1-4ce4-45df-9a00-ad725c2537bb/var/cache/apt/archives/lock' を 読み込み用に開くことが出来ません: 許可がありません
cp: '/media/nanbuwks/202638e1-4ce4-45df-9a00-ad725c2537bb/var/cache/debconf/passwords.dat' を 読み込み用に開くことが出来ません: 許可がありません
cp: '/media/nanbuwks/202638e1-4ce4-45df-9a00-ad725c2537bb/var/cache/ldconfig' にアクセスできません: 許可がありません

real	8m20.284s
user	0m0.016s
sys	0m0.420s

$ du --max-depth=1 -h
204M	./cache

```

あまり速くありません。204MBytesの読み込みに500秒かかっています。