honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

DDR miniのハッキングがいよいよ本格的に始まった

honeylab.hatenablog.jp

分解して下調べをしていたDDR mini

既にファームウェアアップデート用のUSBを探しそうな画面が発見されていますが、
これは適当にUSBを挿せばいいものではなく、必要な条件のもとパッケージングしたものに対して発動するものだと思われます。

 

 

その条件を調べることや、他にバックドアがないかどうかを調べるため、内部のソフトウェアを調べていきます。

で、どうやって?

まず、このAllwinnerのCPUは、FELモードというUSB経由であれやこれやするためのモードが備わっていますが、ここで行うことができるのはプログラムの転送ぐらいです。
まずFELモード上でu-bootなどのブートローダを転送して実行し、そのあとファームウェアを転送して書き込んだりすることができます。
過去にさんざん弄ったファミコンミニの系列はこの方法でカーネル書き換えが進められてきました。

www.ns-koubou.com


しかし、今回採用されたA527というCPU、かなり新しいもので従来使われていたようなu-bootが対応できていないようで、まともにコンパイルできるツリーが見つかりませんでした。そのため、何か他の方法を使わなければなりません。

いろいろ探していたとこ、A527やその互換のT527というCPUを搭載したAvaotaSBCというオープンソース設計の組み込みボードがあるのを見つけました。

github.com

また、それに対応したベアメタルの開発環境、そしてブートローダLinuxの入ったOSイメージがあります。これが使えそうだと踏んで調査を行いました。

github.com

github.com

Allwinner系のCPUの多くは、起動シーケンスとしてeMMC(8bit onboard SDC2)のほかに、SDカード(4bit SDC0)やSPI Flash、NAND等いろいろなストレージから起動できます。

A527は都合がいいことに、基板上のeMMCより先に、今回基板上からオミットされたSDカードスロットから起動することがデータシートに記載されていました。

 

そのため、まずSDカードスロットを復活させました。
しかし、SDカードソケットを付けてもそのままでは使えません。
きちんと使えないように、各信号線が基板上で分断されていますので、そこをすべてジャンパし、またCLK以外の線は10Kオームでプルアップする必要があります。

 

この配線を行い、SDスロットの信号を見ながら電源を入れるとCLK信号が観測され、SDカードを探しに来ていることが確認できました。

 

次はSDカードの中身の準備です。

先ほど見つけたベアメタルの環境をコンパイルし、テストコードをいくつか書いてみます。

一応動いているようですが、動いた結果が観測できません。
なぜなら、標準入出力であるシリアルポートが発見できていないからです。

今までのミニコンソールは、それっぽいところを当たりながら電源を入れればすぐにブートローダLinuxのメッセージが表示されていました。が、今回は徹底的にその動作が潰されていて、全く信号が確認できません。

とはいえ、シリアルの配線は絶対に残っているはずです。

 

データシートとピンアサイン、そして基板上の配線を穴が開くほど見つめながらプログラムを調整したところ、見事にシリアルポートをの出力を確保できました。

 

プログラムが動いたらこっちのもの。eMMCの中身を読み込み、SDカードに保存して解析すればいいのです。

というわけで、先ほどの環境からSDカードを使っているサンプルを改造し、実装してみましたが。。。。。動かん。っていうか、動きが変。

 

どうやら、SDカードとeMMC、どちらかしか使わないと仮定してあり、各パラメータを保存するメモリを一つ分しか確保しないコードになっていました。

github.com

これを修正し、カード二枚が同時に使えるようにしたところ、無事、eMMCとSDカードどちらからも読み込めるようになったんですが・・・・書き込めない!!!!

さんざん悩みつつ調べた結果、書き込み部分が実装されていませんでしたw

というのは一寸違ってて、実はSDカードの伝送、高速化のために普通はDMAによるメモリ転送を使い、まとめて転送するようになっています。

今回のベアメタル環境、DDRMiniの環境と完全に同じではないため、基板上のDDRメモリの初期化が行えず、大きなメモリ空間やDMAが使えない状態でした。
そのため、DMAではなくFIFOに1バイトずつ書き込む”CPU転送”モードを使う必要があったのです。サンプルソースのドライバでは、DMAの部分は読み書きどちらも実装されていましたが、CPU転送、レスポンスの読み込みにしか使わないので書き込む部分は省略されてたんですね。気づくのにしばらくかかりました。


Linuxのドライバのソースなどを参照し、この部分を実装すると、見事eMMCの内容をSDカードに書きこむことができるようになりました。

 

書き込めたらこっちのもの。中身を調べていきます。つづく。