July 09, 2007WindowsでMSD+CDC (USB Composite Device)少し前に『USBでMSD+CDC (Composite Device)』という記事を書きましたが、実装がほぼ完了しました。ところがすんなりと行かないのがM$のWindows、というわけで色々と試行錯誤を行ってみました。その奮闘記をここに記しておこうと思います。 呪文のような文章が長々と続きますので、続きをどうぞ。 前回の記事ではMSD(Mass Strage Device)とCDC(Communication Device Class)を同時に実装する方法について考察をしました。要約すると問題点は、CDCは上位であるデバイスクラスで定義されるものであるのに対し、MSDは下位のインターフェイスで定義されるものであるため、定義のレベルが違う両者を両立させてComposite Deviceとする為にはどうすればよいのか、ということでした。結局解決方法としては、以下の2通りが存在します(それ以外のアングラな方法もあるようですが、それについては触れません)。
一見、1の方法がシンプルなように見えますが、OS側から見ると少し複雑な事情を解決しなければなりません。これは、OSから見たとき、デバイスクラスがCDCなのにも関わらず別の機能であるMSDが『いきなり』含まれるため、あらかじめOS側でCDC内に別の機能が存在するという心の準備ができていないといけないことに起因しています。 実際Windowsにおいて1の方法では、このデバイスは一見CDC単体に見えるけど実はそうではなくてCompositeなんだよ、と教えるためのinf(CDCのinfとは異なる)を、ユーザが別途用意する必要があります。より具体的に述べると、composieデバイスを扱う親ドライバ(usbccgp.sys)をロードするためのusb.infへの参照、ならびに親ドライバ下位へCDCの定義を中継する宣言、が含まれたinfが必要となります。このあたりの話はM$の『Enumeration of the Composite Parent Device』、ならびにinfの例が記述された『Enumerating Interface Collections on Wireless Mobile Communication Devices』あたりが参考になります。親ドライバの詳細については、同じくM$の『USB Common Class Generic Parent Driver』をどうぞ。 方法2については、Windowsであっても親ドライバが自動的に読み込まれるので、MSDについては特に何もしなくても認識されます。その為にMSD内にCDCを認識させるためのinfをあらかじめ入れておけば、ドライバディスク代わりにデバイスを利用することが可能です。こちらについてXP Professional(SP2)で試したところ、予定どおりinfなしでMSDは認識されました。しかしながらCDCの認識については方法1と同様のトラブルが発生してしまい、2つのinterfaceが一つのCDCデバイスとして認識されませんでした(図1)。なお利用しているDescriptorはC言語で記述してあり、F34x_MSD_USB_Descriptor.c (F34x_MSD_USB_Descriptor.hならびにF34x_CDC.hも参照ください)のようになっています。 さらに調べてみると、M$のHotfix(正式リリースではないパッチ)にcompositeデバイスでのCDCの認識不良を取り扱ったものがありました。『The Usbser.sys driver may not load when a USB device uses an IAD to define a function that has multiple interfaces, and this function uses the Usbser.sys driver file in Windows XP』というものです。また親ドライバusbccgp.sysの不良を扱ったものとして『The network interface on a multifunction, composite USB device does not work in Windows XP』があります。現在これらのHotfixの入手ならびに適用を検討しています。結果がわかり次第、ここに掲載します。 ※後日談 認識されるとデバイスマネージャは上のようになります。以前はデバイスが3つできていたので、その時点でIADの記述を疑うべきでした。 ※※さらに後日談 コメント
作者様 はじめまして。たろと申します。 私は今CDC+HIDの実装にトライしております。 私がトライした結果ではMI_00にしてもMI_01にしてもCOMポートは一つだけ追加になり、デバマネでポート番号を確認できますが、アプリからそのCOMポートをオープンしようとすると存在しないエラーとなります。 もし可能でしたらinfファイルを公開もしくは直メしていただけますととても助かります。 ご検討いただけますと幸いです。 たろ Posted by: たろ : March 3, 2009 05:08 PM>たろさん fenrir様 早速のご回答ありがとうございました。 その後色々と試したところ、XP+SP3なら正常動作することが分かりました。ただし、PCによって動作するのとしないのがあるようです。 とりあえず動く環境を一つでも構築できましたので、引き続き可能性を探っていきます。 本当にこちらの記事が参考になりました。ありがとうございました。 追)最初のコメントの中にメアドを書いてしまいました。お手数おかけいたしますが、お時間がある時に削除していただけますと幸いです。すみません。 Posted by: たろ : March 5, 2009 11:35 AMコメントする
|
スポンサード リンク
|