開発環境
印刷用ページへ

Mac OS X MavericksにおけるFTDIシリアルポートドライバの取扱い

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)ドライバを提供しています。

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コマンドでモニターできます。

kextstat|wc -l
128
kextstat|grep FTDI
$

上の実行例は、USB-シリアル変換IC未接続の状態で実行した結果です。ロードされているカーネル拡張モジュールは全部で128個ありますが、この中に"FTDI"と言う名前をもつモジュールはありません。

次に、FTDI製USB-シリアル変換ICを接続してみます(Mac OS XにはあらかじめVCPドライバインストール済み)。

kextstat|grep FTDI
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ドライバがインストールされていない場合は、

$ kextstat|grep FTDI
140 0 0xffffff7f80f1f000 0x7000 0x7000 com.apple.driver.AppleUSBFTDI (1.0.1b1) <127 36 5 4 3>

Apple製ドライバのみがロードされます。

cu/ttyキャラクタ型デバイスの登録

ドライバがロードされると/devディレクトリ上には、接続されたUSB-シリアル変換ICに対応するキャラクタ型デバイスファイルが出現します。

$ ls -l /dev/*serial*
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 /dev/cu.usbserial-FTUG3YAF 38400

この状態で、screenコマンドにcuデバイスファイル名を指定すると、38400ボーの通信速度で接続されたターミナルエミュレータが起動します。FTDIボードとLinux組み込みマイコンボードなどをRS-232-Cケーブルで接続すれば、シリアル通信が可能になります。

カーネル拡張モジュールのアンロード

Mac OS Xでは、カーネル拡張モジュールをアンロードするためには、kextunloadコマンドを用います。-bundleオプションで、アンロードする拡張モジュールのバンドルIDを指定します。実行には管理者権限が必要なので、sudoの前置が必要です。

$ sudo kextunload -bundle com.FTDI.driver.FTDIUSBSerialDriver
Password:
$ kextstat|grep FTDI
$

上記例では、FTDI製のVCPドライバをアンロードしています。

$ sudo kextunload -bundle com.apple.driver.AppleUSBFTDI
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ディレクトリに存在します。

拡張モジュールディレクトリを指定するアンロードの実行は、次のようになります。

$ sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext

FTDI製VCPドライバの場合。

$ sudo kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBFTDI.kext

Apple製USB-FTDIドライバの場合。

最後に

D2XXライブラリで作成したUSB-FIFO制御プログラムが正常に動作しない場合は、kextstat|grep FTDIを実行し、シリアルポートドライバが存在する場合は対応モジュールのアンロードを適宜実行してください。

posted by Wataru Nishida.