CDC+MSCの複合デバイスは、SD R/Wを修正することでどうにかちゃんと動くようになりました。デバイスマネージャでの表示は、下図のようになりました。
CDC経由のシリアルコンソールを使ってタスクを表示すると、こんな↓感じです。msd_taskがMass Storage Deviceの処理をおこなうために追加したタスクです。usb_taskが受信したパケットのクラスを判別して、MSCの場合には msd_taskに、CDCの場合には console_taskに処理を引き継ぐようにしています。
Mass Strorageの方だけを Windowsの「ハードウェアの安全な取り外し」操作で取り外しても、残ったCDCの方のシリアルコンソール機能はちゃんと動いてくれています。このように複合デバイスとして動かすことには一応成功したのですが、MSDとしてのアクセス速度が遅いです。12MBほどのファイルのコピーで実験してみると
という悲惨な成績。最初は512バイトSD/USBから読み出してはUSB/SDに書き出すという1ブロック単位のR/Wだったのでもっと遅かったのですが、8ブロック毎のR/Wにしたところ、現在の数字になっています。特に、書き込みの遅さは耐えられない感じがします。ATMELのライブラリのコードでは、ACMD4323による書き込みブロック数の設定をおこなっていないので、書き込み前の消去に余分な時間を費やしているのかもしれません。このあたりの変更から始めて、改善を試みようかと思います。
CDC経由のシリアルコンソールを使ってタスクを表示すると、こんな↓感じです。msd_taskがMass Storage Deviceの処理をおこなうために追加したタスクです。usb_taskが受信したパケットのクラスを判別して、MSCの場合には msd_taskに、CDCの場合には console_taskに処理を引き継ぐようにしています。
Mass Strorageの方だけを Windowsの「ハードウェアの安全な取り外し」操作で取り外しても、残ったCDCの方のシリアルコンソール機能はちゃんと動いてくれています。このように複合デバイスとして動かすことには一応成功したのですが、MSDとしてのアクセス速度が遅いです。12MBほどのファイルのコピーで実験してみると
Read: 30秒弱 (400KB/sec) Write: 約60秒 (200KB/sec)
という悲惨な成績。最初は512バイトSD/USBから読み出してはUSB/SDに書き出すという1ブロック単位のR/Wだったのでもっと遅かったのですが、8ブロック毎のR/Wにしたところ、現在の数字になっています。特に、書き込みの遅さは耐えられない感じがします。ATMELのライブラリのコードでは、ACMD