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.dylibMach-Oのアプリに入れる場合。
install_name_tool -id @executable_path/../Frameworks/$(DYLIB) $(DYLIB)
もちろん.aをリンクフラグでスタティックリンクする方法もある。
アップルのドキュメントにはドライバーにする必要がない物はドライバーに しないようにという記述がある。ただしシリアル、ネットワーク、HID、 マスストレージに関係するインターフェースはドライバーで提供する必要がある。 ubsa-osxや 京ぽんのドライバーなどがこれにあたる。
HID系のデバイスは空のkextをインストールしてHIDデバイスとして認 識させずにlibusbから制御をする事が出来るらしい。 Appleのメーリングリスト 私が試したデバイスではうまくいきませんでした。 linuxのlibusbではデフォルトのドライバを無視するAPIが用意されている 模様。
IOUSBHIDDriver | IOUSBFamily |
IOHIDDevice | IOHIDFamily |
IOService | IOKit |
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機器で故障はやはりケーブルの断線が多いように思う。後はたまに電源系の コンデンサーが劣化して、不安定になっているケースもある。ハードオフ買ってきた Appleの2世代目のUSBキーボード(A1048)は認識されず、ケーブルを少し切って作り 直したら正常に使えるようになりました。キーボードの付け根の部分が断線しやすい ようです。
このキーボードはiMacに付属していた、1世代目のキーボードに比べて、分解しやすい のはいいのですが、ちょっとキータッチが重いです。
自作USB機器を試していて、ショートさせるなどして、いくつかHUBを壊してしまった。 GL850Gをというチップを使ったHUBを壊してしまい、調べてみた。 このチップは5Vから3.3Vのレギュレータが入っていて3.3VをAVCCなどにつないで、 使うようなのだが、どうもこのレギュレターが壊れてGNDに短絡してしまい、3.3Vが 出なくなって認識できなるようだ。このチップはネットでは熱による損傷などの記事も みうけられますが、こちらの壊れた機材は特にパッケージには異常はなかったです。
もちろん自作機器を直接Macにつないだりはしません。
おおざっぱなUSB機能がある8Bit系マイコンの歴史
OmniVision Technologies, Inc. | OV511 | USB 画像キャプチャチップ | 昔いろいろいじっていました。 最初はPhilipsのチップとアナログ放送用のチューナがついたモジュールを いじっていて、後にはセンサーがついたモジュールもいじっていたようです。 アナログ放送のVBIを拾いたかったみたいですが、実現できなかったです。 OV511を使ったモジュールは利用されているセンサーがいろいろあるので、 処理の実装が難しいと思う。 | |
STMicroelectronics | STV0680 (USB Dual-mode Camera) | 0x553/0x0202 | USBカメラ | 昔はやった玩具カメラで、ジャンクで買ったら、macamでサポートされていて リファレンスにしていましていました。このチップを使ったカメラは手元に Che-e2!とSlimShot IIあるがChe-e2!はmacam 0.9.2で使えましたがSlimShot IIは 動作しませんでした。昔は使えていた記憶があるのでCCDのサポートコードがi386 で動かなくなっているのではないかと思われる。 |
BELKIN | F5U103 | USB RS232C変換モジュール | 私の最初に手がけたttyなkextでした。OS 9用の ドライバはメーカから提供されていたが、 OS X用のドライバがなくAppleのサンプルコードとFreeBSDのコードを参考にして 作ってみました。 アメリカの大学で研究されている日本人の方が実験機器の接続に使っているとメール で連絡をくれて、ちょっと嬉しかった。 | |
FM Raio Mouse | 0x04B4/0x0001 | マウスにFMチューナがついたモジュール | Cypress CY7C63001にラジオのチップPHILIPS TEA5759Hがつながっているが仕様が 分からず放置。D-Link DSB R-100と同じくGemtek社製と思われるが、HIDなんで仕様が 違うと思う。D-Link DSB R-100のコントロールコードはLinux方面にある。 | |
Prolific Technology | PL-2301 | 0x067B/0x000 | PC PC接続モジュール | データーシートはあるが利用方法が見当たらず未着手 |
D-Link | DBT-120 | 0x0A12/0x0001 | Bluetoothモジュール | 昔使っていたシャープ製のPHSがBluetooth対応で、初代Mac miniで 接続する為に購入してみました。中身はCambridge Silicon Radio Ltd.の製品で Device Version Numberは0x1586となっている。Bluetooth 1.1のようだ。 |
Ours technology Inc. | Thunder Bird | 0x0EA0/0x2108 | PC PC接続モジュール | 仕様が不明 |
OMRON | HYPER CABLE ME64KTIN | 0x0590/0x0011 | PHS(NTT)対応USBモデムケーブル | 利用方法は考えずにジャンクで買ってみた。インターフェースにエンドポイント が13もあった。分解してみたところ EZ-USB CYPRESS AN2121SCが入っていたので、 何かに使えるかもしれない。このモジュールはME64KTIDというDDIポケット用の物も あったようです。こちらはPIDは0x0013のようです。 USBケーブルが接続されている部分に近いところにあるI2CなROMをはがしたら、EZ-USB のベンダーIDで認識されるようになりました。Mac OS Xにサンプルプログラムがあった ので試してみました。 |
Future Technology Devices International Ltd. | FT-232R | USB RS-232変換モジュール | このチップは232の変換チップなのですが、汎用のIOとしても使えるので、 いろいろいじっています。 | |
ASIX Electronics Corporation | MCS7780 | 0x1685/0x0200 | USB IrDAモジュール | 元々MosChipというメーカーのチップでしたが、ASIXに売却されたようです。 ASIXにもMac用のドライバが用意されていますが、私も簡易な物を作ってあります。 |
SigmaTel, Inc. | STIr4200 | 0x066f/0x4200 | USB IrDAモジュール | Mac OS X 10.6では認識できず |
ADMtek Incorporated | ADM8511 | USB Ethernetモジュール | SFにMac用のドライバのプロジェクトがあります。 Pegasusはいろいろなメーカで使われていて、IDが違う物がたくさんある。 | |
Texas Instruments Incorporated | PCM2704,PCM2705 PCM2706,PCM2707 |
USB オーディオモジュール | CoreAudioチームがドライバーを突っ込んでいるので、デフォルトで使えます。 オーディオモジュールはここ にもメモを残している。 | |
SONY | 0x054C/0x00D4 | USB 赤外線リモコン受光器 | VAIOに付属していた物でHIDデバイスです。HARDOFFで100円で買ってきました。 赤外線HIDデバイスは他にも数種類購入したが今のところ適当な用途がない。 このモジュールはワンチップマイコンが入っていて、表示は消されているが、NEC の789800のようだ。このチップは78Kと呼ばれているチップで、年代後半から生産され ていて、当初はFlash版は開発用のみでマスクROMで製品化されていた。78F9801という 型番が開発用のフラッシュバージョンのようだ。2005年くらいにはフラッシュ版の チップが一般市場に提供されるようになったようだ。 2005年以前はこのチップがキーボードなどでよく使われていた ようだ。このモジュールはHIDのデータが1秒ぐらいおきに送られてきて、また送られて くるデータも意味不明で、中身をくり抜いてAVRやPICを放り込んだ方がよいかもしれない。 | |
SONY | RC-S330,RC-S320 | USB Flicaモジュール | libpasori/libpafeや3者間通信でブラウザ起動などを試したが、 iC通信(FALP)したいが仕様が分からず手が出せてない。 | |
Philips Semiconductors | PN531 | USB NFCモジュール | リファレンス用に購入してちょっと調べて放置 | |
KYOCERA Corporation | 京ぽん | PHS | オープンソースのドライバーやユティリティがあります。 | |
Silicon Laboratories | CP2101 | 0x10C4/0xEA60 | USB RS-232変換モジュール | デジタルテスターのUSB接続に使われて いました。チップメーカーがMac OS X用のドライバーを提供しています。 |
Atmel | V-USB | HIDなど | オープンソースのAVRを使ったUSBモジュール。ロースピードのみのサポートの為 HIDや独自デバイスなどの利用に限られる。 | |
Atmel | MEGA32U4,AT90USB162 | USB付きAVRチップ | ||
Seiko Instruments Inc. | PORTUS | PHS & Wi-Fiルーター | QMIとシリアルモジュールになり調査中 | |
Realtek Semiconductor Corp. | RTL2832U | 0x0BDA/0x2832 | ワンセグモジュール | こちらのページでgqrxというアプリを知ってダウンロードしてみたところ認識できた。 |
Microchip Technology Inc | PIC18,PIC24,PIC32 | チップが一個200円くらいで売られていて、MicrochipからUSBスタックコードが 提供されているのでちょっと試し中。 PICシリーズは8(PIC18),16(PIC24),32(PIC32)ビットで全く違ったアーキテクチャで 同じSDKとサンプルコードなので大変分かりににくい。。 | ||
In-System Design | USB to IDE Adapter | 0x05AB/0x0202 |
|
|
I/O DATA | USB to IDE Adapter | 0x04BB/0x0A04 | ||
Logitec | LAN-IRU01 | 0x2047/0x0200 | 赤外線リモコンユニット | ハムフェアーで500円で売っていたので、購入してみた。 このVID/PIDはTIのMSP430シリーズのBSLのものになります。USBを接続したときにはBSL として動作するモジュールのようです。普通は製品では通常時はBSLは有効にしないもの だと思うのです。。。未使用のボタンもあり何とも謎です。2016年末にちょっと いじってみたところ、カスタムファームを作れるようになりました。 |
BUFFALO | PC-MDVD/U2 | 0x04B4/0x8613 | ビデオキャプチャユニット | TERRATEという会社のGRABSTER AV 400と同じようで、Mac用の ドライバは無いようだ。Linuxのドライバは ここにあった。 このモジュールは CypressのFXな モジュールで、実行バイナリをダウンロードして利用するようだ。Linux用のドライバ はWindows用のバイナリからファームウエアを抜き出して、利用するようになっていた。 IO DATAのGV-MDVD3も同じ物のようだ。 |
Hitachi | M-520U | 0x0858/0x2102 | ICカードリーダー | 公的個人認証サービスやB-CASカードなどの接触型ICカードを読むモジュール。 秋葉原でジャンクを350円で購入。 |
Keyspan | UIA-11F | 0x06CD/0x0202 | IR受信モジュール | このモジュールは赤外線リモコン受信モジュールでよくある、HIDではなく Vendor-specificなモジュールでドライバーが必要になるようだ。ドライバーから 初期化がおこなわれないと赤いLEDが点滅したままとなる。これもハードオフで 100円で購入してきて、リモコン送信機は付いていなかった。 TUSB3410を使っている。このチップは8051が入ったマイコンのようです。 EZ-USB同様にホストからファームをダウンロードできるようです。 リモコンとして使うにもドライバーが無いので、とりあえずI2CなROMをはがして、 素のTUSB3410にしてみました。 |
Prolific Technology Inc. | PL-2305 | 0x067B/0x2305 | パラレル変換 | エレコムの水色のタイプのもので、スケルトンでPLのチップが見えたので ハードオフでジャンクで買ってきて、Macにつないだところ全く認識せず、バラした ところフィルターのチップが抵抗が無くなっていたので、とりあえずショートさせ てみたがダメで、フラッシュ(24C21)を外したところ 認識できた 。フラッシュに書かれている、内容がMacと相性が悪かったのかもしれない。 |
Cambridge Silicon Radio Ltd. | CSR8510 A10 | 0x0A12/0x0001 | Bluetooth 4.0 LE | このメーカーのBluetoothモジュールは同じPIDであってもDevice Version Number により機能がかわるようだ。0x8891は4.0LEだが、0x4839は2.1+EDRのようだ。 |
Prolific Technology Inc | PL2303 | 0x050D/0x0103 | USB RS232C | シリアル系はFTで十分と思っていたのだが、pic32progをFTで書いた後にFTの kextをロードしてアンロードすると書き込みができなくなるので、買ってみた。 メーカーがkextを提供しているがSFにもプロジェクトがある。aitendoの新しい ジャンパーのあるモジュールは説明がないが信号線を5V/3.3Vの切り替えできて ちょっと便利かも。ドライバはメーカからも提供されいているが、SFに オープンソース があったが、このプロジェクトは10.9以降の署名付きのバイナリは販売している ようだ。 |
WCH | CH340 | 0x1A86/0x7523 | USB 232C | aitendoでPL2303と一緒に並んでいて買ってみた。びんぼでいいいのにも使われ ていてメーカーのサイトからドライバをダウンロードして試したところ10.6.8で OSがクラッシュする。。。なんでだろう。 とりあえず雪豹で使えるkextを 作って みた。 |
IWATSU | DS-5102A | 0x13D4/0x0005 | オシロスコープ | ファームをバージョンアップする前はVID/PIDが0x0757/0x0588だった。 さるのこしかけで使えるようにしてみた。 |
? | Dual PSX-USB Adaptor | 0x0B43/0x0003 | PSコントローラ変換 | スケルトンでサイプレスのチップが使われているのが見えたのでジャンクを 105円で購入。開けてみたところCY7C63001でEPROM内蔵なマイコンだった。 CY7C63xxxというシリーズはM8というRISCをコアに使ったマイコンのようだ。 |
Microchip | PICKit 3 | 0x04D8/0x900A | PIC24を使ったPICライター | |
Microchip | PICKit 2 | 0x04D8/0x0033 | PIC18F2550を使ったPICライター。以前はMicrochipがMac用のライティング プログラムをオープンソースで公開していた。このソースはIOUSBを使って実装 されていたが、MPLAB XのPICKitのサポートはlibusbを使っている。 | |
Y-E Data, Inc. | FlashBuster-U | 0x057B/0x0000 | 3.5incフロッピー | VAIO C1に付属だった3.5incフロッピー。MacOS X 10.6で使用できて吃驚。 |
Broadcom Corp. | BCM20702 | 0x0A5C/0x21E8 | Bluetooth 4.0 LE | 手元にある4.0 LEなドングルがすべてCSRなので、確認用に買ってみた。 btstackというオープンソースを試したところ、このモジュールのPID/VIDでビルドし たら使えた。PIC32MXのBLEサポートはこれがいとぐちになった。 |
ONKYO | SE-U55 | 0x0746/0x5500 | Audioユニット | MacOS 9の頃の製品だがCoreAudioのAudioクラスサポートで使えるようだ。 |
ELECOM | UCAM-M130 | 0x056E/0x7012 | USBマイクロスコープ | サポートにはMacはのってないがVideoクラスのサポートで認識され Photo Boothで使える。Photo Boothでは解像度の設定など出来ないがWebcam Settings というApp Storeで販売されているアプリを使えば可能かもしれないが未確認。 |
Logitech | 0x046d/0x0870 | WebCam | 認識しなくなったので、バラしていろいろ調べたが分からずとりあえず 電源付近の表面実装コンデンサー10uFを外して普通のコンデンサー33uFを付けたら 復活した。USB Proberで見るとログが出ていたので、電源が不安定になって、 動作が安定しなくなっていたのかも。STV0602をFT2232というセンサー使った 製品のだ。バラしたついでに実験用にブレッドボードに付けられるようにしてみた。 | |
Corega | FEther USB-TXC | 0x07AA/0x9601 | Ethernet | Pegasusかと思ってハードオフで買ったら違っていた。DAVICOM DM9601という チップを使っているようだ。Macのドライバーの オープンソース もあったが、ビルドして試したが、正常に動作しなかった。このドライバはRD9700? (ASIX?)というチップで確認したようで、DM9601ではないのかもしれない。FreeBSDには ドライバが用意されている。 |
BUFFALO | LUA-KTX | 0x0411/0x0012 | Ethernet | 昔買ったモジュールで蟹さんのrtl8150を使っている模様。標準では使えない。 |
Linksys | USB10T | 0x0565/0x0005 | Ethernet | Peracom Networksという会社のOEMの模様。バラしてないがKawasaki LSIの KL5KUSB101かも。 |
TI | TUSB3410 | 0x0451/0x3410 | USBシリアル | 2004年くらいの製品で、8052が入ったUSBデバイスでプログラムがホストから 放り込める。 |
BUFFALO | WLI-U-G144N | 0x0411/0x00ca | WIFI | |
エレコム | CMS-V11 | 0x093a/0x2600 | Webcam | Pixart Imaging Inc.のチップが使われているようだ。 |