| ログイン | ご入会 |
ADC連絡先
|
|
|
このロードマップは USB デバイスドライバソフトウェアの開発に関するものであり、質問に答えるの形式で提供します。 Q:Mac OS はどのホストコントローラインタフェースをサポートしていますか?A:Mac OS X では、OHCI (Open Host Controller Interface) と EHCI (Enhanced Host Controller Interface) デバイスをサポートしています。現在のところ、UHCI (Universal Host Controller Interface) デバイスのサポートは組み込まれていません。 Q:どんな開発ツールを使用するべきですか?それらはどこで入手できますか?A:一般的な開発プラットフォームは、少なくとも 256M の RAM を搭載し、Mac OS X 10.3.x 以降をインストールした Power Macintosh システムです。開発には、Xcode を使用します。最新バージョンの Xcode は、Mac OS X 10.1.x と互換性のある USB デバイスドライバの作成をアプリケーションおよびカーネルレベルでサポートしています。 注意: Mac OS X 10.2.x 以前をインストールした Power Macintosh システム上でも USB デバイスドライバを開発できますが、Project Builder アプリケーションの使用に複雑さが伴い、ターゲットシステムが初期リリースの Mac OS X になります。Xcode(Mac OS X 10.3.x 以降でのみ動作)は、初期リリースの Mac OS X との互換性のためにクロス開発ランタイムライブラリを用意しています。クロス開発ランタイムライブラリを使用するには、最初にそれらをインストールしなかった場合、Tools SDK からインストールする必要があります(クロス開発ランタイムライブラリは "簡易インストール" の一部としてはインストールされません)。 重要: Mac OS X 10.2.x 以前をご利用の場合は、最新バージョンの Mac OS X にアップグレードして、USB デバイスドライバソフトウェアの開発作業には最新バージョンの Xcode を使用することをお勧めします。 その他にも重要な USB ツールとして、USB Prober とログを生成するバージョンの IOUSBFamily kext の 2 つがあります。USB Prober は、システムと IORegistry の USB 固有情報を表示します。また、USBLog 関数呼び出しによって生成されるステータスメッセージも表示します。ログを生成するバージョンの IOUSBFamily kext は、出荷リリース版では提供しないステータス情報を提供するように設計された USB ドライバであるため、USB Prober を補完します。ログを生成するバージョンの IOUSBFamily は、USB デバイス接続、ドライバマッチングとプローブスコア結果、および USB デバイスに対する要求に関する詳細な情報を提供します。 USB Prober は、Developer SDK インストールの一環としてインストールされます。Developer SDK をすでにインストールしている場合、USB Prober は /Developer/Applications/Utilities/USB Prober にあります。 ログを生成するバージョンの IOUSBFamily Kext は、Apple Developer Connection (ADC) で入手できます。 重要: テストに使用する Mac OS のバージョンに適したバージョンの IOUSBFamily kext を使用する必要があります。使用するログ生成バージョンの IOUSBFamily kext が不適切な場合、システム起動時にカーネルパニックが生じることがあります。 注意: USB デバイスドライバの開発には、USB アナライザの使用もお勧めします。USB アナライザは必須のツールではありませんが、ドライバに関する問題を診断する際に時間とエネルギーの節約になります。アナライザは、バスで発生している USB トランザクションを表示します。USB パケットトレースは、エラーの戻り、データが返されない理由、予期せぬ結果が返される理由、その他の問題が起こる理由を理解するのに役立ちます。以下に、USB メーリングリストの中で開発者らが引合に出した USB アナライザのベンダーをリストアップします。注意: このリストは情報提供のみを目的としており、これらのベンダーの製品を推奨するものではありません。 注意:ログ生成バージョンの IOUSBFamily カーネル拡張は、Windows で利用可能なパケットトレース情報を提供しません。 Q:どちらの USB デバイスドライバタイプを実装すべきでしょうか。アプリケーションレベルの USB ドライバでしょうか、それともカーネルレベルの USB ドライバでしょうか。A:この質問に対する答えは、「Getting Started with Device Drivers」をよく読めば分かります。ソフトウェア開発は、アプリケーション空間で行うほうがはるかに簡単です。アプリケーションレベルのドライバ開発には、Xcode に組み込まれているソースレベルデバッガを使用できます。カーネル内ドライバの場合は、カーネル内デバイスドライバのデバッグを行う GDB デバッガを使用する必要があります。カーネルでのコーディングを行う場合、開発作業はずっと複雑なものなります。可能なかぎり、カーネルでのプログラミングは行わないでください。 アプリケーションレベルまたはカーネルのどちらでプログラミングする場合でも、USB デバイスドライバのプログラミングには IOKit を使用します。IOKit を理解することは、USB デバイスドライバの実装に役立ちます。 Q:アプリケーションレベルの USB ソフトウェアを作成する際の共通条件は何でしょうか。サンプルコードはどこで入手できますか?A:以下に、アプリケーションレベルの USB ドライバ/アプリケーションを実装する場合の条件とサンプルをいくつか挙げます。詳細については、リンクとして参照先を提供します。
アプリケーションレベルのドライバを作成するには、デバイスの検出とデバイスインタフェースのオープンに精通する必要があります。詳細は、「Working with USB Device Interfaces」を参照してください。アプリケーション空間から USB デバイス/インタフェースを検出するサンプルコードは、標準の Developer Tools インストールパッケージの一部としてインストールされる Developer Examples フォルダにあります。場所は /Developer/Examples/IOKit/usb/ です。 Q:どのような場合にカーネルレベルの USB デバイスドライバを作成するべきでしょうか。A:デバイスにマッチするクラスドライバをアップルが提供しておらず、デバイスをカーネルプロセスで使用する場合に、カーネルレベルのドライバを実装します。たとえば、USB ネットワーク、シリアル、およびマスストレージデバイスドライバはカーネル拡張として実装する必要があります。デバイスサービスをすべてのアプリケーションで利用可能にする場合は、HID デバイスドライバをカーネルレベルにできますが、デバイスを特定アプリケーションで使用する場合は、アプリケーションレベルのドライバとして実装します。 アプリケーションレベルの USB ドライバの場合と同様に、IOKit を理解する必要があります。 Q:カーネルレベルの USB ドライバに関してはどのようなプログラミングサンプルがありますか?A:3つのプログラミングサンプルに加えて、USB デバイス用アップルカーネルレベルドライバのソースコードがあります。これらのプログラミングサンプルは完全なドライバではなく、特定のドライバプログラミング技法を示すために設計されたものです。参照できるサンプルを以下にリストアップします。
以下は Apple USB Class ドライバのリストです。これらのソースコードは、Darwin Web サイトから入手できます。これらのソースコードファイルにアクセスするには、Apple Developer Connection (ADC) Member ID を持ち、Apple Public Source License Agreement に同意する必要があります。
アップルの USB クラスドライバは、USB-IF Device Class Documents web page から入手できるデバイスクラス仕様に基づいています。 Q:もっと支援が必要な場合は、誰と連絡を取ればいいのですか?A:さらに支援が必要な場合は、USB メーリングリストが最良の出発点になります。質問を投稿するには、リストに加入する必要があります。USB エンジニアリングチームのメンバもこのリストの一員なので、このリストに参加している多数の開発者と一緒に質問に答える可能性があります。入門レベルの質問がある場合は、すでに質問と回答があるかもしれないので、USB メールアーカイブをよく調べてください。 Mac OS X USB Class ドライバ、またはアップルが提供している API の使用や実装に関するバグを見つけたら、バグレポートを提出すると、問題を追跡することができます。Mac OS X やアップルが提供している API に対する強化要求を提出するには、バグレポートを利用します。 USB Mail List から十分な回答を得られずさらに支援が必要な場合には、Technical Support Incident 要求を提出できます。 Q:アップルのソフトウェアまたはそのロゴのライセンスは取得できますか?A:アップルのソフトウェアのライセンスを取得する必要がある場合は、ライセンス取得可能なソフトウェアのリストと、ライセンスを取得する手順について Apple Software Licensing にお問い合わせください。Mac ロゴも、Apple Software Licensing からライセンスを取得できます。 Q:デバイスとソフトウェアの互換性テストに関してアップルの支援を受けられますか?A:自分の製品と、USB のサポートが組み込まれているアップル製品の互換性テストを迅速に行いたい場合は、製品を 5 つ下記の住所にお送りください。 Craig Keithley I/O Technology Evangelist Apple 1 Infinite Loop, MS-303-2TE Cupertino, CA 95014 よくある質問と回答Mac OS X 用の USB デバイスドライバを初めて開発する開発者がしばしば直面し、USB メーリングリストでよく質問されている質問を以下にいくつか挙げておきます。 Q:Mac OS X におけるデバイス/インタフェースのドライバマッチングの基準は何ですか?システムにおいて、kext と USB デバイスがマッチしません。マッチング通知で指定した条件に一致する USB デバイスがシステムにおいて検出されません。A:デバイスマッチングのルールを理解するには、テクニカル Q&A の QA1076 「Tips on USB driver matching for Mac OS X」を参照してください。 Q:USB 呼び出しのゼロ以外の結果が何を意味するのか知る方法はありますか?A:USB 関数が返す一般的なエラーコードは、IOReturn.h および USB.h ヘッダファイルで定義されています。0xE0000XXX という形式のエラー結果は、一般的な IOKit エラーです。0xE00040XX という形式のエラー結果は、USB 固有のエラーです。 IOReturn.h ヘッダファイルの完全パスは次のとおりです。 /System/Library/Frameworks/IOKit.Framework/Headers/IOReturn.h USB.h ヘッダファイルの完全パスは次のとおりです。 /System/Library/Frameworks/IOKit.Framework/Headers/usb/USB.h IOReturn.h または USB.h に定義されているエラーと照合できるように、エラー結果を 16 進数で表示したいとします。たとえば、 リスト 1. IOReturn.h からの抜粋
...
#ifndef sys_iokit
#define sys_iokit err_system(0x38)
#endif /* sys_iokit */
#define sub_iokit_common err_sub(0)
#define sub_iokit_usb err_sub(1)
...
#define iokit_common_err(return) (sys_iokit|sub_iokit_common|return)
#define iokit_family_err(sub,return) (sys_iokit|sub|return)
#define kIOReturnSuccess KERN_SUCCESS // OK
..
#define kIOReturnNoResources iokit_common_err(0x2be) // リソース不足
#define kIOReturnIPCError iokit_common_err(0x2bf) // IPC 中のエラー
#define kIOReturnNoDevice iokit_common_err(0x2c0) // 該当デバイスなし
#define kIOReturnNotPrivileged iokit_common_err(0x2c1) // 特権違反
#define kIOReturnBadArgument iokit_common_err(0x2c2) // 無効な引数
#define kIOReturnLockedRead iokit_common_err(0x2c3) // デバイス読み取りがロック
#define kIOReturnLockedWrite iokit_common_err(0x2c4) // デバイス書き込みがロック
#define kIOReturnExclusiveAccess iokit_common_err(0x2c5) // 排他的アクセス時に
// デバイスがすでにオープン
エラー宣言を十分に理解するには、Technical Q&A QA1075 Making Sense of I/O Kit Error Codes で I/O Kit エラーコードに関する説明を参照してください。 Q:カーネル内 KEXT デバイスドライバをロードすると、図 1 に示すようなウインドウに、マシンを再起動する必要があると表示されます。何が起きているかを理解し、この状態に対処する方法に関する情報はどこで入手できますか?A: このようなウインドウが表示された場合には、カーネルパニックが発生しています。対処方法については、テクニカルノートの 2063 「Understanding and Debugging Kernel Panics」を参照してください。 Q:カスタムの SCSI コマンドを USB Mass Storage Class デバイスに送るにはどうすればいいのでしょうか。A:この質問は、テクニカル Q&A の QA1179 「Sending SCSI Commands to Storage Devices」で扱っています。 ドキュメントの改訂履歴
掲載日: 2004-09-22 |