高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1370
Common QA and Roadmap for USB Software Development on Mac OS X

このロードマップは 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 ドライバ/アプリケーションを実装する場合の条件とサンプルをいくつか挙げます。詳細については、リンクとして参照先を提供します。

  • デバイスと通信するのは、自分のアプリケーションのみ。

  • ソフトウェアが、カーネルプロセスで使用されない。

  • TWAIN plugin for a scanner

  • Plugin for a Digital Camera using Image Capture

  • Plugin for a USB HID ForceFeedback device

  • Plugin for a USB printer

  • USB Uninterruptible Power Supply (UPS) Monitor

  • Deva Example(Developer SDK の一部として収録)- /Developer/Examples/IOKit/usb/Deva Example。このサンプルでは、アプリケーションレベルから USB デバイスと通信する方法を示しています。このサンプルのターゲットは DevaSys USB I2C/IO、インタフェースボードです。

  • Ezloader Example(Developer SDK の一部として収録)- /Developer/Examples/IOKit/usb/Ezloader Example。このサンプルは、Cypress/Anchor EZ-USB チップベースのデバイス向けに設計したものです。このアプリケーションレベルのデバイスドライバでは、デバイスの検出、ファームウェアのアップグレードの方法を示し、新しいファームウェアを使用してデバイスを列挙し直す呼び出しを発行します。また、似たようなサンプルの USBNotification Example もあります。

  • NotifyExample(Developer SDK の一部として収録)- /Developer/Examples/IOKit/usb/NotifyExample。このサンプルでは、USB デバイスの取り付けと取り外しの検出、および取り付けられた各 USB デバイスに対応するグローバルデータのストレージを示しています。

  • USB Private Data Sample。このサンプルでは、システムに USB デバイスを取り付けたり取り外す際に、IOKitLib と IOUSBLib を使って非同期コールバックを設定する方法を示しています。また、任意のデータと各デバイスインスタンスを関連付ける方法も示しています。

  • HID Explorer。この完全なプログラムサンプルは USB 固有のものではありませんが、USB HID デバイスレポート記述子をアクセス・解析するヒューマンインタフェースデバイス (HID) ユーティリティの使用法を示しています。このサンプルユーティリティプログラムは、マウス、キーボード、キーパッド、ジョイスティック、ゲームパッドなど、ほとんどの USB HID デバイスに対して使用できます。完全なアプリケーションのコンパイルには、必要な libHIDUtilities バンドルを作成するために、HID Utility Sources もダウンロードしてください。

  • VendorSpecificType00。これは USB マスストレージクラスデバイスに対して使用できる SCSI (Small Computer System Interface) プログラムのサンプルで、IOSCSIPeripheralType00 ドライバをサブクラス化してベンダ固有のカスタム機能を追加する方法を示しています。また、I/O Registry のプロパティを使って、ユーザ空間コードに対する簡単なインタフェースを設定する方法も示しています。SCSI コマンドを USB マスストレージクラスデバイスに送信する必要がある場合は、Technical Q&A1179 の「Sending SCSI Commands to Storage Devices」を参照してください。

アプリケーションレベルのドライバを作成するには、デバイスの検出とデバイスインタフェースのオープンに精通する必要があります。詳細は、「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 デバイス用アップルカーネルレベルドライバのソースコードがあります。これらのプログラミングサンプルは完全なドライバではなく、特定のドライバプログラミング技法を示すために設計されたものです。参照できるサンプルを以下にリストアップします。

  • AnchorUSB Driver(Developer SDK の一部として収録) - /Developer/Examples/Kernel/IOKit/usb/AnchorUSB Sample。このドライバサンプルは、Cypress/Anchor EZ-USB チップベースのデバイス向けに設計したものです。このサンプルでは、EZ-USB チップセットのファームウェアアップグレードの方法を示し、新しいファームウェアを使用してデバイスを列挙し直す呼び出しを発行します。

  • VendorSpecific Driver(Developer SDK の一部として収録)- /Developer/Examples/Kernel/IOKit/usb/VendorSpecific Driver。このドライバサンプルは、カーネルレベルの USB ドライバプロジェクトの基本を示す簡単なプロジェクトです。

以下は Apple USB Class ドライバのリストです。これらのソースコードは、Darwin Web サイトから入手できます。これらのソースコードファイルにアクセスするには、Apple Developer Connection (ADC) Member ID を持ち、Apple Public Source License Agreement に同意する必要があります。

  • IOUSBFamily プロジェクトの USB OHCI コントローラ

  • IOUSBFamily プロジェクトの USB EHCI コントローラ

  • IOUSBFamily プロジェクトの USB 複合クラスドライバ

  • IOUSBFamily プロジェクトの USB HID ドライバ(キーボードとポインティングデバイスをサポート)

  • IOUSBFamily プロジェクトの USB CDC Ethernet デバイス

  • IOUSBFamily プロジェクトの USB CDC(シリアル)デバイス

  • IOUSBMassStorageClass プロジェクトの USB Mass Storage Bulk Only デバイス

  • IOUSBMassStorageClass プロジェクトの USB Mass Storage Control/Bulk/Interrupt (CBI) デバイス

  • IOUSBMassStorageClass プロジェクトの USB Mass Storage Uniform Floppy Interface(UFI) デバイス

  • AppleUSBAudio プロジェクトの USB Audio Class ドライバ

アップルの 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 進数で表示したいとします。たとえば、USBInterfaceOpen 呼び出しが -536870203 という結果で失敗したとしましょう。この値を 16 進数の - 0xE00002C5 に変換します。IOReturn.h の定義を見ると、このエラーは kIOReturnExclusiveAccess と一致します。

リスト 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最初のバージョン -

掲載日: 2004-09-22