MacOS XのUSBデバイスのメモ

最終更新日:2015/02/14

USB機器のMac OS Xサポートが少ないので、独自に調べて勝手に制御する事を目的に いろいろ調べた記録を残しあります。

10.10以降デフォルトでは署名の無いkextはロードされなくなったようだが、私が 作っているドライバは全く対応するつもりがありません。(2015/02/14)

USB機器が出始めた2000年位の頃は一台が一万円以上していましたが、2013年現在では 高くても数千円で、ジャンクにいたっては数百円で入手できます。なんともすごい時代 になったものです。

USBが成功した理由は、1.0の時には12MHzであった転送速度を全くハードの変更無しに 2.0で480MHzまで向上させた点にあるのではないかと思われます。USB 3.0は残念な事に ハードの変更を行っている点で、あまり普及が進んでいないように見えます。

自作のUSB機器は、2000-2005年くらい頃には8051ベースのCypressの EZ-USB が最もメジャーだったようですが、2009年くらいにはUSBサポートのあるPICやAVRでソフトウエアで サポートを実現する方法などが出てきて、非常に簡単・安価にUSB機器が作れるよう になりました。

MacOS Xになって、ドライバー無しにユーザーランドでUSBがアクセスできるように なって、USBでいろいろできるようになって、非常に便利である。WindowsではHID なデバイスであればドライバ無しでアクセスできるので、自作USB機器にはHIDな デバイスが多いようだ。

Mac OS Xではドライバーが存在しないベンダー依存のUSBデバイスはlibusbを 使って制御可能。libusbを使っているオープンソースとしては libpasoriなどがある。また macamもIOUSBを直接使ってユーザーランドでの処理になる。

アプリ アプリ
kext IOHID libusb
IOUSB
IOKit

HIDなデバイスであればIOHIDレベルでの処理も可能である。

libusbは0.1系と1.x系はAPIがかなり変わっているので、そのままビルドできない。 libpafe は0.0.7は0.1系で0.0.8は1.x系に修正されている。どちらを使っているかの確認は 0.1のヘッダーはusb.hで1.x系はlibusb.hとなっているのですぐに出来る。

libusbは0.1系がなかなか移行が進まないため、両方メンテするのは止めて1.x系を ラップする形で0.1系のサポートを続けているようだ。ところがこのlibusb-compat というソースはLinux系のパッケージシステムに依存したconfigureになっていて、 Mac OS Xでconfigureを通す事が出来ない。。。古いlibusb-0.1.12ソースはconfigureは 通るが、gccのパラメータにWerrorを付けていて、64Bit環境ではdarwin.cがエラーに なってビルドできない。。。

libusbxというlibusbから派生したプロジェクトもあった。2014.01.24にlibusbに マージされたようなので、今後の利用は推奨されない。libusbのサイトはlibusb.info が現在のサイトで、libusb.orgは以前のサイトになっている。

libusb-1.0のconfigureでunivasalなライブラリは以下のパラメータで作成できる。 パラメータを付けないでconfigureを通すと現在のアーキテクチャーのバイナリだけに なるので、違うアーキテクチャで利用できなくなるので注意が必要だ。
./configure CFLAGS="-arch i386 -arch x86_64 -arch ppc" --disable-dependency-tracking

libusbのdylibを/usr/localにコピーせずに、ローカルディレクトリでビルドする場合 にはinstall_name_toolコマンドでライブラリのパスを書き換えておくとよい。 Makefileのサンプルは以下のような感じになる。

#LIBUSB = ../../libusb-0.1.12/
#DYLIB = libusb-0.1.4.4.4.dylib
LIBUSB = ../../libusb-1.0.9/libusb/
DYLIB = libusb-1.0.dylib
libusb.dylib : 
        cp $(LIBUSB)/.libs/$(DYLIB) .
        install_name_tool -id @executable_path/$(DYLIB) $(DYLIB)
        ln -s $(DYLIB) libusb.dylib
Mach-Oのアプリに入れる場合。
install_name_tool -id @executable_path/../Frameworks/$(DYLIB) $(DYLIB)

もちろん.aをリンクフラグでスタティックリンクする方法もある。

アップルのドキュメントにはドライバーにする必要がない物はドライバーに しないようにという記述がある。ただしシリアル、ネットワーク、HID、 マスストレージに関係するインターフェースはドライバーで提供する必要がある。 ubsa-osx京ぽんのドライバーなどがこれにあたる。

HID系のデバイスは空のkextをインストールしてHIDデバイスとして認 識させずにlibusbから制御をする事が出来るらしい。 Appleのメーリングリスト 私が試したデバイスではうまくいきませんでした。 linuxのlibusbではデフォルトのドライバを無視するAPIが用意されている 模様。

IOUSBHIDDriverIOUSBFamily
IOHIDDeviceIOHIDFamily
IOServiceIOKit

HIDを認識させるInfo.plistについては この メーリングリストにあるQA1076が参考になります。例えばHIDなデバイスで特定 の機種だけ独自なドライバを用意する場合は、Info.plistのIOProviderClassが IOUSBInterfaceとなり、 idVendor + idProduct + bInterfaceNumber + bConfigurationValueがマッチしないと そのドライバは読み込まれない事になります。またInfo.plistはキャッシュされる ようなので、注意が必要です。マッチしてロードされたかはioclasscountコマンドで 確認できます。

USBのデバイスドライバはInfo.plistのIOProviderClassによりstart メソッドで渡させる引数が変わる。IOUSBDeviceとInfo.plistに設定 した時にOSDynamicCast(IOUSBInterface, provider)とするとエラー になる。

AppleのUSBの QA1370(前は日本語に翻訳されたページがありましたが、リニューアルでいつの 間にか無くなっていました)

10.6のXcodeにはUSB Prober.app/Contents/Resourcesにusbtracerというコマンドが 用意されていて、rootで動かすとログが見れるようだ。

Takayama Fumihikoさんのページも大変参考になります。

純正ドライバの作り方など

コントロールパイプにサーポートされていないリクエストを送ると、下記のよう なエラーがでる。これはUSBの規格書の"8.3.1 Packet Identifier Field"にある "Endpoint is halted or a control pipe request is not supported"によるもの と思われる。

AppleUSBOHCI[0x25f4800]::ControlPacketHandler, returning status of e000404f

初代iMacのUSBキーボードをMacBookAirにつないで使っているのだが、caps lockを押すと キーボードが使えなくなっていてしまいようになってしまった。電源周りの コンデンサーが劣化したのかと思い分解して交換したが直らなかった。 とりあえずシステム環境設定のキーボードでcaps lockを無効化したら問題が起きなく なった。

USBいろいろ

ジャンクなどをいろいろ買い集めて手元にあるUSB機器

OmniVision Technologies, Inc.OV511 USB 画像キャプチャチップ 昔いろいろいじっていました。 最初はPhilipsのチップとアナログ放送用のチューナがついたモジュールを いじっていて、後にはセンサーがついたモジュールもいじっていたようです。 アナログ放送のVBIを拾いたかったみたいですが、実現できなかったです。 OV511を使ったモジュールは利用されているセンサーがいろいろあるので、 処理の実装が難しいと思う。
STMicroelectronicsSTV0680 (USB Dual-mode Camera) 0x553/0x0202USBカメラ 昔はやった玩具カメラで、ジャンクで買ったら、macamでサポートされていて リファレンスにしていましていました。このチップを使ったカメラは手元に Che-e2!とSlimShot IIあるがChe-e2!はmacam 0.9.2で使えましたがSlimShot IIは 動作しませんでした。昔は使えていた記憶があるのでCCDのサポートコードがi386 で動かなくなっているのではないかと思われる。
BELKINF5U103 USB RS232C変換モジュール 私の最初に手がけたttyなkextでした。OS 9用の ドライバはメーカから提供されていたが、 OS X用のドライバがなくAppleのサンプルコードとFreeBSDのコードを参考にして 作ってみました。 アメリカの大学で研究されている日本人の方が実験機器の接続に使っているとメール で連絡をくれて、ちょっと嬉しかった。
FM Raio Mouse 0x04B4/0x0001マウスにFMチューナがついたモジュール Cypress CY7C63001にラジオのチップPHILIPS TEA5759Hがつながっているが仕様が 分からず放置
Prolific TechnologyPL-2301 0x067B/0x000PC PC接続モジュール データーシートはあるが利用方法が見当たらず未着手
D-LinkDBT-120 0x0A12/0x0001Bluetoothモジュール 昔使っていたシャープ製のPHSがBluetooth対応で、初代Mac miniで 接続する為に購入してみました。中身はCambridge Silicon Radio Ltd.の製品で Device Version Numberは0x1586となっている。Bluetooth 1.1のようだ。
Ours technology Inc.Thunder Bird 0x0EA0/0x2108PC PC接続モジュール 仕様が不明
OMRONHYPER CABLE ME64KTIN 0x0590/0x0011PHS(NTT)対応USBモデムケーブル 利用方法は考えずにジャンクで買ってみた。インターフェースにエンドポイント が13もあった。分解してみたところ EZ-USB CYPRESS AN2121SCが入っていたので、 何かに使えるかもしれない。このモジュールは ME64KTID というDDIポケット用の物もあったようです。こちらはPIDが0x0013ののようです。
Future Technology Devices International Ltd.FT-232R USB RS-232変換モジュール このチップは232の変換チップなのですが、汎用のIOとしても使えるので、 いろいろいじっています。
ASIX Electronics CorporationMCS7780 0x1685/0x0200USB IrDAモジュール 元々MosChipというメーカーのチップでしたが、ASIXに売却されたようです。 ASIXにもMac用のドライバが用意されていますが、私も簡易な物を作ってあります。
SigmaTel, Inc.STIr4200 0x066f/0x4200USB IrDAモジュール Mac OS X 10.6では認識できず
ADMtek IncorporatedADM8511 USB Ethernetモジュール SFにMac用のドライバのプロジェクトがあります。 Pegasusはいろいろなメーカで使われていて、IDが違う物がたくさんある。
Texas Instruments IncorporatedPCM2704,PCM2705
PCM2706,PCM2707
USB オーディオモジュール CoreAudioチームがドライバーを突っ込んでいるので、デフォルトで使えます。 オーディオモジュールはここ にもメモを残している。
SONY 0x054C/0x00D4USB 赤外線リモコン受光器 VAIOに付属していた物でHIDデバイスです。HARDOFFで100円で買ってきました。 赤外線HIDデバイスは他にも数種類購入したが今のところ適当な用途がない。 このモジュールはワンチップマイコンが入っていて、表示は消されているが、NEC の789800のようだ。このチップは78Kと呼ばれているチップで、年代後半から生産され ていて、当初はFlash版は開発用のみでマスクROMで製品化されていた。78F9801という 型番が開発用のフラッシュバージョンのようだ。2005年くらいにはフラッシュ版の チップが一般市場に提供されるようになったようだ。 2005年以前はこのチップがキーボードなどでよく使われていた ようだ。このモジュールはHIDのデータが1秒ぐらいおきに送られてきて、また送られて くるデータも意味不明で、中身をくり抜いてAVRやPICを放り込んだ方がよいかもしれない。
SONYRC-S330,RC-S320 USB Flicaモジュール libpasori/libpafeや3者間通信でブラウザ起動などを試したが、 iC通信(FALP)したいが仕様が分からず手が出せてない。
Philips SemiconductorsPN531 USB NFCモジュール リファレンス用に購入してちょっと調べて放置
KYOCERA Corporation京ぽん PHS オープンソースのドライバーやユティリティがあります。
Silicon LaboratoriesCP2101 0x10C4/0xEA60USB RS-232変換モジュール デジタルテスターのUSB接続に使われて いました。チップメーカーがMac OS X用のドライバーを提供しています。
AtmelV-USB HIDなど オープンソースのAVRを使ったUSBモジュール。ロースピードのみのサポートの為 HIDや独自デバイスなどの利用に限られる。
AtmelMEGA32U4,AT90USB162 USB付きAVRチップ
Seiko Instruments Inc.PORTUS PHS & Wi-Fiルーター QMIとシリアルモジュールになり調査中
Realtek Semiconductor Corp.RTL2832U 0x0BDA/0x2832ワンセグモジュール こちらのページでgqrxというアプリを知ってダウンロードしてみたところ認識できた。
Microchip Technology IncPIC18,PIC24,PIC32 チップが一個200円くらいで売られていて、MicrochipからUSBスタックコードが 提供されているのでちょっと試し中。 PICシリーズは8(PIC18),16(PIC24),32(PIC32)ビットで全く違ったアーキテクチャで 同じSDKとサンプルコードなので大変分かりににくい。。
In-System DesignUSB to IDE Adapter 0x05AB/0x0202 PCI(Planex)のRX-25Hに入っていました。USB 1.0です。おそらく2000年くらいの 製品で、開発元の会社は2001年にCypressに買収されたようです。廃棄済み
I/O DATAUSB to IDE Adapter 0x04BB/0x0A04 Workbit社のUSATとの情報があった。廃棄済み
LogitecLAN-IRU01 0x2047/0x0200赤外線リモコンユニット ハムフェアーで500円で売っていたので、購入してみた。 このVID/PIDはTIのMSP430シリーズのBSLのものになります。USBを接続したときにはBSL として動作するモジュールのようです。普通は製品では通常時はBSLは有効にしないもの だと思うのです。。。未使用のボタンもあり何とも謎です。2016年末にちょっと いじってみたところ、カスタムファームを作れるようになりました。
BUFFALOPC-MDVD/U2 0x04B4/0x8613ビデオキャプチャユニット TERRATEという会社のGRABSTER AV 400と同じようで、Mac用の ドライバは無いようだ。Linuxのドライバは ここにあった。 このモジュールは CypressのFXな モジュールで、実行バイナリをダウンロードして利用するようだ。Linux用のドライバ はWindows用のバイナリからファームウエアを抜き出して、利用するようになっていた。 IO DATAのGV-MDVD3も同じ物のようだ。
HitachiM-520U 0x0858/0x2102ICカードリーダー 公的個人認証サービスやB-CASカードなどの接触型ICカードを読むモジュール。 秋葉原でジャンクを350円で購入。
KeyspanUIA-11F 0x06CD/0x0202IR受信モジュール このモジュールは赤外線リモコン受信モジュールでよくある、HIDではなく Vendor-specificなモジュールでドライバーが必要になるようだ。ドライバーから 初期化がおこなわれないと赤いLEDが点滅したままとなる。これもハードオフで 100円で購入してきて、リモコン送信機は付いていなかった。 TUSB3410を使っている。このチップはシリアル-USBなチップのようで プログラム可能なマイコンではないようなので、生なデータを直接USBに送っている のかもしれない。
Prolific Technology Inc.PL-2305 0x067B/0x2305パラレル変換 エレコムの水色のタイプのもので、スケルトンでPLのチップが見えたので ハードオフでジャンクで買ってきて、Macにつないだところ全く認識せず、バラした ところフィルターのチップが抵抗が無くなっていたので、とりあえずショートさせ てみたがダメで、フラッシュ(24C21)を外したところ 認識できた 。フラッシュに書かれている、内容がMacと相性が悪かったのかもしれない。
Cambridge Silicon Radio Ltd.CSR8510 A10 0x0A12/0x0001Bluetooth 4.0 LE このメーカーのBluetoothモジュールは同じPIDであってもDevice Version Number により機能がかわるようだ。0x8891は4.0LEだが、0x4839は2.1+EDRのようだ。
Prolific Technology IncPL2303 0x050D/0x0103USB RS232C シリアル系はFTで十分と思っていたのだが、pic32progをFTで書いた後にFTの kextをロードしてアンロードすると書き込みができなくなるので、買ってみた。 メーカーがkextを提供しているがSFにもプロジェクトがある。aitendoの新しい ジャンパーのあるモジュールは説明がないが信号線を5V/3.3Vの切り替えできて ちょっと便利かも。ドライバはメーカからも提供されいているが、SFに オープンソース があったが、このプロジェクトは10.9以降の署名付きのバイナリは販売している ようだ。
WCHCH340 0x1A86/0x7523USB 232C aitendoでPL2303と一緒に並んでいて買ってみた。びんぼでいいいのにも使われ ていてメーカーのサイトからドライバをダウンロードして試したところ10.6.8で OSがクラッシュする。。。なんでだろう。 とりあえず雪豹で使えるkextを 作って みた。
IWATSUDS-5102A 0x13D4/0x0005オシロスコープ ファームをバージョンアップする前はVID/PIDが0x0757/0x0588だった。 さるのこしかけで使えるようにしてみた。
?Dual PSX-USB Adaptor 0x0B43/0x0003PSコントローラ変換 スケルトンでサイプレスのチップが使われているのが見えたのでジャンクを 105円で購入。開けてみたところCY7C63001でEPROM内蔵なマイコンだった。 CY7C63xxxというシリーズはM8というRISCをコアに使ったマイコンのようだ。
MicrochipPICKit 3 0x04D8/0x900A PIC24を使ったPICライター
MicrochipPICKit 2 0x04D8/0x0033 PIC18F2550を使ったPICライター。以前はMicrochipがMac用のライティング プログラムをオープンソースで公開していた。このソースはIOUSBを使って実装 されていたが、MPLAB XのPICKitのサポートはlibusbを使っている。
Y-E Data, Inc.FlashBuster-U 0x057B/0x00003.5incフロッピー VAIO C1に付属だった3.5incフロッピー。MacOS X 10.6で使用できて吃驚。
Broadcom Corp.BCM20702 0x0A5C/0x21E8Bluetooth 4.0 LE 手元にある4.0 LEなドングルがすべてCSRなので、確認用に買ってみた。 btstackというオープンソースを試したところ、このモジュールのPID/VIDでビルドし たら使えた。PIC32MXのBLEサポートはこれがいとぐちになった。
ONKYOSE-U55 0x0746/0x5500Audioユニット MacOS 9の頃の製品だがCoreAudioのAudioクラスサポートで使えるようだ。
ELECOMUCAM-M130 0x056E/0x7012USBマイクロスコープ サポートにはMacはのってないがVideoクラスのサポートで認識され Photo Boothで使える。Photo Boothでは解像度の設定など出来ないがWebcam Settings というApp Storeで販売されているアプリを使えば可能かもしれないが未確認。
Logitech 0x046d/0x0870WebCam 認識しなくなったので、バラしていろいろ調べたが分からずとりあえず 電源付近の表面実装コンデンサー10uFを外して普通のコンデンサー33uFを付けたら 復活した。USB Proberで見るとログが出ていたので、電源が不安定になって、 動作が安定しなくなっていたのかも。STV0602をFT2232というセンサー使った 製品のだ。バラしたついでに実験用にブレッドボードに付けられるようにしてみた。
CoregaFEther USB-TXC 0x07AA/0x9601Ethernet Pegasusかと思ってハードオフで買ったら違っていた。DAVICOM DM9601という チップを使っているようだ。Macのドライバーの オープンソース もあったが、ビルドして試したが、正常に動作しなかった。このドライバはRD9700? (ASIX?)というチップで確認したようで、DM9601ではないのかもしれない。FreeBSDには ドライバが用意されている。
BUFFALOLUA-KTX 0x0411/0x0012Ethernet 昔買ったモジュールで蟹さんのrtl8150を使っている模様。標準では使えない。
LinksysUSB10T 0x0565/0x0005Ethernet Peracom Networksという会社のOEMの模様。バラしてないがKawasaki LSIの KL5KUSB101かも。
TITUSB3410 0x0451/0x3410USBシリアル 2004年くらいの製品で、8052が入ったUSBデバイスでプログラムがホストから 放り込める。

くまさんの庵トップへ
Copyright (C) 2015 Hiroki Mori All Rights Reserved.