December 13, 2008

Super Sylphide 進捗状況(22) -- MSD + CDC 改め MSD + FTDI Mimic

オートパイロットシステムSuper Sylphideですが、USBを使用したデバック用インターフェイスを設けることが悲願でした。これまでの経緯としては、USBメモリスティックのように機器を見せるMass Storgae Device Class (MSDまたはMSC)と、擬似的なシリアルポートによって通信を確立するCommunication Device Class (CDC)、この2つを同時に実装したcomposite Deviceとして機能することを狙っていました。しかしMSD + CDCを同時に実装するとWindowsではM$が提供している標準デバイスドライバの出来がよろしくないようで、認識はされるもののCDCによる通信が途絶してしまうという問題が発生しました(詳しくは『Super Sylphide 進捗状況(16) -- Windows XPでMSD+CDCのUSB compositeが相変わらず動かない』の記事をどうぞ)。しかしながら今回ようやくMSD + CDCの機能を同時に実現することができましたので、記事にしてみたいと思います。ただし断っておきますが、ここで紹介する方法はタイトルから予想されるとおり、USBシリアル変換チップを作っているFTDIというメーカーのデバイスドライバを代替として使うもので、使用許諾条件に違反していると思われます。従って製品を作られる際には、くれぐれも参考にしないでください。

この方法を思い至ったのは、PICで有名なMicrochipのユーザーフォーラムを見ていた際に、FTDIのドライバを利用することによって、USB付きデバイスであるPIC18Fで2チャンネル分のシリアルポートを確保できたという話を見つけたことに遡ります。シリアルポートを2チャンネル確保する方法としては、USBの標準的な規格であるCDCを2チャンネル実装することが最も適当な方法だと思われますが、残念ながらWindowsではこの構成において必要となる複合デバイス用のドライバ(usbccgp.sys)とCDCドライバ(ubsser.sys)がうまくかみ合わず、1チャンネル分の通信しかうまくいかない問題が発生するそうで、このFTDIのドライバを使う方法はそれを解消したといえます。
僕が実装したいのはMSD + CDCで、それに対して上はCDC * 2で話が違うのではないか、と思われるかもしれませんが、MSD + CDCの構成においてCDCが通信できないよう悪さをしているのは同じドライバ(usbccgp.sysとusbser.sys)の可能性が高かったため、参考になると考えた次第です。

そこで上記のリンクで公開されているソース、またLinuxのFDTIのKernel Driver(/drivers/usb/serial/ftdi_sio.*)を参考に、FTDIのドライバに適合したファームウェア(MSD + FTDI Mimic)を実装してみました。実装した結果のうちFTDIに関わる部分(および変更前のCDCの部分)はUSB_CDC.c, USB_CDC.hで、USB_CDC.h上でCDC_IS_REPLACED_BY_FTDIを定義するとFTDIのドライバを使用するようになります。ディスクリプタの定義はf34x_USB_Descriptor.cで、MSD + FTDI Mimicでは下図のような構成になっています。

FTDI_MSD.gif

Interface Associaton Descriptorを使ってFTDIドライバが想定していないMSDの部分を切り離してあります。またFTDIドライバに関するINエンドポイントはBulkではなくInterrupt転送としました。これはMSDアクセスがあった場合でもFTDIのINエンドポイントを存続させるためで、なぜかWindowsでMSDアクセスをすると全ての転送がMSDに関するBulk転送で埋められてしまい、他のBulkエンドポイントの入出力をしてくれない問題を解消してあります。

さらにWIndowsで認識のために必要となるinfファイルですが、F34x_FTDIBUS.inf, F34x_FTDIPORT.infを作りました。FTDIの現時点での最新の安定版ドライバ(2.04.06)を想定しています。また認識の際にはFTDIドライバが想定するベンダIDと違うものを作っているため、VCPドライバを手動で導入(やねうらおさんの『FT232RLの周辺』の記事の後ろにある『FT232RLのシリアルナンバーだけ変更しておけば~』のくだりを参考)する必要がありました。

認識されるとWindowsのデバイスマネージャでは下図のようになります。

FTDI_MSD_Windows.png

これでSuper SylphideからMSDを使って保存されたデータの吸出し、そしてFTDI Mimicを使ったSuper Sylphideを使ったハードウェアインザループ(Hardware in the loop)試験の両方ができるようになりました。転送速度を考えると排他的な使い方になってしまうのですが、設定を変えることなく一つのデバイスで2つのことができるのは快適です。
しかしあくまでもFTDIのドライバは借り物で気持ちのよいものではないので、純正のusbccgp.sys, usbser.sys(それぞれ5.1.2600.5585, 5.1.2600.5512で試験したがダメ)がhotfixで更新されることを期待し続けたいと思います。

※その後、通信プロトコルの話を書きました。

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









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