ザウルスのサービスメニューとかフラッシュメモリ内容とか

今日はSL-C700SL-C760に加えてSL-C3100も引っ張り出してきて色々いじくる。
サービスメニューを起動するD+Mとかのキー操作って、ACアダプタと充電池はずしてACアダプタ接続する時に押さなくても、再起動時に押しておけば効くんやね(ただ、SL-C700だと画面がズレて表示されることがある模様)。
あとACアダプタと充電池はずして充電池取り付ける時や、リセットボタンもしくは電池ぶたを解除からロックに戻す際(SL-C3000系はその後にOn/Offで電源ON操作も必要)に押しておいても動作する。
あと内蔵フラッシュメモリが飛んでサービスメニューが起動しない場合でも、P2ROMからサービスメニューを起動するFn+D+Mってのがあるらしい。これで安心してNAND BACKUPでDBK取っておける。
これらのキーの組み合わせは、SL-C700系はP2ROM - ぴろのぺーじに、SL-C3000系はC3000のP2ROMとDIAG_MENUを調べる - ぴろのぺーじに載ってる。
ついでにD+Bで起動するメンテナンスカーネルの使い方メモ。rootまたはzaurusでログイン。普段起動するシステムで使われているルートファイルシステムは/dev/mtd2(/dev/mtdblock2)、/home以下は/dev/mtd3(/dev/mtdblock3)で「mount -t jffs2 /dev/mtdblock2 /mnt/mtd2」のようにすればマウントできる。ちなみにマウントにはかなり時間がかかる。/mnt/mtd2とかはmkdirで適宜作成する。rebootもしくはshutdown -r nowで再起動が出来る。shutdown -h nowで電源OFFも出来るが、一旦リセット(SL-C760とかだとACアダプタ&電池抜き)を行わないとPower(On/Off)ボタンでの電源ONは行えない。
あとアップデート時によく見るupdater.shはバイナリファイルではなく、メンテナンスカーネル上から「/sbin/decsh /mnt/card/updater.sh」で元のテキストファイル(シェルスクリプト)に戻すことが出来る(元のファイルは上書きされるので注意)。
updater.shを見てみると/sbin/writerominfo、/sbin/bcut、/sbin/nandlogical、/sbin/verchg、/sbin/eraseall、/sbin/nandcpなどの内蔵フラッシュメモリに関すると思われるコマンドが色々とある模様。
特にnandlogicalコマンドは内蔵フラッシュメモリの任意のアドレスから任意の容量を読み書きできるので、バックアップや一時的なカーネル書き換え等にも便利に使える。例えば「/sbin/nandlogical /dev/mtd1 READ 0x00000000 0x00040000 mainte.bin」のようにデバイス名、読み書き指定、開始アドレス、容量、ファイル名を指定するだけ。ただ、いくつか読み出しできない領域があるようで、それを避けて全部読み出そうとすると以下のようなカンジになる。/dev/mtd2、/dev/mtd3はddコマンドで以下のようにすれば全部読み出せる模様。

#!/bin/sh
nandlogical /dev/mtd1 READ 0x00000000 0x00050000 mainte.bin
nandlogical /dev/mtd1 READ 0x00054000 0x00004000 version.bin
nandlogical /dev/mtd1 READ 0x00060000 0x0000c000 paraminf.bin
nandlogical /dev/mtd1 READ 0x00070000 0x00004000 mversion.bin
nandlogical /dev/mtd1 READ 0x0007C000 0x00060000 diag.bin
nandlogical /dev/mtd1 READ 0x000E0000 0x0013C000 kernel2.bin
nandlogical /dev/mtd1 READ 0x00220000 0x0013C000 kernel1.bin
nandlogical /dev/mtd1 READ 0x00360000 0x00340000 roflsys.bin
dd if=/dev/mtd2 of=root.bin
dd if=/dev/mtd3 of=home.bin

ファイル名はklaus氏(参考:Linuxザウルス開発メモ/修復方法 - Walrus, Visit.)のものに従っている。59414d41氏によると本来のmainte.binは256KBで、不要となる末尾64KBのうち0x48000〜0x4BFFFの16KBに本来のversion.binが含まれている模様(参考:Sharp PDA SL シリーズのページ)。
こうした読み出したファイル群をメモリカードに以下の内容のupdater.proってテキストファイル(ファイル末尾は改行、改行コードはCR+LF)と共に入れておけば、Q+TまたはC+Dで内蔵フラッシュメモリに書き込むことが出来るっぽい。

MAINTE  ,BIN,0x00000000,320
VERSION ,BIN,0x00054000,16
PARAMINF,BIN,0x00060000,48
MVERSION,BIN,0x00070000,16
DIAG    ,BIN,0x0007C000,384
KERNEL2 ,BIN,0x000E0000,1264
KERNEL1 ,BIN,0x00220000,1264
ROFLSYS ,BIN,0x00360000,3328
ROOT    ,BIN,0x00700000,25600
HOME    ,BIN,0x02000000,32768

updater.proはファイル名主部、ファイル名拡張子、書き込み開始アドレス、書き込み容量(KB)を「,」で区切って記述するようになっていて、行頭に「;」を入れるとコメントになる。
ちなみにメンテナンスカーネルが使っているルートファイルシステムのroflsys.binは以下の手順でループバックマウントできる(参考:SD上でQtopia - ぴろのぺーじ

mkdir /mnt/initrd
zcat roflsys.bin > initrd
mount -t ext2 -o loop initrd /mnt/initrd