「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のアダプタを買ってきて、接続してみました。
SD CS = PA4
SD SCK = PA5
SD MISO = PA6
SD MOSI = PA7
として接続しました。
動作
適当な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秒かかっています。