Jan RinzeのTrendtacなページ
21/07/08 更新:
400 Mhzのラップトップを買ったら...私が手にしたのは335 MHz MIPSのLinuxおもちゃ機だったのです。
"学ぶこと、遊ぶこと、創造すること、そして働くことは全て同じ: つまりは脳を楽しませるということだ :-)"
03/08/08 更新:
Trendtacを壊してしまいましたが何とか復旧しました。そしてその過程でuBootについてとFlashイメージの復旧について分かりました。
"壊れていないなら弄らない方がいい。だがどうしても弄りたいのなら、まずは壊すことだ ;-)"
イントロダクション
クロスコンパイリング
ネイティブコンパイラ
JFFS2イメージのマウント
Flash内のカーネルを復旧
イントロダクション:
私は最近IntertoysでTrendtac EPC 700 (MIPS linux UMPC)を229ユーロで入手しました。購入時はこれが何なのか知らなかったので驚きました。これは決して本当のラップトップではないし、馬力は控えめに言っても弱いです。
しかし、だからといってこのラップトップがつまらないということではありません。それどころかこれはれっきとしたLinuxが動くエレクトロニクス機なのです。そして少なくとも私に楽しいハッキングの時間を与えてくれるはずです。
www.trendtac.nlにて小技やリカバリ(壊れたとき用)の手順などの有用な情報が見つかります。また、このサイトではコンソールアクセスの方法についても記載されています。このプラットフォーム向けのLinuxに関する更なる情報はIngenic Semiconductor Co, Ltd Webページやlinux-mipsWebサイトを参照してください。
以下はコンソールの写真です。
次のステップ...適切なクロスコンパイラ環境:
このラップトップはJZ4730 SOC MIPS プロセッサを使用します。このプロセッサは現在デスクトップPCなどで使用されているx86シリーズのプロセッサとは違います。ソフトウェアをコンパイルしたり新しいカーネルをビルドするには、クロスコンパイラと呼ばれるものが必要です。このプロセッサに対応したクロスコンパイラを探しているならこのリンクを参照してください。ftp://ftp.ingenic.cn/3sw/01linux/00toolchain/
適切なtoolchainを入れることで2.4.20カーネルと2.6.24カーネルの両方をビルドすることができるようになります。カーネル用のソースや他のものも同じFTPサイトに置いてあります。
クロスコンパイラを解凍したら有名な'Hello World'のテストを始めてみます。
/* Hello World application */
#include <stdio.h>
#include <stdlib.h>
int main( int argc , char ** argv)
{
printf("Hello World\n");
return 0;
}
これをデスクトップPCのクロスコンパイラでコンパイルするには:
$ mipsel-linux-gcc -o hello ./hello.c
これでMIPS上で動くHelloという実行可能ファイルが完成しました。SDカード経由でラップトップに転送してテストしてみてください。
~ $ cd /SD/SD_1/
/SD/SD_1
$ ./hello
Hello World
/SD/SD_1
$
これで今コンパイルしたプログラムがMIPSラップトップで動作することが分かります。
ネイティブコンパイリング
'Etch'ディストリビューション用のDebianレポジトリ内にはmipselプラットフォーム用のバイナリがたくさんあります。このリポジトリはパッケージを探すことができるので、gccと関連したソフトウェアを検索しました。その結果以下のファイルが見つかりました:
binutils_2.17-3_mipsel.deb
gcc-4.1-base_4.1.1-21_mipsel.deb
cpp-4.1_4.1.1-21_mipsel.deb
libc6-dev_2.3.6.ds1-13etch5_mipsel.deb
gcc-4.1_4.1.1-21_mipsel.deb
Debianパッケージは中にcontrol.tar.gzと data.tar.gz を含むアーカイブです。
control.tar.gzは通常インストール後の動作やアンインストール用で、 data.tar.gzにはインストルートディレクトリにコピーされるファイルが格納されています。
なので、これらをEPC 700にインストールしたいなら各.debファイルからdata.tar.gz を探し出してEPC 700上に展開します。
これを簡単に行うためのシンプルスクリプトは:
(注意:これは EPC 700上でのみ利用可能です。また、上に挙げた.debファイルのみテスト済みですが、他の.debファイルは問題があるかもしれません。)
全ての.debファイルをSDカードへコピーし、以下のコマンドを入力します:
cd /SD/SD_1/
for package in $( ls *.deb ); do ar -x $package data.tar.gz ; tar xzf ./data.tar.gz -C / ; done
rm ./data.tar.gz
ln -s /usr/bin/gcc-4.1 /usr/bin/gcc
これで必要なファイルがEPC 700の適切な場所にコピーされます。 ln 宣言で新しいgcc-4.1へのソフトリンクが作成され、 gcc と入力されるだけでgcc-4.1を呼び出すことができるようになります。
しかし残念ながらこれだけではまだ足りません。コンパイラを使用しようとしても新しくインストールされたライブラリが見つかりません。EPC 700のディストリビューションには適切な ld.so.conf がないので作成する必要があるのです。(この例は上手く行きますが、これは適切な方法ではないと考える人もいるでしょう)
echo "# default libc configuration" >> etc/ld.so.conf
echo "/lib" >> /etc/ld.so.conf
echo "/usr/lib" >> /etc/ld.so.conf
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
これでライブラリが検出され、コンパイラのテストを続行することができます。
ここで先ほどの hello.c というファイルを使用し、SDカードへコピーしました。
/SD/SD_1 $ cat ./hello.c
/* Hello World application */
#include <stdio.h>
#include <stdlib.h>
int main( int argc , char ** argv)
{
printf("Hello World\n");
return 0;
}
/SD/SD_1 $ gcc -o test ./hello.c
/SD/SD_1 $ ./test
Hello World
/SD/SD_1 $
結果は良好です。これでEPC 700用のネイティブコンパイラが用意できました。しかしまだカーネルヘッダファイルがありませんし、インストールした libc 以外の開発ライブラリもありません。また、浮動小数点や最適化の問題もあります。FPを使う場合、 -O2 と -O3 は使ってはいけません。
どうやら現在Debian Sidレポジトリ内でgcc 4.3用の multilib に対応しているようですが、gcc 4.3 がEPC 700で動くかどうかは分かりません。
ルートファイルシステムのハッキング:
www.trendtac.nlでリカバリーイメージを入手することもできます。
解凍すると minifs.imgと Recovery_EPC700.img の2つのファイルが出力されます。
minifs.img はリカバリ処理で内蔵Flashパーティションに直接コピーされるJFFS2イメージです。
Recovery_EPC700.img は tar bzip で圧縮されたファイルでルートファイルシステムを含んでいます。
この操作をする前に、必ず /dev/mtd0が存在しないことを確認してください!存在した場合、システムファームウェアを上書きしてしまう可能性があります!
デスクトップにJFFS2イメージをマウントすることで以下のメソッドを完了することができます。
# ls /mnt/mips_image
bin dir_1 etc lib lost+found man opt root share tmp var
dev dir_2 info linuxrc make_sys mnt proc sbin sys usr wkw_sh
#
次に何をするかは決まっていませんが、どう進めていくかは分かるでしょう。カーネルのアップデートについては、現時点ではショートカットはありません。また、現在SDカードからブートする'簡単な'方法を模索中です。
Flash内のカーネルを復旧:
Flashイメージを弄った結果、動かなくなったラップトップが手元に残りました。どうやら mtdblock1 をマウントしようとするのはいい考えではないようです。
JFFS2は即座にパーティションをフォーマットしなおし、結果としてFlashイメージには'lost+found'フォルダのみでした。
幸運なことに mtdblock1 のコピーが残っていて、また大量の半田付け(RS232コンバーター)の結果シリアル接続でPC上から uBoot プロンプトが可能でした。
また、 uBootブートローダーを含む mtdblock0 のコピーも取っていたので、バイナリを覗くことでuimageへのおもしろい参照を見つけることができました。uimageの読み込みの説明は親切にもプレーンテキストです。
なので、SDカードからuBootでフラッシュするためにカーネルを再読み込みするには:
> mmcinit
> fatload mmc 0 0x80600000 uimage
> nand erase 0x100000 0x180000
> nand write 0x80600000 0x100000 0x180000
> reset
これでカーネルは mtdblock0 に復旧され、ラップトップは再び正常にブートするようになりました。
Original page: playing with the EPC 700