Mac OS X Mavericks上で、FTDI社USB-シリアル変換IC用のシリアルポートドライバをアンロードする方法について解説します。
ブレッドボードI/Oプログラミングで使用する、FTDI社USB-FIFO変換IC用の、D2XXライブラリはUSB-シリアル変換IC用ドライバが存在すると正常に動作しません。
このため、USB-FIFO変換ICを接続しD2XXライブラリ経由でプログラム制御する場合は、あらかじめUSB-シリアル変換IC用ドライバをアンロードしておく必要があります。
FTDI社 仮想シリアルポート (Virtual COM Port: VCP)ドライバ
FTDI社は自社が販売しているUSB-シリアル変換IC向けに、仮想シリアルポート(Virtual Communication Port: VCP)ドライバを提供しています。
- FTDI社 VCPドライバ http://www.ftdichip.com/Drivers/VCP.htm
VCPドライバの実体は、USB-シリアル変換ICをOSにシリアルポートとして認識させるための、カーネル拡張モジュール(KEXT: Kernel EXTernal module)です。
USB-シリアル変換ICが接続されると、自動的に対応するカーネル拡張モジュールがロードされ、アプリケーションソフトウェアから"本物のシリアルポート"としてアクセスできるようになります。
Mac OS X上では、従来FTDI製VCPドライバ(別途インストールが必要)が利用されてきましたが、MavericksではApple純正のUSB-FTDIドライバが最初から用意されています。
本稿では、両者を統一して"FTDIシリアルポートドライバ"と表記することとします。
Mac OS Xにおけるカーネル拡張モジュールの確認
Mac OS Xでは、カーネル拡張モジュールのロード状況は、kextstatコマンドでモニターできます。
128
$ kextstat|grep FTDI
$
上の実行例は、USB-シリアル変換IC未接続の状態で実行した結果です。ロードされているカーネル拡張モジュールは全部で128個ありますが、この中に"FTDI"と言う名前をもつモジュールはありません。
次に、FTDI製USB-シリアル変換ICを接続してみます(Mac OS XにはあらかじめVCPドライバインストール済み)。
140 0 0xffffff7f81660000 0x8000 0x8000 com.FTDI.driver.FTDIUSBSerialDriver (2.2.18) <127 36 5 4 3 1>
141 0 0xffffff7f80f1f000 0x7000 0x7000 com.apple.driver.AppleUSBFTDI (1.0.1b1) <127 36 5 4 3>
今度は、ふたつの拡張モジュールが見つかりました。
- com.FTDI.driver.FTDIUSBSerialDriver --- FTDI社製のVCPドライバ
- com.apple.driver.AppleUSBFTDI --- Apple社製のUSB-FTDIドライバ
FTDI社とApple社、ふたつのドライバがロードされていますが、それぞれのドライバ名をバンドルID (bundle ID)と呼びます。
FTDI VCPドライバがインストールされていない場合は、
140 0 0xffffff7f80f1f000 0x7000 0x7000 com.apple.driver.AppleUSBFTDI (1.0.1b1) <127 36 5 4 3>
Apple製ドライバのみがロードされます。
cu/ttyキャラクタ型デバイスの登録
ドライバがロードされると/devディレクトリ上には、接続されたUSB-シリアル変換ICに対応するキャラクタ型デバイスファイルが出現します。
crw-rw-rw- 1 root wheel 18, 23 12 19 23:09 /dev/cu.usbserial-FTUG3YAF
crw-rw-rw- 1 root wheel 18, 22 12 19 23:09 /dev/tty.usbserial-FTUG3YAF
上記例は、UM232H (FT232H: シリアル1チャンネル搭載)を接続した場合ですが、シリアルポートひとつに対して、ふたつのデバイスファイルが登録されています。
UNIXでは歴史的に、TTY (TeleTYpe)デバイスは受信、cu (Call Up)デバイスはモデムなどの発信に利用されてきた経緯があるため、このように2種類のデバイスが用意されています(通常はcuを使用)。
この状態で、screenコマンドにcuデバイスファイル名を指定すると、38400ボーの通信速度で接続されたターミナルエミュレータが起動します。FTDIボードとLinux組み込みマイコンボードなどをRS-232-Cケーブルで接続すれば、シリアル通信が可能になります。
カーネル拡張モジュールのアンロード
Mac OS Xでは、カーネル拡張モジュールをアンロードするためには、kextunloadコマンドを用います。-bundleオプションで、アンロードする拡張モジュールのバンドルIDを指定します。実行には管理者権限が必要なので、sudoの前置が必要です。
Password:
$ kextstat|grep FTDI
$
上記例では、FTDI製のVCPドライバをアンロードしています。
Password:
$ kextstat|grep FTDI
$
次は、Apple製のUSB-FTDIドライバのアンロード例です。ふたつのドライバが存在する場合は、双方をアンロードしてください。
ドライバをアンロードするためにはバンドルIDを使用する以外に、カーネル拡張モジュールを格納するディレクトリ名を指定する方法もあります(オプションは不要)。
$ tree /System/Library/Extensions/FTDIUSBSerialDriver.kext /System/Library/Extensions/FTDIUSBSerialDriver.kext └── Contents ├── Info.plist ├── MacOS │ └── FTDIUSBSerialDriver └── Resources └── English.lproj └── InfoPlist.strings 4 directories, 3 files
FTDI製VCPドライバの本体は、/System/Library/Extensions/FTDIUSBSerialDriver.kextディレクトリに格納されており、上記のような構造になっています。
$ tree /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBFTDI.kext /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBFTDI.kext └── Contents ├── Info.plist ├── MacOS │ └── AppleUSBFTDI ├── Resources │ └── English.lproj │ └── InfoPlist.strings ├── _CodeSignature │ └── CodeResources └── version.plist 5 directories, 5 files
Apple製のUSB-FTDIドライバは、/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBFTDI.kextディレクトリに存在します。
拡張モジュールディレクトリを指定するアンロードの実行は、次のようになります。
FTDI製VCPドライバの場合。
Apple製USB-FTDIドライバの場合。
最後に
D2XXライブラリで作成したUSB-FIFO制御プログラムが正常に動作しない場合は、kextstat|grep FTDIを実行し、シリアルポートドライバが存在する場合は対応モジュールのアンロードを適宜実行してください。