Sim's blog

電子工作はじめてみました

rxtxSerial魔改造

2009-01-30 01:36:19 | その他
1/30 追記 Tsuneoさんが、インタラプト版のファームウェアを開発されましたので、ここに書いてある方法は使わないでください。詳しくはスイッチサイエンスさんもGainer miniのコメントをご覧ください。PIC書き込み環境がない方のために記事は残しておきます。


Gainer miniクローンがUSBハブ経由だとprocessingやgspで動作しないことに関しては、「スイッチサイエンスさんもGainer mini」のコメントでTsuneoさんが見事に解析されています。いくつか解決方法を示されています。

ここではtera termだと動くけど、processingだと駄目という場合の対策を試してみます。本来ですと、Gainer mini側のファームを改造する方が筋が良いのですが、ファーム改造まで待てないという方のための一時的な対策です。

processingやgspでは、RS232Cと通信するためにrxtxSerial.dllを呼び出します。改造は、SetCommStateというAPIの戻り値をチェックしないようにすることです。色々と改造の方法はあると思いますが、どうせつなぎなので、手っ取り早く直接dllファイルをバイナリエディタで書き換えてしまいます。

改造前のrxtxSerial.dll
入手先 Gainer miniのダウンロードページのProce55ingLib_forGAINERmini_v001.zip
日付 2008/04/01 9:56
サイズ 77759バイト
ファイル先頭から3a1c番地の内容 0F
ファイル先頭から3a1d番地の内容 85
(この後はAA 00 00 00 83 C4 F4と続きます)

この0F 85というのはjne rel32なので、nop + jmp rel32に書き換えます。具体的には90 E9です。つまり

ファイル先頭から3a1c番地の内容 0F → 90
ファイル先頭から3a1d番地の内容 85 → E9

と2バイトだけ書き換えます。

バイナリエディタはStiringというのを使いました(vectorのダウンロードページ)。
魔改造なので、何が起きても無保証です。改造前のdllファイルはバックアップしておきましょう。

どうやって見つけたかというと、dumpbin.exeを使って逆アセンブルして、SetCommStateを呼び出しているところを探して、直後のjne命令前後をバイナリエディタでサーチしました。

この改造で、今まで動かなかったUSBハブ経由でも、一応は動くようになりました。とりあえずのつなぎだということを忘れずに。