SSブログ

Mac用USBデバイス-40 FireWire抄訳開始 [Mac用USBデバイス工作]

去年の暮れ、EZ-USBのファームをプログラムするのを後回しにしてMac OS XのFireWireのdevice interfaceを見ることにした。当初目的から言えば本末転倒だけど、I/O Kitがすごく面白いのによくわからないところが多いのでもうちょっと突っ込んでみたいと思った。

今日からAppleのガイドの翻訳(意訳)をやってそのあとFireWireをアプリから直接操作するのを試してみたい。そこまでいけばI/O Kitのことをもう少しわかったような気になれるのではないか、と期待して。

ここからまたしばらくAppleのドキュメント「FireWire Device Interface Guide」の抄訳をやる。

ただし、device interfaceを使えるようになるのが目的なので、上位プロトコルのSBP-2とAV/Cの説明部分はとばすことにする。

FireWire on Mac OS X

FireWireはAppleの実装した云々。去年の暮れに独自にまとめたので省略。

FireWire Overview

省略。本当の概説とSBP-2とAV/Cのプロトコルについて。IIDCに言及無し。

In-Kernel FireWire Device Support

Kernelの中では、オブジェクトのいくつかの層でそれぞれのFireWireデバイスが表現されている。例えばFireWire OHCI(Open Host Controller Interface)などのMacに装備されているFireWireハードウェアインターフェイスそれぞれに対して、IOFireWireファミリがIOFireWireControllerオブジェクトをI/O Registry内に登録している。IOFireWireControllerオブジェクトはひとつのFireWireハードウェアインターフェイスの上に存在している複数のデバイスとプロトコルのバス制御のためのサービスを供給している。

IOFireWireファミリは登録のあと、バスにあるそれぞれのデバイスのコンフィグROMを読もうとする。バス情報ブロックで応答したそれぞれのデバイスに対してIOFireWireファミリはIOFireWireDeviceをI/O Registryの中に登録する。IOFireWireDeviceオブジェクトはデバイスのノードID(これはバスの動的再構成によって変わる可能性がある。動的再構成とは物理的に抜き差しされると起こるアドレスのつけ直しのこと)を追跡して、デバイスのコンフィグROMからデバイスのGUID(global unique identification)などのproertyを自分のpropertyリストにコピーする。さらにユニットディレクトリが見つかればIOFireWireUnitオブジェクトをI/O Registryに登録する。図にオブジェクトスタックを示す。
IOFireWireUnitオブジェクトはさらにユニットのporpertyをI/O Registryのなかのpropertyリストにコピーする。I/O Kitはこれらのpropertyをユニット特定IDとユニットソフトウェアバージョンでマッチできるようにする。例えばSBP-2ユニットが見つかればIOFireWireSBP2 KEXTがマッチしてロードされる。IOFireWreSBP2ファミリはIOFireWireSBP2Targetオブジェクトを登録して、IOFireWireSBP2TargetはコンフィグROMをスキャンして論理ユニット(Logical unit、LUN)ごとにIOFireWireSBP2LUNを登録する。

AV/Cユニットに対してもおおよそ同じである。IOFireWireAVC KEXTがマッチしてIOFireWireAVCUnitオブジェクトが登録される。

IOFireWire Family Device Interface Libraries

kernel内ドライバマッチングのためにI/O Kitが使っているデバイスとユニットのpropertyはアプリレベルのデバイスマッチングにも使える(「Device Matching for FireWire Devices」)。スキャナやデジカメやプリンタなどの多くのデバイスがアプリから正しく制御するために、IOFireWireファミリが供給するそれらへのアクセスのためのdevice interfaceを使うことができる。ほとんど全部のkernel内ドライバがIOFireWireファミリのdevice interfaceを通してアプリで利用できる。

アプリからFireWireデバイスやユニットと通信するために、IOFireWireファミリは3つのライブラリを供給している。それぞれいくつかのdevice interfaceを持っている
  • IOFireWireLib(標準的なFireWireコマンドとアイソクロナス転送用)
  • IOFireWireSBP2Lib(SBP-2ユニットにORBを送ったりログイン状態を制御する)
  • IOFireWireAVCLib(AV/CユニットにAV/Cコマンドを送る)
注意;デバイスがSBP-2仕様に準拠して、SCSI アーキテクチャモデルのSCSI プライマリコマンド仕様を満足しているなら、SCSIアーキテクチャモデルファミリのdevice interfaceを使うことを考えるべきである。

ヘッダはIOKit.frameworkにある。

IOFireWireLib Device Interfaces

IOFireWireLibは、標準のFireWireデバイスの機能とアイソクロナス転送にアプリがアクセスするためのdevice interfaceのライブラリである。IOFireWireLibはuser空間で利用できる最も低レベルのFireWireインターフェイスを供給する。コンフィグROMをブラウズしたり、コマンドを送ったりバス制御を行ったりできる。IOFireWireLibはまた、アイソクロナス転送を制御できるようにする。チャンネルオブジェクトをオープンしてアイソクロナスデータを受けることができるinterfaceがある。図1-2にIOFireWireLibにあるインターフェイスを示す。
IOFireWireLibの他のインターフェイスを使うには、まずプライマリインターフェイスであるIOFireWireDeviceInterfaceを得る必要がある。IOFireWireDeviceInterfaceには直接デバイスと通信するための関数と、図1-2にあるような他のインターフェイスを生成するメソッドがある。デバイスのためのIOFireWireDeviceInterfaceだけでなくローカルノード、つまりMacそのもののインターフェイスも得ることができる。図1-3にどうやってアプリがIOFireWireDeviceInterfaceのインスタンスを使ってFireWireバスのデバイスと通信するかを示す。
IOFireWireDeviceInterfaceのインスタンスが手に入ったら、次のことが可能になる
  • FireWireバスリセット
  • アシンクロナスリード、ライト、ロック用のコマンドオブジェクトインターフェイスを生成する
  • アイソクロナスチャンネルを生成したり制御したりアイソクロナスデータをやり取りするインターフェイスを生成する
  • Macのローカルユニットディレクトリの制御やリモートデバイスのコンフィグROMのブラウズなど、その他のサービス用のインターフェイスを生成する
IOFireWireLibサービスとインターフェイスをその他二つのライブラリと一緒に使うこともできる。

IOFireWireSBP2Lib Device Interfaces

省略。

IOFireWireAVCLib Device Interfaces

これも省略。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0