Linux Zaurus C700 に Treva を接続


TrevaとC700の接続

所有していた、Zaurus MI-P1のクレードルをあまり使っていなかったので、 壊して16ピンコネクタを取り出す。
参考にしたページでは、電圧のレベル変換をしていたが、 SL-C700では、内部電圧が3.3[V]なので、 そのままTrevaの電源に接続すればよい。 データは、シリアル端子のRTS/CTS端子を、 それぞれTrevaのClock-IN,Data-OUTに接続する。
Treva用コネクタは、auショップを何件かまわり、 モックアップをただでもらい、 その中から取り出す。
最近 H” は Air-H"しか相手にしてないのか、 PHSのモックアップ自体が少ない。
Zaurus Treva
5 RTS Clock-IN
6 CTS Data-OUT
8 GND GND
11 Vcc(3.3[V]) Vcc
できあがった、基板の写真を掲載する。
# ユニバーサル基板の端子面にくっつけたので、
# 端子が基板から金属膜ごと剥がれることがあり、
# ハンダ付けのやり直しが面倒だった。

読み出しソフトの開発

シリアルポートのRTS/CTSによる読み出しなので、 Memory mapped I/O のCPUなので、/dev/mem + mmap() により直接 UARTの制御レジスタを書き換えるプログラムを作成するが、 どうも動作してくれない。
そこで、メーリングリストからのお知恵を拝借し、 /dev/ttyS0 を ioctl() により Clock 信号を作り出す。 しかしながら、ioctl() のオーバーヘッドが大きいため、 70KHz 程度の周波数しかだせない。 このため、画像の取得速度も1秒間に約1枚という 低速になってしまった。 色情報の扱いなどについては、 参考にしたページのソースを若干修正した程度。
ソフトは、コマンドラインから起動し、画像を取得し 指定ファイルに BMP 形式で保存するだけです。 Qt アプリが作りたい所ですが、今の知識ではちょいと無理です。 どなたか、RGB 画像を連続して張り付けるだけの サンプルプログラムご存知じゃありませんか?

カーネルモジュールを作って高速取得

/dev/ttyS0 + ioctl()での読み出しは、1秒間に1枚程度 (状況によっては1枚の取得に3秒)かかるため、非常に処理速度が 遅い。そこで、カーネルモジュールを作成し直接 RTS/CTS を操作して データを読み取ることが考えた。
そこで、操作の簡単な proc ファイルシステムを作成する。 しかし、YUV 形式を RGB 形式に変換するためには行データが揃わないと 変換が手間なので、proc ファイルシステムから読み取る際には、 Treva の YUV 形式そのままで出力し、ユーザプログラム側で YUV → RGB 変換をすることとした。
以下のプログラムを make すると、treva.o というカーネルモジュール が出来上がるので、insmod により組み込む。これにより、/proc/treva というファイルができる。このデータを読み出せば、YUV 形式のデータ を読み取れる。
ただし、Treva の画像開始ヘッダを読み取る間、カーネルから処理が 戻らないと、プロセスの独占状態になり他プロセスとの並列処理に 影響が発生するかも知れない。そこで、このカーネルモジュールでは、 ヘッダが始まるまでは、"# 数値<CR>"を返し、ヘッダ開始が 確認されると、"# START<CR>" を返した後、画像データをYUV により出力する。
よって、読み取りプロセスは、先頭が"# ...<CR>"を読み捨てること。
また、C700 などの CTS などのデータ取得用の I/O ポートは、 サスペンド時の対処のためか、ttyS0 をオープンしていないと 正しくデータを読み込めない。このため、/proc/treva を読み書き する時は、ttyS0 をオープンし、処理が終ったら閉じること。
この記事 によれば、対処方法もある様だが、当初の使い方の予定が 並行して ttyS0 を PIC などにシリアル接続する予定なので、 あえて、記事内の対処はしていない。

参考にしたページ