PICkit2のロジアナがうまくいったのに味をしめて、いろいろ探してみたところsigrokがサポートしているEZ-USB FX2なモジュールがAmazonの中国発送商品で安かったので、購入してさるのこしかけにサポートを入れてみました。
同じような商品が昔Aitendoにもあったようなのですが、ずっと品切れのままです。
EZ-USB FX2はUSBから実行ファームウエアをダウンロードして機能します。sigrokではfx2lafwというファームウエアを作っていて、これを使わせてもらう事にします。
ダウンロードは以前作っておいた、EZloadを使います。
% Ezload -v 0x04b4 -p 0x8613 -n -F -r -f fx2lafw-saleae-logic.fw
ダウンロードされるとfx2lafwというデバイスが現れます。
PB0からPB7までが入力になります。
fx2lafwはバージョンとリビジョンを拾うコントロール転送と、転送をスタートするコントロール転送があります。実際のデータはバルク転送で0x82のパイプから飛んできます。fx2laの1.2ではダウンロードした直後からBulk転送を受け取れるようです。データはバイト毎のビットフィールドで、PICkit2の処理と同じデータフォーマットでした。(PICkit2のRAWデータは4ビットなのですが、扱いにくいので8ビットに変換しています)スタートのコントロール転送は、実際はサンプリングの設定として機能しているようです。
このモジュールはサンプリングされたデータをBulk転送でおくってくるだけで、トリガーの処理はMac側でおこなう必要があります。
fx2lafwもオープンソースなので中身を確認できますしsdccでビルド出来るようです。
これをMac OS XのIOUSBで処理してみました。だいたいはAppleのサンプルプログラムをベースにしました。Bulk転送はReadPipeAsyncを二つ呼んでいて、こうすると最高速で少し安定するような気がしたのですが、ひょっとすると勘違いかもしれません。
使い方
とりあえず簡単にチャンネルとトリガーのタイプをサポートしてみました。バッファは64Kのシングルです。ReadPipeAsyncは二つ上げていますが、使うのはトリガーで引っかかった片方のバッファのみです。
おおよそPICkit2の10倍くらいの分解能があります。ためしに115200ボーのシリアル通信をキャプチャしてみました。
上記は'a'(0x61;START[0]-10000110-END[1])の信号です。
sigrokを調べていて、ちょっとひらめいてDecoderも実装してみました。
cocoaのpluginの仕組みを使っていて、とりあえずシリアルだけです。生データを渡すと解析結果をNSStringで返します。中身はカンマセパレートで開始ポイント、終了ポイント、文字列の3つのデータのくり返しです。
最高速なサンプリングはちょっと安定していないような感じがあるのでBulk転送で生データを送ってくる手法はこのくらいが限界かもしれません。これ以上はモジュール側のCPUやFPGAで処理して、処理したデータをホスト側で受け取るのが現実的なのかもしれません。