親指サイズの無線LAN内蔵カメラTrek 2000 Ai-Ballをハックする
2016/03/16
価値ある情報をユーザー視点で発信するブログ
2016/03/16
もくじ
電池駆動可能な超小型無線LAN内蔵ネットワークカメラ、Trek 2000 Ai-Ball(以下Ai-Ball)について先日紹介しました。
ひとりぶろぐ » 【衝撃映像・どうぶつの森が全滅】親指サイズの無線LANカメラAi-Ballが便利で楽しい
チョロQに載せてチョロQ視点で操作ができ、面白い遊びができました。
▲前回の動画が気持ち悪いと評判だったので、ゆったりとした操作で撮影し直しました。
ファームウェアのファイルの形式から、Ai-BallはARM CPUを搭載し、Linuxで動作するものだということは分かっていました。
Ai-Ballを分解すると基板上にシリアルコンソールの存在を示唆するTXD、RXDのパッドがあったので、USBシリアル変換アダプタを取り寄せて接続してみました。
今回はその顛末について書きました。
結論から言うと、それで面白い遊びを考案するところまでは行かなかったのですが、スキルのある方が面白いことを考えてくれることを願ってやみません。
買ったUSBシリアル変換アダプタは、スイッチサイエンスの「FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)」です。
スイッチサイエンス/商品詳細 FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
Ai-BallはARM CPUを搭載。回路は3.3Vであることが予想されますので、ジャンパスイッチ一つで5V/3.3V両対応できるこの製品は大変便利です。しかも小さい。(続きは[Read More]から)
Ai-Ballは分解が簡単。先頭の半球状のキャップは引っ張ると比較的簡単に外れます。
丸いプリント基板が2層になった構造が見えます。
1層目がカメラが付いた基板。Ai-Ballを構成する2枚の基板はコネクタで接続されていて、これも引っ張るとすぐ外れます。
2層目の基板にTXD、RXDのパッドが存在します。
パッドがあるだけですので、USBシリアル変換アダプタの接続のためには、パッドに配線を直接半田付けする必要があります。
TXD、RXDにそれぞれ配線。少し離れた場所にあるGNDにも配線。
Ai-Ballのメイン基板への電源は1枚目の基板からコネクタを介して供給されていますので、配線が済んだら、外したコネクタを元に戻す必要があります。そうしないとAi-Ballは動作しません。
配線の基板に半田付けしたのと反対側には、ブレッドボードに挿せるようにスズメッキ線を半田付けしてあります。
USBシリアル変換アダプタの動作のために、ドライバをインストール。
今回はAi-Ballとの通信にTera Term Proを使いたかったので、Parallels Desktop上のWindows XPにドライバを導入しました。
窓の杜 – Tera Term
USBシリアル変換アダプタをブレッドボードに挿せるようにピンヘッダを用意。
これをUSBシリアル変換アダプタに装着します。
ジャンパスイッチを3.3V側に設定。
USBシリアル変換アダプタをブレッドボードに挿して、Ai-Ballに半田付けした配線と接続。
接続は以下の図のようにします。Ai-BallのTXDとUSBシリアル変換アダプタのRX、Ai-BallのRXDとUSBシリアル変換アダプタのTXとを接続。GNDはGND同士で接続します。
Parallels Desktop上のWindows XPでTera Term Proを実行。シリアルポートのパラメータは57,600bps 8N1(データビット8bit/ストップビット1bit/パリティビット無し/フロー制御無し)です。
項目 | 設定 |
---|---|
ボーレート | 57,600bps |
データビット | 8bit |
ストップビット | 1bit |
パリティビット | 無し |
フロー制御 | 無し |
Ai-Ballの電源を入れると、Tera Term ProにAi-Ballのブートメッセージが流れてくると思います。
「Web server is ready and listenning…」というメッセージまで行って止まったら、Enterキーを押すと「[Trek@DK \W]\$」というコマンドプロンプトが表示されます。
root権限を持ったシェルです。lsと打てばファイルリストが取得できます。
一応ファイルシステムは書き込み可能なのでファイル操作が可能ですが、施した変更は電源を切ると元に戻ってしまいます。
[Trek@DK \W]\$ mount rootfs on / type rootfs (rw) none on /proc type proc (rw) none on /sys type sysfs (rw)
Ai-Ballの動作に変更を加えたいならば、ファームウェアを改変して、アップグレードの手順で全体を書き換えるほかないでしょうね。
シリアルコンソール経由での作業はややもっさりするので、telnetdを起動して、telnet経由でログインできるようにします。
まずは /etc/fstab に以下を追記。
none /dev/pts devpts mode=0622 0 0
続いて、 /dev/pts をマウント。
mkdir /dev/pts mount -t devpts /dev/pts
そして、telnetdを起動。
busybox telnetd -l /bin/sh &
Macからtelnetでログインできました。
この辺りはFlucard Proと同じですね。
前述の通り、現状では施した変更を永続化していないので、電源を切ると元に戻ってしまいますからtelnetdを使う必要があるならば、毎度シリアルコンソールから操作する必要があります。
ftpdを起動して、ftpでファイル転送ができるようにします。
busybox tcpsvd -vE 0.0.0.0 21 busybox ftpd / &
これも、前述の通り現状では施した変更を永続化していないので、電源を切ると元に戻ってしまいますからftpを使いたくば毎度シリアルコンソールから操作する必要があります。
Ai-Ball内蔵のbusyboxは、結構アプレットが豊富です。sendmailなども使えます。
ここで告白するならば、そもそも、USBシリアル変換アダプタを買ってまでシリアルコンソールを利用しようと思い立ったのは、僕がファームウェアアップグレードに失敗したからです。
Ai-Ballのファームウェアは、ファイルサイズがが6MB弱と小さいながら、アップグレード完了までには長い時間がかかります。
僕は、6MB弱しか無いのに長いこと応答が無いことをおかしく思って、途中で中断してしまったのです。
次回起動時から、電源を入れてもAi-Ballの無線LANのアクセスポイントが見えなくなり、手の打ちようが無くなりました。
このような異常事態下でUSBシリアル変換アダプタをAi-Ballに接続し、Tera Term Proでブートメッセージを覗いてみると、uImageのチェックサムを計算した後「Bad Data CRC」というエラーで起動が中断されていることが分かりました。
中断後、「Trek-SD#」というコマンドプロンプトが表示されます。
こんなアホなことをするのは僕ぐらいかと思いますが、折角なので、レンガ状態からのリカバリで得た知見を共有したいと思います。
このコマンドプロンプトは、恐らくU-Bootを元にしたと思われるオリジナルのブートローダのもの。
このブートローダのことを、Trek-SDと呼びたいと思います。
Trek-SDのコマンドプロンプトから、コマンドがいくつか実行できます。実行できるコマンドはhelpで一覧できます。
Trek-SD# help ? - alias for 'help' bootm - boot application image from memory cp - memory copy go - start application at address 'addr' help - print online help iminfo - print header information for application image loadb - load binary file over serial line (kermit mode) printenv- print environment variables run - run commands in an environment variable setenv - set environment variables
OSのアップグレードに失敗し、OSが起動しない状態なので、もちろん無線LAN経由で何かをしたり、Webブラウザを使ってファームウェアのアップグレードをしたりができません。
しかし、Trek-SDのloadbコマンドを使えばファームウェアを転送できそうです。
Trek2000のサポートページからダウンロードしてきたファームウェア、uImage.datをTera Term Proから利用できるところにコピー。
Trek-SDのloadbコマンドを実行。「## Ready for binary (kermit) download to 0x40A00000 at 57600bps…」というメッセージが出ます。これでAi-BallをKermitでのファイル転送待機状態にします。
Tera Term Proの「ファイル>転送>Kermit>送信」を実行、するとファイルオープンダイアログが開きます。
uImage.datを指定し、ファームウェアの転送を開始します。
6MB弱ものファイルを57600bpsで転送しようというのですから、かなり時間がかかります。おおよそ45分はかかるかと思います。
終了すると、以下のようなメッセージが出てKermitでのファイル受信待機状態が解かれ、Trek-SDのコマンドプロンプトに戻ります。
## Total Size = 0x00540718 = 5506840 Bytes ## Start Addr = 0x40A00000
転送が終わったら、今転送したファームウェアからの起動を開始します。
起動はbootmコマンドでできますが、起動前にAi-Ballの電源スイッチをスパナの位置にしておきます。
loadbコマンドでファームウェアを転送完了したのでこれで一件落着のようですが、この状態で電源を切って再度起動しようとすると、転送したファームウェアに対して、ブートローダが例の「Bad Data CRC」エラーを出して起動できません。
正規の手段でファームウェアを転送しないと、ファームウェアが正しいものかどうかをチェックするためのチェックサムのデータが更新されないようなのです。
loadbコマンドでファームウェアを転送後、一回だけ、bootmコマンドで起動が可能ということです。
この一度の機会を利用して、Ai-Ballを設定モードで起動し、さらにファームウェアアップグレードモードに移行します。
ファームウェアアップグレードを開始すると、Ai-Ballがリカバリモードとなって、通常モードでは起動しなくなります。
リカバリモードとなったAi-Ballに接続。BASIC認証が求められますが、その際はユーザ名「user」、パスワード「pass」でログインします。リカバリモードでも、Ai-BallのIPアドレスは192.168.2.1です。
Webブラウザを使って正規の手段でファームウェアを転送。
これでリカバリが完了します。従って、loadbコマンドでファームウェアを転送した後、bootmコマンドで起動する前に、Ai-Ballの電源スイッチをスパナの位置に設定しておくことは非常に重要です。
これを忘れて通常モードでAi-Ballを起動してしまったら、またloadbコマンドで45分かけてuImage.datを転送するところからやり直しです。
Webブラウザからファームウェアのアップロードを開始したら、Webブラウザに完了のメッセージが出るまで放っておきましょう。