SPI Flashを読みだしてみる(frser-duino編)
前回作ったArduinoUNOのSPIインタフェースでSPIフラッシュを読みだしてみました。
これを何に使うかと言いますと,
壊れた某W社のポータブルHDDのデータを救出するため,新しく同型の基板をC国から購入したので,
このサーボ情報の入ったFlashを書き換えるために今回はこれを読みだして見ようと思います。
# 某W社のポータブルHDDのデータ救出の話はまた別の機会に書こうと思います。。
で,HDDの基板を交換するのになんでそんな面倒な話になるかと言いますと,
HDDにはファームとメディア固有の情報を出荷時に書き込んでいるので,
メディア(円盤)と基板はその個体専用になっています。
このため,単に基板交換しても運が悪いと正常に読めません。(ヘッドの位置情報とかも入っているので)
普通はFlashチップを新しい基板に移植したりするんですが,
基板から剥がすのはそれなりにリスクがあるので,今回は書き換える方法で対応したいと思います。
そのため,まずはデータを読み出せるようにしなければなりません。。
そこで,まず対象のFlashを調べます。
まず,新しく入手したほうの基板を読みだしてみます。(最悪失敗してもデータロストにならないので。。
こっちのチップは Pm25LD020なのでコレですね。データシートによると,2MbitのSPIFlashだそうです。
で,大事なのは信号電圧です。
このチップも3.3VですがArduinoの出力は5V(TTL)なため,そのままやるとレベルが合わないので読めません。
というわけで,実際接続するときはブレッドボード経由で抵抗分圧した出力をチップに接続します。
あと,flashromのほうがこのチップに対応しているかを確認する必要があります。
ここによるとPm25LD020はリストに載ってるので多分読めると思います。
# ステータスが?なのが気になるけど。。。。
ArduinoUNOのSPIインタフェースの出力は以下のようになってます。
Pin10 ... Chip Select Pin11 ... Data In/Out Pin12 ... Data Out Pin13 ... Clock
で,チップのほうは
Pin1 ... Chip Select Pin8 ... Vcc Pin2 ... Data Out Pin7 ... Hold Pin3 ... Write Protect Pin6 ... Clk Pin4 ... GND Pin5 ... Data In/Out
となっておりました。
データシート読むと,CSはプルアップでWp/Holdはhighにしとけば読めるっぽいので,
そこで,チップの足にジュンフロン線でハンダ付けして,ブレッドボード上にレベル合わせの回路を作ります。
で,結構苦労してとりあえず回路作りました。。
#チップの足にハンダ付けしてあります。(見えないけど。。
さて読めるでしょうかね。。
読む場合はArduino UNOをPCにつなぎ
$ sudo flashrom -p serprog:dev=/dev/ttyACM0:115200 -r hogehoge.img
とかすれば読めるはずなんですが。。。。
追記:うーん。。なんか読めないっすね。。(汗
よくよく読むと,frser-duinoはチップによっては3.3Vなチップが
5V動作じゃないと読めないとか書いてありますね。。なんつうかArduino側の問題じゃないのかなと思うんですが。。
ひょっとするとそういう原因かもしれないけど,
真面目に壊してしまうとシャレにならんのでちょっと今日は諦めます。。
Arduinoのインタフェースは不安定要素が多すぎて何が原因がわからんので,
素直に秋月のFTD2232インタフェースでも買ってくることにします。。
追記:なんかしゃくなんでいろいろ調べてたんですが,一応SPI Flashからの出力はなんか出てるっぽい。
ただ,CMOSの出力なんで5Vで動いてるAVR側が受け取れるのかは疑問。。
一応2.5V超えてるんで論理的にはHなハズではあるけどね。。
レベルシフタ回路作らないとダメかな。
追記:AVRのAC特性によると0.7Vcc(Vcc=5Vだと3.5V)が論理Hレベルらしいです。
実際測ってみるとSPI Flashの出力が3.1V近辺なので厳しい感じがします。
更に追記:
結果的には読めました。
ただ,対象にしたチップの癖なのか,上で紹介されている3.3V用の抵抗分圧回路では怪しくて,
最終的にはSPI FlashのPin2の出力をそのへんに転がってた2SC9451個でレベルシフタを作って,
そいつをArduinoUNOのPin12に出力するようにしてます。
あとこの辺見ながらSPIプロトコルも勉強しつつ,
RDIDの化け方から推測して信号レベルを調整してたら最終的に読めました。
flashromのオプションも大事で,
ArduinoUNOを使ったI/Fでは以下のオプションでしか読めませんでした。
$ sudo flashrom -p serprog:dev=/dev/ttyACM0:115200,spispeed=125k -r hogehoge.img -VV
うん。素直にFT2232なボードを買ったほうが楽ですね。。
とりあえず読めたんで,
HDDのフラッシュを書き換えるという目的は達したんですが,
リカバリーという意味では入り口に立った感じです。。
先が長いなぁ。。