がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

MCUXpressoSDK USB Device StackでMIDIStreamingSubClassを使う2

前回はディスクリプタを編集して認識まで行った。
今回はMIDIの送受信が可能となったのでそれの紹介

f:id:gsmcustomeffects:20191110125826p:plain

上に示すのがevkbimxrt1050_dev_audio_generator_bmのsourceフォルダの中身。
枠で囲ってある部分が今回やる部分

ソフトウエアはevkbimxrt1050_dev_audio_generator_bmサンプルを改変する形で実装してるのでこのサンプルをインポートしておいてください。
ハードウエアははForlinx Embedded Tech. Co., Ltd.のOK1052-Cで検証を行っています。

尚、細かいところは未検証なのでかろうじて動くサンプルだと思って読んでください
特に送信や受信はBusy判断とかはしてないので連続で送るとエンドポイント側のAPIがBusy返すと思います。

usb_device_midi.c/.h , usb_device_class.c

もともとあったusb/device/class/audio/usb_device_audio.c/.hファイルを削除し同じディレクトリにusb_audio_midi.c/.hを作成してください
ファイルを新しく作成していますが元のAUDIOクラスのコードを引用して持ってきてcontrol subclassとstreaming subclassの記述を消してmidistreamingに関する記述に置き換えただけです。
具体的にはエンドポイントの初期化が主になるのでBulk endpointの初期化とBulkIn/Blukoutコールバックの追加など

該当ファイルを以下のコード参考に記述してください

usb_device_midi.c


usb_device_midi.h


usb_device_class.c

以下のコードを冒頭部分のマクロに追記してください

#if ((defined(USB_DEVICE_CONFIG_AUDIO_MIDI)) && (USB_DEVICE_CONFIG_AUDIO_MIDI > 0U))
#include "usb_device_midi.h"
#endif



#if ((defined USB_DEVICE_CONFIG_AUDIO_MIDI) && (USB_DEVICE_CONFIG_AUDIO_MIDI > 0U))
    {USB_DeviceAudioMIDIStreamingInit, USB_DeviceAudioMIDIStreamingDeinit, USB_DeviceAudioMIDIStreamingEvent, kUSB_DeviceClassTypeAudio},
#endif

full code here

https://gist.github.com/GSMCustomEffects/fd5ef3465c426e067ff88be18ad72015


audio_generator.c , usb_device_config.h

audio_generator.c

メインであるこのファイルはほとんど変えていないのですが変更箇所が結構飛び飛びなので全部貼っておきます。

まあkUSB_DeviceEventSetConfiguration部分が変わるのとUSB_DeviceAudioCallbackに自身の処理を加えただけです。


usb_device_config.h

ここでどのdevice classを使うのかコンフィグできる。

元のUSB_DEVICE_CONFIG_AUDIO を無効にしてUSB_DEVICE_CONFIG_AUDIO_MIDI を新規定義して有効化する。

/*! @brief Audio instance count */
#define USB_DEVICE_CONFIG_AUDIO (0U)

#define USB_DEVICE_CONFIG_AUDIO_MIDI (1U)

usb_device_descriptor.c

最後にディスクリプタの一部変わっているので以下の内容に書き換えてください

変更内容としてはusb_device_audio.hを呼ぶところをusb_device_midi.hに変更
関連してエラーの出るところを修正(主にマクロでusb_device_audio.hより引用してる部分

動作確認

以下のページよりpocket MIDIをダウンロードしてください
https://www.morson.jp/pocketmidi-webpage/

上部のinput outputよりポートを選ぶ
上部メニューのViewよりProgramChangeを開いて何か送る
このように両側にMIDIが表示されればOK

f:id:gsmcustomeffects:20191110154502p:plain

動かすとこんな感じ

所感

ある程度手抜きだがUSB MIDIの送受信が動くようになった。
今後は新規プロジェクトからコンフィグツールを使ってUSB周りが動くような記事を書く予定

参考文献

公式ドキュメントは必ず読む

  • MCUXpresso SDK USB Stack User’s Guide.pdf
  • MCUXpresso SDK USB Stack Device Reference Manual.pdf

USB StackのアプリケーションノートはないのでLPC5500用のアプリケーションノートを読む

AN12458 はリクエスト周りのドキュメントとしてはかなり分かりやすい。

  • AN12458 USB to Virtual COM on LPC54018 and LPC5500
  • AN10420 USB virtual COM port on LPC214x

USB 2.0 Specificationは公式ドキュメントなので必須

USB Device MIDIの公式資料


USB Complete: The Developer's Guide
規格は説明が硬すぎるのでかみ砕いた説明が欲しい方向け