NuDCL [Mac用USBデバイス工作]
前回からしばらく間があいていたが、実はちょっとした新しい発見があった。以前MacOS Xのデバイスを制御するためのフレームワークであるI/O Kitの勉強のためにIIDCカメラのドライバを書いた。なんとか動くところまでこぎつけたけど、まだ動作がぎこちないのでver.10に上げることができていなかった。
ちょっとしたことから、そこの部分に進捗があった。またすぐ忘れてしまうので、今日から数回そのことをまとめておく。
DCLが定義してあるヘッダにはNuDCLという新しいものも定義されていて新しくプログラムするならこっちを使え、と書いてある。しかし、NuDCLに関する情報は少なく、なかなか中身がわからなかった。
ところでFireWire SDKのExampleは大きなコードが多くて、レベルの低い疑問を解決してくれなさそうなので、もう整理しようと思っていた。たまたまExamplesのなかにAVCVideoServices-42というコード(FireWire SDKにしかなくてDev Centerのサンプルとしてはあがっていない)があって、その中でNuDCLが使われていることを知った。大きなExampleフォルダの中でNuDCLを使っているのはこれひとつだった。
さらにこのうちUniversalReceiver.cpp(およびUniversalTransmitter.cpp)には古いDCLとNuDCLのどちらかをコンパイル時に使い分けられるようになっていた。つまり
これのおかげでちょっとNuDCLがどんなものかわかった。もっと前に気がついていればなあ、このサンプルもreadmeには何も書いてないし。
わかった部分をまとめておく。また、DCLの使い方そのものもこのサンプルコードでわかったのでいずれはIIDCカメラのドライバを書き換えたい。
DCLには2種類定義されている。古いDCLとNuDCLである。
古いDCLはどうやら古いMacOSの時代からあったものらしい。これをMacOS Xの思想に合わせて作り替えたものがNuDCLらしい。
大まかに言ってNuDCLは
具体的にどのように違っているのか、コーディングはどうするのか、をひとつひとつについてまとめておく。
ひとつのDCLコマンドはパケットひとつ分のデータを受けるとか流すとかいった単純な作業をする。例えばカメラからフレームひとつ分のデータを受け取るためには、パケットの数だけDCLコマンドを繰り返す。ひとつのパケットを受けるコマンドのつぎにそのつぎのパケットを受けるコマンドをつなげる。コマンドは列になるがこれをリンクトリストにする。
それぞれのコマンドを生成してリンクトリストに繋ぐためにDCLPoolというuser spaceのI/O Kitオブジェクトを使う。コマンドの実行はLocalPortというFireWireのホスト側の接続部を表すオブジェクトが行う。実際のデータはChannelという通信経路を表すオブジェクトからDCLコマンドがやりとりする。
そういった関係を図-1に示す。 前置きだけで終わってしまった。
ちょっとしたことから、そこの部分に進捗があった。またすぐ忘れてしまうので、今日から数回そのことをまとめておく。
1 はじめに
以前MacOS X用にIIDCカメラのドライバを作ったときに、FireWire経由のデータ転送専用のメカニズムであるDCL(Datastream Control Languageの略らしい)というものを使わなければならなくなった。DCLはTechNoteがあってなんとなくわかって、とりあえず動作するDCLを組むことができた。しかしあまり効率のいい書き方ではなかったらしくてCPUのロードは高くないのにときどきデータを取りこぼす。他に動作するサンプルが見当たらなくてどこを直せばいいのかわからなかった。DCLが定義してあるヘッダにはNuDCLという新しいものも定義されていて新しくプログラムするならこっちを使え、と書いてある。しかし、NuDCLに関する情報は少なく、なかなか中身がわからなかった。
ところでFireWire SDKのExampleは大きなコードが多くて、レベルの低い疑問を解決してくれなさそうなので、もう整理しようと思っていた。たまたまExamplesのなかにAVCVideoServices-42というコード(FireWire SDKにしかなくてDev Centerのサンプルとしてはあがっていない)があって、その中でNuDCLが使われていることを知った。大きなExampleフォルダの中でNuDCLを使っているのはこれひとつだった。
さらにこのうちUniversalReceiver.cpp(およびUniversalTransmitter.cpp)には古いDCLとNuDCLのどちらかをコンパイル時に使い分けられるようになっていた。つまり
#define kAVS_Use_NuDCL_UniversalReceiver 1というようにプリプロセサ変数が定義されているとNuDCLを使うようにコンパイルされ、なければ古いDCLが使われる。そしてそのソースには両方のコードが前後に並んでいた。
これのおかげでちょっとNuDCLがどんなものかわかった。もっと前に気がついていればなあ、このサンプルもreadmeには何も書いてないし。
わかった部分をまとめておく。また、DCLの使い方そのものもこのサンプルコードでわかったのでいずれはIIDCカメラのドライバを書き換えたい。
2 古いDCLとNuDCL
DCLとは、MacOS XのI/O Kit Frameworkの一部で、FireWire(IEEE1394)のような転送レートの速いインターフェイスを経由してデータを送ったり受け取ったりするためのMacOS固有のメカニズムである。ハードウェアの割り込みになるべく早く応答するために、DCLコマンドという専用の命令をリンクトリストの形式でつないだコマンド列を先に作っておいて、実際の転送の際にそれを実行するという手順をとる。FireWire以外でも利用可能なメカニズムのはずなんだけど、USBその他では使われない。DCLには2種類定義されている。古いDCLとNuDCLである。
古いDCLはどうやら古いMacOSの時代からあったものらしい。これをMacOS Xの思想に合わせて作り替えたものがNuDCLらしい。
大まかに言ってNuDCLは
- Core Foundationのスタイルに合わせる
- DCLにくらべて使いやすくする
具体的にどのように違っているのか、コーディングはどうするのか、をひとつひとつについてまとめておく。
2.1 DCLとは?
DCLはなにをするものなのか、ということをまとめておく。ひとつのDCLコマンドはパケットひとつ分のデータを受けるとか流すとかいった単純な作業をする。例えばカメラからフレームひとつ分のデータを受け取るためには、パケットの数だけDCLコマンドを繰り返す。ひとつのパケットを受けるコマンドのつぎにそのつぎのパケットを受けるコマンドをつなげる。コマンドは列になるがこれをリンクトリストにする。
それぞれのコマンドを生成してリンクトリストに繋ぐためにDCLPoolというuser spaceのI/O Kitオブジェクトを使う。コマンドの実行はLocalPortというFireWireのホスト側の接続部を表すオブジェクトが行う。実際のデータはChannelという通信経路を表すオブジェクトからDCLコマンドがやりとりする。
そういった関係を図-1に示す。 前置きだけで終わってしまった。
2010-06-27 22:00
nice!(0)
コメント(0)
トラックバック(0)
コメント 0