October 02, 2008

10月のToDo

[Timely]

最近更新頻度が落ちてしまい、見にきてくださる方には大変申し訳ない限りです。とりあえず9月末までにこなすべき案件をようやくほぼ処理しきれた(もうすでに10月というツッコミはなしの方向でお願いします)ので、10月にやりたいことでも列挙しておこうかな、という気分になりました。このブログ自体が1記事、1内容という書き方に比較的こだわっているせいもあって、こういう雑記的なことは控えていたのですが、更新頻度が落ちてしまっている今、背に腹は変えられないというのが現状だったりもします(笑)。

  • GPS IF抽出機のソフトを含めた完成。某方よりリクエストがありました!!
  • Chumbyのデバイスドライバまわりを弄りたいのです。最終的にはFT232経由でXBeeをフラッシュからコントロールしたいなぁ。
  • Makeに出展も一度はしてみたいのですが、エンタメ型デバイスを持っていないという現実。今から準備だとなると、XBee電力計を改造してエンタメデバイスにするというのが一番現実的な解でしょうか。
  • Super SylphideのDSP周りをいろいろとゴニョゴニョして半自動操縦ができるようにしたい。
  • 秋月でやたらと新入荷している新しいPICでそろそろ何か遊んでみたい。PICkit2はちゃっかり秋月から入手済みなのですが、まだ封を切っていません orz
  • 聖地(八ヶ岳)巡礼、n年連続登攀中。

自分で言うのもなんですが、予定は未定。格言ですね(笑)

23:50 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (4) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/665

October 07, 2008

ChumbyでFTDI

小さい目覚ましLinuxコンピュータ時計のChumbyで、FTDIのUSBシリアル変換チップ、例えばFT232RLを認識させて、Flashからコントロールしようと考えているのですが、方向性が見えてきたので一旦まとめ記事を作っておきたいと思います。

調べてみると先人によって実験がされていることがわかりました。例えばISHさんのChumby目覚ましリモコン化という記事が大変参考になります。要約を書いておきますと、手順としては以下ののことをされていました。

  1. Chumbyのクロス開発環境を構築
  2. カーネル/ドライバ(ftdi_sio.ko)のリビルド、この際にFTDIのドライバを組み込む
  3. 組み込んだFTDIのドライバとFlashを中継してくれるようなcgiを作成して、FlashからFTDIのチップを叩けるようにする
  4. できたカーネルやドライバ、cgiをChumbyに入れ込む

ポイントとしては、Chumbyに載っているフラッシュプレーヤのソースが公開されていないため、フラッシュからハードを叩く方法がわからないことだと思います。これはChumbyに載っているフラッシュがAdobeとの共同開発で、ライセンスに縛りがあるためのものだそうです。そこでcgiを作成することによって、フラッシュからハードへのブリッジをしているというわけです。

最近の事情(SW 1.6.0/FW 773)ですと、上記のリンクで手作りをしているドライバ(ftdi_sio.ko)が標準でついてくるようになりました。/drivers/ftdi_sio.koというのがそれで、insmodをすることによってFTDIのチップを認識するようになります。とりあえずの動作確認はinsmodをしたときにエラー表示がでないこと、lsmodでftdi_sioが表示されること、FTDIチップをUSBにつないだあと/dev/ttyUSB0が現れることで行いました。
しかし残念ながら、起動時にこのドライバを読み込むことにはなっていない、つまりはいちいち起動後にシェルにログインしてinsmodで有効化する必要があるようです。これは起動時に実行されるスクリプト/etc/init.d/rcSにinsmod ftdi_sio.kioがないことからうかがい知ることができます。従ってこのスクリプトを書き換えてしまえばいいのですが、残念ながらファイルシステムが読み込みのみ可能であるcramfsでできているので、単純にvi等で書き換えることができません。これをするためには『How to modify the root filesystem』にあるように、ddコマンドでイメージを吐き出し、別のマシンでマウントして、編集後、あらたなイメージを作成、Chumbyにいれなおす、という手順をとらないといけないようです。

以上述べてきた作業、cgiを入れ込んだり、FTDIドライバを有効にする作業は、Linuxなどに長けている人ならば別に抵抗なくできるでしょうが、ChumbyとFTDIを使って何かをしてくれるだろう人、極端に言うならばArduinoGainer、XBeeを使って何かしようとしているアーティストの方、にとってはかなり酷な作業かと思います。そこで自動化できないか検討してみようと考えていますが、どうやらUSBメモリスティックにちょっとした細工をすることによって可能になると思います。具体的には、ファイルが存在すれば起動時にカスタムな処理を行ってくれるUSB上のdebugchumbyというスクリプトを(ごにょごにょ)する予定です。

Cygwin上でChumbyの開発環境をつくりました。
※※(ごにょごにょ)で自動化しました。

08:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (3) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/666

October 09, 2008

CygwinでChumbyの開発環境

最近、かわいらしい時計デバイスChumbyと戯れているのですが、困ったことに本家の開発者向けWikiでは、Chumbyの開発環境(クロスコンパイラ)はLinux上で動作するものしか提供されていません。日常作業はほとんどCygwin上で行っていることもあり、わざわざ他のマシンを立ち上げたり、仮想マシンをこさえてLinuxをつくるというのも面倒くさいので、Cygwinで開発環境をつくることにしました。

で、結論として開発環境を"ほぼ全自動"で作ってくれるchumby.makefileなるものを作成しました。適当なディレクトリ上でmake -f chumby.makefileをすると、/usr/local/chumby上に色々とインストールしてくれます。アセンブラ(binutil-2.18由来)やコンパイラ(c,c++でgcc-4.3.2由来)は/usr/local/chumby/toolchain/binに入りますので、実際に使う際はそこへPATHを通してから、ということになると思います。例えばhello.cをコンパイルする際はPATH=$PATH:/usr/local/chumby/toolchain/bin arm-linux-gcc -o hello hello.cという感じです。Chumby本体を使いHello World等いくつかの基本的なプログラムで動作検証を行いましたが、問題なく動作しています。

上のMakefileですが、"ほぼ全自動"というところがポイントで、現状では1回ほど『gmp.h? そんなファイルは見つからねぇ』というエラーを吐いてとまってしまうことを確認しています。その場合はmakeを実行したディレクトリの下に展開されるgcc-4.3.2/BUILD_arm-linux/gcc/Makefileを手動で編集し、その後にmakeの再実行を行ってください。変更するのは、Makefile内に-I../../gmp-4.2.4 -I../../mpfr-2.3.2や-L../../gmp-4.2.4 -L../../mpfr-2.3.2等の記述で、これらを-I../../../gmp-4.2.4 -I../../../mpfr-2.3.2ならびに-L../../../gmp-4.2.4 -L../../../mpfr-2.3.2のように、1段上の親のパスを探すように変更すれば解消されます。automakeやautoconf絡みのエラーのようで、根本から解決するにはどこかのMakefile.inやconfigureを訂正すればよいのではないかと思います。

※その後、Chumbyだけで設定ファイルを編集できないか検討中です。

09:33 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/667

October 13, 2008

Chumbyだけで設定ファイルを編集

時計デバイスChumbyからFTDI経由でマイコン等を操作しようと作業をしていますが、その過程で本体の設定ファイルを書き換える必要があります。しかしながら、Chumbyのファイルシステムcramfsが読み込み専用、かつ、扱うためのツールもChumbyにはインストールされていないため、開発用PCとファイルをやりとりさねばならず、非常に難儀をしいられるのが現状です。そこで今回の記事では、何とかChumby単体でそれをできるような方針を示してみることにします。

通常、Chumbyの設定ファイルを編集するためには以下の手順をとります。

  1. ddコマンドでROMイメージ(ファイルシステムはcramfs、chumby.orig.imgと以下表記)をUSBメモリ等外部ストレージに吸出し
  2. Linuxが入った開発用PCで吸出したイメージを適当な位置(/tmp/chumby_root)にツールを使って展開(cramfsck -v -x /tmp/chumby_root chumby.orig.img)
  3. 設定ファイルを編集(例えば今回の目的であるFTDIを起動時に有効にするためには、/tmp/chumby_root/etc/init.d/rcSを書き換える)
  4. 編集した部分を含めた全てのファイルを、cramfsファイルシステムでまとめる(mkcramfs /tmp/chumby_root chumby.mod.img)
  5. zipして、update2/rfs1.bin.zipという名前でUSBメモリ等に保存
  6. それをChumbyにさし、タッチスクリーンを押しながら起動。ファイルを書き換える選択肢があるので、それを選択して完了

開発用のPCが必要であり、非常に面倒です。そこでUSBメモリ内に必要なツールを全ていれ、USBメモリ内にファイルを展開、編集、さらには元のcramfsに戻すことをChumby単体でできるようにすることを検討してみました。遭遇した問題と対策を以下に箇条書きをしてみます。

cramfsを展開、作成するコマンドがChumbyにない
Chumby用に作ります。cramfs-1.1をクロスコンパイラでビルドしました。
cramfsckでUSBメモリ内にファイルがつくれない(cramfsckするとsymlink failed: /bin/ash: Operation not permittedみたいなエラー)
USBメモリはvfatファイルシステムでマウントされており、このファイルシステムではシンボリックリンクが作成できないことに起因します。USBメモリ内にext2ファイルシステムのイメージを作成して、それをループバックマウント、そこに展開するようにしました。『VFAT フォーマットの SD カード上に、ext2 領域を作成してマウント』が参考になりました。
Chumbyじゃext2が扱えないよ(cat /proc/filesystemsにext2がない)
Chumbyのカーネルを拡張します。ext2.koモジュールを作成するよう、カーネルを再構築し、できたモジュールをinsmodで組み込むようにしました。
insmod ext2.koしようとするとinvalid module formatといわれた
Chumbyの中にあるKernelをビルドした環境と、導入しようとしているext2.koモジュールをビルドした環境が異なることに由来します。dmesgを実行すると詳細が見れますが、モジュール内の.modinfoセクションの内容が想定外というエラーだと思いますので、ビルドの環境をあわせる、あるいは少々危険ですがemacsなどでE-x hexl-modeして当該箇所をじかに書き換えてしまう、ということで対応できます。objdump --section=.modinfoの情報も役に立つはずです。
ext2のイメージが作れないよ
これもChumby用にツールを作ります。e2fsprogs-1.41.2パッケージをビルドした結果できあがる、misc/mke2fsがイメージ作成ツールです。
ループバックマウントできないよ!!(mount -o loop -t ext2 ext2.img /mnt/usb/hogeでmount: mounting ext2.img on ./mounted/ failedなエラー)
Chumbyのmountコマンドはコマンド寄せ集めツールBusyboxのものなので、非常に低機能でループバックデバイスを受け付けません。Chumby-1.6.0のカーネルはループバックデバイスを許容するように作られているので、まともなmountコマンドさえあればなんとかなるはずです。ということでutil-linux-ng-2.14.1をパッケージをビルドし、出来上がったmount/mountコマンドを使うようにします。『ぎんあん日誌』が参考になりました。
cramfsckで展開するときに途中でfile inode has zero size and non-zero offsetと表示され、失敗する
(現在調査中です、cramfsckが悪いのか、元のイメージが悪いのか、どちらなのでしょう? orz)→エラーを無視して強制的に展開する-fオプションを追加した改変版cramfsckをつくりました。下からダウンロードできるファイルに同梱してあるのは改変版です。
Chumby用のzipコマンドがないよ
例えばソースをここから落としてきて作ります。
Chumbyのファイルを修正する際にpatchとかdiffがあると便利なんですがねぇ(08/10/20追加)
つくるんです。gnuのFTPサイトにあったpatch-2.5.4diffutils-2.8.1から。

作成したツールはchumby_tools_20081020.zipにまとめておきます。USBメモリ等に展開してChumbyでお使いください。なおFTDIを有効化したいだけなのに、上の話を読んでみた結果がこれだよ!!、という方もご安心ください。後日、設定ファイルの書き換えを行い、それをChumbyに反映してくれるような全自動スクリプトを作るつもりです。

全自動スクリプトできました

11:08 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/668

October 20, 2008

ChumbyにFTDIのシリアルUSB変換チップを認識させる

ここ最近時計ガジェットChumbyにはまっているわけですが、比較的スムーズにChumbyでFTDIのシリアルUSB変換チップを起動時から有効化させるためのスクリプトが、この度ようやく完成しましたのでお知らせします。まだまだ不親切設計(正常に作業が進行しているのか、作業中不明)なので、中・上級者向けのツールであることをはじめに断っておきたいと思います。なお詳細は『ChumbyでFTDI』の記事をどうぞ。

使い方の説明を以下にします。動作確認をとった環境はChumbyのSW:1.6.0(メニューからSettings - Chumby Infoで確認可能)です。

まず前回の記事『Chumbyだけで設定ファイルを編集』にあるツール類をまとめたzipファイル(chumby_tools_20081020.zip)をダウンロードしてください。それと今回追加で作成したスクリプトのzip(chumby_make_ftdi_activated_ROM.zip)もダウンロードしてください。これら2つのzipファイルを、Windows等で読み書きできる(つまりフォーマットがFATに準拠している)128MB以上のUSBメモリのルートに展開してください。展開後、USBメモリのルートには3つのディレクトリ cramfs_tools, ext2_tools, mount_util と5つのファイル debugchumby, diff, ftdi_activate.patch, patch, zip ができているはずです。

このUSBメモリを電源が切れている状態のChumbyにさし、Chumbyの電源スイッチをいれます。普段と比べて起動までに相当(5分くらい)の時間を要し不安になりますが、ここで内部的に作業が進行しています。その作業が終わると正常に起動するはずです。正常に起動したらChumbyの電源を落として、USBメモリを抜いてください。
全てがうまくいっているのなら、USBメモリ上に新たにいくつかファイルやディレクトリができています。特にupdate2/rfs1.bin.zipというファイルが有れば、全ての作業がうまくいっています(WIndows機等にUSBメモリをさして中をのぞいてみてください)。そのファイルがない場合はなんらかの問題を抱えているわけですが、この時点では本体のファイルをUSBメモリにコピーして作業をしているので、Chumbyに危害は加えていませんので安心してください。諦めることができます(笑)。

最後にそのUSBメモリを電源が切れた状態のChumbyにさし、指で画面を抑えたまま起動してください。『Countinue to PRESS this screen (省略)』なるメッセージがでると思いますが、画面を押さえたままにしてください。少しすると、『loading special option』というメッセージが表示され、画面がカラフルになっていき(ならない場合はChumby自体が問題を抱えている可能性があります、下記参照)、最終的には『Install updates』という選択肢があるメニュー画面になると思います。『Install updates』を選択し、さらに次の画面で『Install from USB flash drive』を選択すると、FTDIデバイスが起動時に有効化されるようにしたバージョンがROMに書き込まれることになります。このときは画面の指示どおり絶対に電源を切らないでください。書き込みが完了すると自動的に再起動しますので、これ以降はFTDIデバイスが起動時に有効化された状態になります。ということで、作業完了です。

なお、『loading special option』でとまってしまう場合はChumby本体のROMにバットセクタが発生している可能性があります。一度、このような状態になって焦りましたが、Chumbyのフォーラムの文章を参考に修正用ファイルをUSBメモリに展開して起動を繰り返したところ、何とか治ったようです。

※FTDIチップをFlashから叩くため、cgiプログラムを作りました

00:57 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/669

October 23, 2008

FTDIチップ経由でマイコン等と通信するためのCGI

Linux時計ガジェットChumbyからFTDIのUSBシリアル変換チップでマイコンをコントロールしようと企んでいます。そこで、大本のコントロールはChumby上で実行できるFlashを考えているのですが、Flashからハードウェアを直接叩くことが満足にできにないので、間にCGIプログラムを噛ませることにしました。そこでできたのが今回のプログラムです(車輪の再発明な気もしないでもないですが、笑)。

ソースはftdi_cgi.cppで、C++で書いてあります。C++ということでバイナリ効率が物凄く悪い(40KBytes近くになりましたorz)ですが、動けばいいので気にしていません。クロスコンパイラのg++(以前の記事『CygwinでChumbyの開発環境』で開発環境を作っているならarm-linux-g++)でコンパイルしてChumbyの/psp/cgi-bin/に転送後、ブラウザからURLを適当に叩いて動作テストをしましたが、動いているようです。

非常に単純で、URLに送信や受信設定を書いて送ると、ポートをその通りに制御するまでのプログラムです。例えばhttp://cumby_url/cgi-bin/custom/ftdi_cgi?to=10&bl=0&push=00010203&pull=4のようなURLでアクセスすると、読み出しタイムアウト10[0.1sec]、最低読み出し待ち文字0バイト、送信文字列4バイト{0x00, 0x01, 0x02, 0x03}、受信期待文字バイト数4バイト、といった具合です。

次はFlashなので、ActionScriptを久しぶりにやるか、といったところです。

※Chumbyでも使えるもっといい方法があるようですぜ
※※(2008/12/9) 16進変換で大変な勘違いをしていたことがわかり、ソースを修正版に差し替えました。

10:53 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/670

October 26, 2008

ChumbyでArduino等をFlashからコントロールする方法 (XMLSocketが使える?)

時計デバイスChumbyと戯れています。前回の記事『FTDIチップ経由でマイコン等と通信するためのCGI』では、Chumbyに接続したFTDIのUSBシリアル変換チップを経由して、更にその先に繋げたマイコンのコントロールをcgiプログラムを使ってFlashから行おう、というものでしたが実はもっといい方法があるようです。今回の記事ではその方法を紹介しようと思います。なお手元にArduino等の環境がないので、この方法自体の完全な検証が済んでいないことを記しておきます(どなたか貸してください、笑)。

方法ですが、サーバを立ててFlashとソケット通信を確立します。これはデスクトップPCでよく行われている、Flashからシリアルポートをたたく方法(TECH Matari 『Flash(AIR)でシリアル制御する方法まとめ』によくまとめられています)なのですが、この方法は前回紹介したcgiプログラムを使う方法に比べて、1) 接続が保たれるので、受信に素早く簡単(=コールバック関数を使える)に対応できる(cgi版ではいちいち一定間隔ごとに受信ありますか?と尋ねにいく必要あり)、2) 負荷が軽い(cgiは起動コストが大きいです)、という利点があります。運用上でセキュリティによる制限を考慮する必要があるものの、それでも魅力的です。

じゃあなんで前回のcgiを使う方法を紹介していたかというと、Chumbyのフラッシュプレーヤは貧弱でXMLSocketなどできないと思っていたからです。現在Chumbyが対応しているのはFlash Lite 3、つまりはストリーム通信(XMLSocketなど)がサポートされています。よく調べましょう、というオチでした。言い訳をさせていただくと、Chumbyの開発段階で搭載されていたフラッシュプレーヤ(Flash Lite 2の機能限定版)にはXMLSocketがサポートされていなかったことが、本家Wiki(Summaryの項目)で明記されています。

このソケット通信を確立するために使うサーバプログラムですが、Arduino開発環境に付属のserproxyを使ってみることにしました。同じ方法をとっているgainarのFlash用のソース(ソフトウェア・ライブラリのFlash内にあるserial_proxy)をポートしても良かったのですが、こちらはJava+JNI(Java Native Interface)で書かれていたので、Pure CなArduinoに軍配をあげました。少し修正を加えればCygwin上のChumby開発環境でなんなくビルドが通り、またChumby上でも動作しました。後はPC用に作られたArduinoのFlashがChumbyでも走ることを確認できればよかったのですが、これは今後ということにしたいと思います。そういうわけで今回の記事ではserproxyの修正点をまとめたパッチ chumby_serproxy.patchを公開することで、お茶を濁したいと思います。

※Flash XMLSocket + serproxy (+ 特にArduino Firmata)だと問題が発生するようです。新たにパッチを作ってみました。Flash Socketなら問題ないようです。

23:04 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/671