June 10, 2007

USBでMSD+CDC (Composite Device)

このサイトで扱っているGPSロガーオートパイロットシステムSuper Sylphideには、USBが内蔵されたC8051F340というマイコンを搭載しています。これまではそれらに搭載されたSDカードの読み書きをPCから行うためにUSBを利用してきました。その際に実装として利用してきた規格がUSBのMass Strage Class(MSD)なのですが、今後はPCと双方向でやりとりできるコンソール機能をCommunication Device Class(CDC)という規格を利用して付け足したいと考えています。USB規格の詳細は本家usb.orgにまとめられています。
CDCはMSDと同じく、Windowsなどの一般的なOSでは標準ドライバが用意されているため、特別にドライバを開発する必要がありません(細かい話をすればWindowsではinfが必要になるようですが)。また、PC側では仮想COMポートとして認識されるので、PC側から制御するためのコードも非常に書きやすいようです(WindowsだったらWriteFile/ReadFile)。

そういうわけでMSDとCDCの両機能をもつファームウェアの製作を考えているのですが、ただ単純に足してできるものなのか疑問を感じていました。USBの規格に則ってファームウェアを作成する際にはDescriptorというものを書くのですが、それは大きく分けて階層順にDevice、Interface、Endpointの3つがあります。この階層が曲者で、MSDはInterfaceレベルで定義されているのに対し、CDCはDeviceで定義されているため疑問を感じていました(図1)。

CDC_MSD_1.gif
図1。

調べてみると、そのような議論がMicrochip(PICのメーカ)のフォーラムでされていた("USB Composite Device Operation")ので、そこでの議論をまとめて図にしてみました(図2)。どうやらより大きな階層のDeviceで定義されているCDCに、より下の階層であるInterfaceで定義されているMSDを取り込めばよいようです(1)。あるいは新たに設けられたInterface Association Descriptor(IAD)という機能(詳しくはusb.org内のPDF)を使って、Interfaceの階層でDeviceの定義をすることによって解決することもできるようです(2)。

CDC_MSD_2.gif
図2。

実装はこれからといったところですが、疑問が解消されてよかったです。

※その後、WIndowsでMSD+CDCを試しました。それに伴い図2に不備があることがわかりましたので、修正しました。

19:17 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/571
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。