Flucardを先々月購入して中身をいろいろと調べてみたらARMでLinuxを動かしてることがわかりました。
本来とはちょっと違った使い方なので真似される方は自己責任でお願いします<(_ _)>
・telnetでログイン
なんとflucardのWiFiアクセスポイントに接続してtelnetでログインできちゃいます。
ただしファームウェアヴァージョンが新しいものはtelnetが無効にされているみたいなので試される方はダウングレードしてみてください。
ver3.58でtelnetdが起動しているのを確認しました。
ターミナルから
telnet 192.168.1.1または
telnet flu.card
でログイン。
ご覧のとおりLinuxで動いています。
CPUはARM9で5TEJというアーキテクチャのものが使われているようです。
#cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 200.29
Features : swp half fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : KeyASIC Ka2000 EVM
Revision : 0000
Serial : 0000000000000000
・Flucardで自作プログラムをコンパイルしてみる
CPUアーキテクチャが分かったら自作のプログラムをコンパイルして動かしてみたい衝動に駆られますよね(^_^;A
まずはコンパイラの入手&インストール。
ARM用のgccコンパイラで商用のSourcery CodeBenchというものがあります。
無料で使えるLite Editionでも十分なのでこれを使います。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
のARM processorsの欄にあるDownload the GNU/Linux Releaseをクリックします。
するとメールアドレスとパスワードを入力する画面がでるので適宜入力してGet Lite!をクリック。
入力したメールアドレスにダウンロード先のアドレスが送られてくるのでそれをクリック。
一番上にある最新のDownload Sourcery CodeBench Lite 2011.09-70をクリック。
適宜使ってるOSに合わせて一覧からダウンロード。
ダ ウンロードしてインストールしたらarm-none-linux-gbueabi-xxxといった開発に必要なコマンドが一式出来上がるので実行パスを通 しておく。(他は知りませんがLinuxの場合は自動でパスを通してくれました。ログインしなおすと適用されてます。)
お決まりのHello Worldを表示してみる。
#include <stdio.h>
int main()
{
printf("Hello World!!\n");
return 0;
}
↑これをエディタでhello_world.cと保存して
arm-none-linux-gnueabi-gcc -static -o hello_world hello_world.c
と打ち込んでコンパイルします。
よくわかりませんが-staticオプションを付けないとダイナミックリンクになってしまい、実行時にライブラリを要求してしまいエラーになるので必ずスタティックでビルドします。
バイナリが出来上がったらFlucardにアップロードするかFlucardにコピーします。
・Webページからアップロードする場合
アップロードしたファイルはFlucard内の/DCIM/122_TREKというフォルダに保存されます。
・Flucardにカードリーダー等からコピーする場合
/DCIM/122_TREKというフォルダにhello_worldをコピーするだけです。
実行するにはtelnetでログインして
telnet 192.168.1.1
cd /mnt/sd/DCIM/122_TREK
./hello_world
とするとHello World!!が表示されれば成功です。
コンパイルしたhello_world実行バイナリはスタティックビルドのためかHello World!!と表示するだけなのに640KB以上もあります。
stripしても500KBくらいなのでSDカードにコピーしておいて実行パスにシンボリックリンクしたほうが良いです。
/mnt/mtdにマウントされているNORフラッシュメモリは1MBで残りが7割ほど空いてますがここに保存するのは危険です。
WiFiアクセスポイントのコンフィグファイルがあるのでここを弄るのはできるだけ避けましょう。
・パスの通った場所に自作プログラムをシンボリックリンクを張る場合
ln -s /mnt/sd/DCIM/122_TREK/hello_world /usr/bin/hello_world
↑こうするとどこからでもhello_worldを実行できます。
しかし、ルートシステムは書き換え不可の領域にマウントされているようで電源を切ってしまったらせっかく張ったシンボリックリンクが消えてしまいます。
そこでFlucardをアップデートする時に実行されるautorun.shスクリプトにリンク情報を書いておき、いつ起動してもリンクが切れないようにしておくという回避策をとりました。
↓autorun.shの中身
#!/bin/sh
ln -s /mnt/sd/DCIM/122_TREK/hello_world /usr/bin/hello_world
sleep 1
これをFlucardのルートに置いておき消さないようにしておけばいつ起動してもリンク状態は保ったままを維持することができます。
・CGI経由で自作プログラムを実行してみる
FlucardのLinuxシステム内の/www/cgi-binはCGIプログラムを実行するバイナリが置かれている場所です。
ここに自分で作ったプログラムをリンクすればインタラクティブで面白いことができそうです。
今度はCGI経由でブラウザにHello World!!を表示するプログラムを作ってみます。
#inlude <stdio.h>
int main()
{
printf("content-type: text/html\n\n");
printf("<html><body>\n");
printf("Hello World!!\n");
printf("</body></html>\n");
return 0;
}
↑さっきのhello_world.cを改造してヘッダとHTMLタグを埋め込みます。
arm-none-linux-gnueabi-gcc -static -o hello_world hello_world.c
さっきと同じように122_TREKフォルダにhello_worldをコピーしておきます。
今度はこれを
ln -s /mnt/sd/DCIM/122_TREK/hello_world /www/cgi-bin/hello_world
として/www/cgi-bin/内にシンボリックリンクを張ります。
そしてブラウザからflu.card/cgi-bin/hello_worldにアクセスすると
CGI経由でブラウザからHello World!!を表示することができました。
・Un-CGIをつかってスクリプトで書いて見る
Hello World!!が表示できたのでPOSTメソッドのフォームを使ったCGIプログラムができればもっと面白いものができそうです。
しかしブラウザからPOSTメソッドで入力されたデータをC言語で取り出すのはちょっとややこしいので
(perlやphpであれば文字列操作に強力なのですが..)
ややこしい部分を一手に引き受けてくれるUn-CGIをFlucard向けにコンパイルしてみました。
以下の例は入力フォームに名前と年齢とコメントを入力してCGIスクリプトでHTMLに書き出すものです。
入力フォーム(form.html)のソース
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>コメント入力</title>
</head>
<body>
<form method=POST action="cgi-bin/uncgi/myscript">
あなたのお名前
<input type=text size=30 name=name>
<p>
年齢<br>
<select name=age multiple>
<option> 0~20歳未満
<option> 20~50歳未満
<option> 50歳以上
</select>
<p>
コメント
<br>
<textarea name=_comments rows=10 cols=60></textarea><br>
<p>
<input type=submit value="送信する">
</form>
</body>
</html>
CGIスクリプト(myscript)
#!/bin/sh
echo 'Content-type: text/html; charset=UTF-8'
echo ''
echo '<html>'
echo '<head>'
echo '<title>コメント</title>'
echo '<meta http-equiv="content-type" content="text/html; charset=UTF-8">'
echo '</head>'
echo "$WWW_name さん (年齢:$WWW_age)からのコメントです。"
echo '<br>'
echo "$WWW_comments"
echo '</body></html>'
Un-CGIのおかげでbashスクリプトでこんなに簡単にインタラクティブなWebが作れました。
Un-CGIはフォームの各パーツの名前を$WWW_hogeといった形式の変数でCGIに渡してくれます。
以上でいままでやったことをまとめてみました。
私にはセンスがないのでFlucardで何か面白いものを作ってくださる方がいればいいなと思って書きました。(他力本願w)
Flucardのコントロールピクチャも変更できるよ!(詳しくは画像をクリック)
☆2012/4/20更新☆
・rubyのsocket.soが生成されてなかったためsocketライブラリが使用できない不具合を解消しました。
deploy_20120420.zip
☆2012/4/11更新☆
osakanataroさんが
autorun.shの動作をDCIM/122_TREK/fluconfig.txtの内容を編集することで変えられるスクリプトを書いてくださいました<(_ _)>
http://blog.osakana.net/sw/flucard/flucard-autorun-20120411.zip
☆2012/4/10更新☆
・rubyが動くようになりました。
deploy_20120410.zip
ファームウェアヴァージョンが新しいもの(3.62以上?)はtelnetd機能が無効化されているようなので以下のコマンドをautorun.shに追加しました。
killall telnetd
sleep 1
mount -t devpts /dev/pts
/mnt/sd/DCIM/122_TREK/busybox telnetd -l /bin/sh &
sleep 1
しかしtelnetログインすると当方の環境ではログイン直後にコネクションが落ちてしまいました。
調べてみると、
__getpagesize: Assertion `_rtld_global_ro._dl_pagesize != 0' failed.
という謎のメッセージが・・・。
とりあえずsshログインはできるようです。
☆2012/4/9更新☆
・perlが動くようになりました。
・dropbearによるsshログインができるようになりました。(scp, sftpも使えます。)
ssh 192.168.1.1
password
でログインできます。
autorun.shのdropbear -A -N root -C admin -U 0 -G 0でsshdを起動しています。
パスワードは-Cオプションのadminを書き換えると変更できます。
また、公開鍵暗号を使ってパスワードなしで認証ログインすることもできます。
-クライアント側で公開鍵を作りFlucardに転送-
ssh-keygen -t rsa -f ~/.ssh
scp ~/.ssh/id_rsa.pub 192.168.1.1:/etc/dropbear/authorized_keys
-Flucard側の操作-
killall dropbear
dropbear -A -N root -C '-' -U 0 -G 0 -R /etc/dropbear/authorized_keys -s
-認証ログイン-
ssh 192.168.1.1 または
ssh -i ~/.ssh/id_rsa 192.168.1.1
deploy_20120409.zip
☆2012/4/6更新☆
・フル機能のbusyboxをコンパイルして載せました。
122_TREK/busyboxから適当に追加したいコマンドを引き出してください。
・実行バイナリの動的リンクに対応しました。
自作バイナリをstaticでコンパイルしなくても動くようになります。
122_TREK/lib内にあるシェアードライブラリをFlucardの/libにシンボリックリンクしています。
↓動的リンクでコンパイルしたバイナリの依存ライブラリの確認方法
arm-none-linux-gnueabi-readelf -a hoge | grep NEEDED
・PHPが使えるようになりました。
122_TREK/etc/php.ini phpコンフィグファイル
122_TREK/www/php/info.php phpのinfo()
122_TREK/www/php/exif_thumbnail.php JPEGのEXIFサムネイル表示テスト
・FTPが常時使えるようになりました。
put/getできます。
deploy_20120406.zip
本来とはちょっと違った使い方なので真似される方は自己責任でお願いします<(_ _)>
・telnetでログイン
なんとflucardのWiFiアクセスポイントに接続してtelnetでログインできちゃいます。
ただしファームウェアヴァージョンが新しいものはtelnetが無効にされているみたいなので試される方はダウングレードしてみてください。
ver3.58でtelnetdが起動しているのを確認しました。
ターミナルから
telnet 192.168.1.1または
telnet flu.card
でログイン。
ご覧のとおりLinuxで動いています。
CPUはARM9で5TEJというアーキテクチャのものが使われているようです。
#cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 200.29
Features : swp half fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : KeyASIC Ka2000 EVM
Revision : 0000
Serial : 0000000000000000
・Flucardで自作プログラムをコンパイルしてみる
CPUアーキテクチャが分かったら自作のプログラムをコンパイルして動かしてみたい衝動に駆られますよね(^_^;A
まずはコンパイラの入手&インストール。
ARM用のgccコンパイラで商用のSourcery CodeBenchというものがあります。
無料で使えるLite Editionでも十分なのでこれを使います。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
のARM processorsの欄にあるDownload the GNU/Linux Releaseをクリックします。
するとメールアドレスとパスワードを入力する画面がでるので適宜入力してGet Lite!をクリック。
入力したメールアドレスにダウンロード先のアドレスが送られてくるのでそれをクリック。
一番上にある最新のDownload Sourcery CodeBench Lite 2011.09-70をクリック。
適宜使ってるOSに合わせて一覧からダウンロード。
ダ ウンロードしてインストールしたらarm-none-linux-gbueabi-xxxといった開発に必要なコマンドが一式出来上がるので実行パスを通 しておく。(他は知りませんがLinuxの場合は自動でパスを通してくれました。ログインしなおすと適用されてます。)
お決まりのHello Worldを表示してみる。
#include <stdio.h>
int main()
{
printf("Hello World!!\n");
return 0;
}
↑これをエディタでhello_world.cと保存して
arm-none-linux-gnueabi-gcc -static -o hello_world hello_world.c
と打ち込んでコンパイルします。
よくわかりませんが-staticオプションを付けないとダイナミックリンクになってしまい、実行時にライブラリを要求してしまいエラーになるので必ずスタティックでビルドします。
バイナリが出来上がったらFlucardにアップロードするかFlucardにコピーします。
・Webページからアップロードする場合
アップロードしたファイルはFlucard内の/DCIM/122_TREKというフォルダに保存されます。
・Flucardにカードリーダー等からコピーする場合
/DCIM/122_TREKというフォルダにhello_worldをコピーするだけです。
実行するにはtelnetでログインして
telnet 192.168.1.1
cd /mnt/sd/DCIM/122_TREK
./hello_world
とするとHello World!!が表示されれば成功です。
コンパイルしたhello_world実行バイナリはスタティックビルドのためかHello World!!と表示するだけなのに640KB以上もあります。
stripしても500KBくらいなのでSDカードにコピーしておいて実行パスにシンボリックリンクしたほうが良いです。
/mnt/mtdにマウントされているNORフラッシュメモリは1MBで残りが7割ほど空いてますがここに保存するのは危険です。
WiFiアクセスポイントのコンフィグファイルがあるのでここを弄るのはできるだけ避けましょう。
・パスの通った場所に自作プログラムをシンボリックリンクを張る場合
ln -s /mnt/sd/DCIM/122_TREK/hello_world /usr/bin/hello_world
↑こうするとどこからでもhello_worldを実行できます。
しかし、ルートシステムは書き換え不可の領域にマウントされているようで電源を切ってしまったらせっかく張ったシンボリックリンクが消えてしまいます。
そこでFlucardをアップデートする時に実行されるautorun.shスクリプトにリンク情報を書いておき、いつ起動してもリンクが切れないようにしておくという回避策をとりました。
↓autorun.shの中身
#!/bin/sh
ln -s /mnt/sd/DCIM/122_TREK/hello_world /usr/bin/hello_world
sleep 1
これをFlucardのルートに置いておき消さないようにしておけばいつ起動してもリンク状態は保ったままを維持することができます。
・CGI経由で自作プログラムを実行してみる
FlucardのLinuxシステム内の/www/cgi-binはCGIプログラムを実行するバイナリが置かれている場所です。
ここに自分で作ったプログラムをリンクすればインタラクティブで面白いことができそうです。
今度はCGI経由でブラウザにHello World!!を表示するプログラムを作ってみます。
#inlude <stdio.h>
int main()
{
printf("content-type: text/html\n\n");
printf("<html><body>\n");
printf("Hello World!!\n");
printf("</body></html>\n");
return 0;
}
↑さっきのhello_world.cを改造してヘッダとHTMLタグを埋め込みます。
arm-none-linux-gnueabi-gcc -static -o hello_world hello_world.c
さっきと同じように122_TREKフォルダにhello_worldをコピーしておきます。
今度はこれを
ln -s /mnt/sd/DCIM/122_TREK/hello_world /www/cgi-bin/hello_world
として/www/cgi-bin/内にシンボリックリンクを張ります。
そしてブラウザからflu.card/cgi-bin/hello_worldにアクセスすると
CGI経由でブラウザからHello World!!を表示することができました。
・Un-CGIをつかってスクリプトで書いて見る
Hello World!!が表示できたのでPOSTメソッドのフォームを使ったCGIプログラムができればもっと面白いものができそうです。
しかしブラウザからPOSTメソッドで入力されたデータをC言語で取り出すのはちょっとややこしいので
(perlやphpであれば文字列操作に強力なのですが..)
ややこしい部分を一手に引き受けてくれるUn-CGIをFlucard向けにコンパイルしてみました。
以下の例は入力フォームに名前と年齢とコメントを入力してCGIスクリプトでHTMLに書き出すものです。
入力フォーム(form.html)のソース
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>コメント入力</title>
</head>
<body>
<form method=POST action="cgi-bin/uncgi/myscript">
あなたのお名前
<input type=text size=30 name=name>
<p>
年齢<br>
<select name=age multiple>
<option> 0~20歳未満
<option> 20~50歳未満
<option> 50歳以上
</select>
<p>
コメント
<br>
<textarea name=_comments rows=10 cols=60></textarea><br>
<p>
<input type=submit value="送信する">
</form>
</body>
</html>
CGIスクリプト(myscript)
#!/bin/sh
echo 'Content-type: text/html; charset=UTF-8'
echo ''
echo '<html>'
echo '<head>'
echo '<title>コメント</title>'
echo '<meta http-equiv="content-type" content="text/html; charset=UTF-8">'
echo '</head>'
echo "$WWW_name さん (年齢:$WWW_age)からのコメントです。"
echo '<br>'
echo "$WWW_comments"
echo '</body></html>'
Un-CGIのおかげでbashスクリプトでこんなに簡単にインタラクティブなWebが作れました。
Un-CGIはフォームの各パーツの名前を$WWW_hogeといった形式の変数でCGIに渡してくれます。
以上でいままでやったことをまとめてみました。
私にはセンスがないのでFlucardで何か面白いものを作ってくださる方がいればいいなと思って書きました。(他力本願w)
Flucardのコントロールピクチャも変更できるよ!(詳しくは画像をクリック)
☆2012/4/20更新☆
・rubyのsocket.soが生成されてなかったためsocketライブラリが使用できない不具合を解消しました。
deploy_20120420.zip
☆2012/4/11更新☆
osakanataroさんが
autorun.shの動作をDCIM/122_TREK/fluconfig.txtの内容を編集することで変えられるスクリプトを書いてくださいました<(_ _)>
http://blog.osakana.net/sw/flucard/flucard-autorun-20120411.zip
☆2012/4/10更新☆
・rubyが動くようになりました。
deploy_20120410.zip
ファームウェアヴァージョンが新しいもの(3.62以上?)はtelnetd機能が無効化されているようなので以下のコマンドをautorun.shに追加しました。
killall telnetd
sleep 1
mount -t devpts /dev/pts
/mnt/sd/DCIM/122_TREK/busybox telnetd -l /bin/sh &
sleep 1
しかしtelnetログインすると当方の環境ではログイン直後にコネクションが落ちてしまいました。
調べてみると、
__getpagesize: Assertion `_rtld_global_ro._dl_pagesize != 0' failed.
という謎のメッセージが・・・。
とりあえずsshログインはできるようです。
☆2012/4/9更新☆
・perlが動くようになりました。
・dropbearによるsshログインができるようになりました。(scp, sftpも使えます。)
ssh 192.168.1.1
password
でログインできます。
autorun.shのdropbear -A -N root -C admin -U 0 -G 0でsshdを起動しています。
パスワードは-Cオプションのadminを書き換えると変更できます。
また、公開鍵暗号を使ってパスワードなしで認証ログインすることもできます。
-クライアント側で公開鍵を作りFlucardに転送-
ssh-keygen -t rsa -f ~/.ssh
scp ~/.ssh/id_rsa.pub 192.168.1.1:/etc/dropbear/authorized_keys
-Flucard側の操作-
killall dropbear
dropbear -A -N root -C '-' -U 0 -G 0 -R /etc/dropbear/authorized_keys -s
-認証ログイン-
ssh 192.168.1.1 または
ssh -i ~/.ssh/id_rsa 192.168.1.1
deploy_20120409.zip
☆2012/4/6更新☆
・フル機能のbusyboxをコンパイルして載せました。
122_TREK/busyboxから適当に追加したいコマンドを引き出してください。
・実行バイナリの動的リンクに対応しました。
自作バイナリをstaticでコンパイルしなくても動くようになります。
122_TREK/lib内にあるシェアードライブラリをFlucardの/libにシンボリックリンクしています。
↓動的リンクでコンパイルしたバイナリの依存ライブラリの確認方法
arm-none-linux-gnueabi-readelf -a hoge | grep NEEDED
・PHPが使えるようになりました。
122_TREK/etc/php.ini phpコンフィグファイル
122_TREK/www/php/info.php phpのinfo()
122_TREK/www/php/exif_thumbnail.php JPEGのEXIFサムネイル表示テスト
・FTPが常時使えるようになりました。
put/getできます。
deploy_20120406.zip