FT701W の u-boot を攻めてみる

FT701Wファームウェアを覗いてみたらu-boot に fastboot という文字列があったので、どうすれば fastboot のモードに入れるのか色々試してみました。

ですが、そもそもFT701Wにはハードウェアキーが電源キーしかないので、長押しで電源入れるくらいしかバリエーションがありません。

メニューキーやホームキーはタッチセンサなので、静電センサの性格上、押したまま電源入れるというのも考えにくいです。

で、一通り試してみたものの、やっぱりというか、FastBoot モードには入れませんでした。

そこで、u-bootを解析してみることにしました。

文字列のアドレスから色々とアタリをつけながら解析していくと、以下の関数が真を返せばFastbootモードに入れるらしいことがわかりました。

80e8973c:       e59f3124        ldr     r3, [pc, #292]  ; 80e89868 <_binary_bootloader_start+0x9868>
80e89740:       e92d4017        push    {r0, r1, r2, r4, lr}
80e89744:       e5934038        ldr     r4, [r3, #56]   ; 0x38
80e89748:       e3540000        cmp     r4, #0
80e8974c:       0a00000d        beq     80e89788 <_binary_bootloader_start+0x9788>
(省略)
80e8985c:       eb002b11        bl      80e944a8 <_binary_bootloader_start+0x144a8>
80e89860:       e1a00004        mov     r0, r4
80e89864:       e8bd801e        pop     {r1, r2, r3, r4, pc}

アドレスを見てもらうとわかりますが、そこそこ長い関数になります。

ですが、SDドライバで培った逆コンパイル手法で力業で解析すると、こんな感じの関数になりました。

int func_80e8973c()
{
        if (readl(0x4a31c038) != 0) {
                if (readl(0x4a31c044) != 0x800)
                        retrun 1;
 
                printf(" Green key press == Recovery mode \n");
                while ((tmp = readl(0x4a31c018) != 0))
                        writel(tmp, 0x4a31c018);
 
                goto l97bc;
        }
 
        ret = func_80e88ea4();
 
        *(u8 *)(0x80eaf42c + 0x38) = ret;
 
        tmp = (ret - 2) & 0xff;
        if (tmp > 1)
                return 0;
 
        if (ret == 3) {
                printf("System go into recovery mode\n");
                printf("\n Case: \%reboot recovery\n");
l97bc:
                printf("\n Starting recovery img...\n");
//長いので省略
                printf("fastboot: Error: Invalid recovery img\n") ;
                return 0;
        }
        printf("\n");
        printf("System go into normal mode\n");
        printf("\n");
        return 0;
}

真を返すのは、readl(0x4a31c038) != 0 と readl(0x4a31c044) != 0x800 が成り立った時のみのようです。

アドレスが物理アドレスと仮定すると、0x4a31c000 〜 0x4a31cfff は "keyboard" らしいです。(OMAP4430 のマニュアルより)

さすがにキーの配線がどこに接続されているは回路図がないと追えません。

そもそもデバッグボードにしかないキーかもしれないですし。

ひとまず、Linux で上記アドレスを使用しているドライバがあるか調べてみます。

# cat /proc/iomem 
40100000-401f13ff : omap-aess-audio
(省略)
4a314000-4a31407f : omap_wdt
  4a314000-4a31407f : omap_wdt
4a318000-4a31807f : omap_timer.1
  4a318000-4a31807f : omap_timer
4c000000-4c0000ff : omap_emif.0
(省略)

使ってるドライバは無いようです。

つまり、少なくとも起動中に使えているタッチスイッチ等は "keyboard" のデバイスではないと言うことです。

ということは、キーの組み合わせなどの操作で fastboot mode や recovery mode には入れないということになります。デバッグボードか何かにあるキーなのでしょう。残念。 

SL-C700 用の qinstall-fix & SDHCドライバ?

ブースカさんから qinstall-fix が SL-C700 でインストールできないとのご報告がありましたので、SL-C700 の ROM 1.50JP に合わせて修正し直しました。→ ダウンロードページ

SL-C700 以外の方はインストールし直す必要はありません。

また、超危険ですが、実機もないのに SL-C700 SDHC ドライバを作ってみました。どなたか検証してみたいという方はいらっしゃいませんでしょうか。

SL-C750/760/860 の SDHC ドライバと SL-C700 のドライバはかなり似ていたため、まともに解析はせず、ただ単にパッチを当てるオフセットを合わせただけです。ですので動くどころか kernel panic する可能性も大です。

そんな状態ですので、とても恐くてリリースとは名乗れませんので、ダウンロードページではなく、このエントリで配布します。

  •  zaurus-sd-driver-update_2.0-for-C700_arm.ipk  (SL-C700用 超危険版)

—-3/5追記—-

問題なく動作しているようなので、ダウンロードページでの配布に切り替えました。ダウンロードページからどうぞ。

—————–

注意事項として、ドライバロード時に kernel panic になるような場合、最悪NANDリストアしなければ起動しなくなるかもしれません

NANDリストアしなくとも、メンテナンスカーネルから sharp_mmcsd_m.o を元に戻す作業をすれば起動はできるようになると思いますが、これらの意味がわからない方は絶対に試さないでください

これが動かないとなると実機がないので修正することは困難です。このまま動いてくれるといいんですけど。。。

qinstall-fix アップデート

qinstall-fix を更新しました。 →ダウンロードページ

 今回配下の修正が加えられています。

  • SL-C700に対応
  • SL-C3100 の ROM 1.02JP に対応

匿名ユーザさん、sugarware さんから、SL-C3100 でインストールできないとご報告いただいたので、ROM 1.02JP に合わせて修正しました。SL-C3100 をお持ちの方は必ず ROM 1.02JP にアップデートしてから qinstall-fix をインストールしてください。

また、SL-C700 の要望もありましたので、対応してみました。SL-C700 をお持ちの方はお試しください。

SL-C750 の動作報告もまだ無いので、SL-C750 の動作報告もお待ちしてます。

空き領域が2GB以上、4GB未満のSDに対して ipk がインストールできれば正しく修正されています。

2GB超えメディアへの ipk インストールの道 (3 桁機編)

1年越しのまさかまさかの続編です(^^;

いままでも発生していた問題ですが、3桁機用の SDHC ドライバによって、4桁機だけでなく、3桁機でもこの問題が無視できなくなりつつあるので、3桁機も同様の修正を入れてみました。 → ダウンロードページ

—-追記—-

説明不足でしたので追記しますと、標準のインストーラはパッケージをインストールする際に空き容量をチェックするのですが、SL-C3200を除く全機種で、空き容量が2GBを越えるメディアにインストールしようとすると「空き容量が足りません」といったメッセージが表示され、インストールできない問題がありました。当時は4GB以上のメディアが無かったためでしょう。

このパッケージは、この問題を解決するものです。

—————

また、4桁機で未対応だった SL-C3100用の修正も入っています。

これで SL-C750/760/860/1000/3000/3100 に対応したはずです。(SL-C3200は元々修正不要です)

私は SL-C760/1000/3000しか持っていませんので、これ以外については動作確認できていません。
例によってバイナリパッチで対応なので、未確認でリリースするのはちょっと危険なのですが、メディアの空き容量計算処理は全機種でほぼ同じだったのでたぶん大丈夫だとは思います。
とはいえ、リスクをご了承の上、自己責任でご使用ください。

SL-C750/760/860/3100 をお持ちの方は試してみた結果をご報告いただけるとありがたいです。

空き容量が2GB以上あるメディアに対して何らかのパッケージをインストールしてインストールが完了すれば修正されています。

2GB超えメディアへの ipk インストールの道 – その5

風邪をひいてしまって、ちょっと間が開いてしまいましたが、2GB越えメディアへのインストール対応の ipk パッケージを作成しました。→ダウンロードページ

今回は SL-C1000, 3000 のみで、SL-C3100 は対象外になってます。hekke様に調べていただいた所、SL-C3000 とはバイナリが違うためです。

原理的には同じ方法で修正できるはずなのですが、バイナリが手元にないことには解析できないのです。しかも、GPLではないのでバイナリをもらうわけにもいかず・・。
どうしようかなと思案中です。

とりあえず、SL-C1000, 3000 用を先に作成しましたので 4GB 以上の SD カード、CF をお持ちの方はお試しください。