Vogue Magazineからのメディアプレーヤーファームウェアの保存と復元

Vogueマガジンプレイヤーを使った実験は非常に良いですが、すべてのバックアップを作成するという古き良き管理者の習慣に悩まされています。 他の人のファームウェアを試してみるとおもちゃを台無しにするのは非常に簡単ですが、元の状態に戻す方法は明確ではありません。 そのような景品を台無しにするのは残念です。

そのため、このデバイスに対する3日間の脳攻撃の後、ネイティブファームウェアを保存して戻すプロセスを詳細に整理しました。 オリジナルのusb_bootプログラムを変更し、ファームウェアをファイルに読み込む機能を追加し、いくつかの有用なデータシートをそこに投入してくれたtronix286に感謝します。

フラッシュしてプレーヤーを元の状態に戻すために必要なものはすべてここにあります
実際には、アーカイブ、ログ+ファームウェアファイル用のusb-bootの機能するカスタマイズされたバージョン。

せっかちな人のために、回復プロセスについてすぐに説明します。
-プレーヤーからバッテリーを外すか、ページを開く連絡先の下に紙を挿入します。
-プレーヤーのボタンを押してボタンを押し、USBケーブルを挿入してボタンを放します。
-コンピューターは新しいデバイスを決定し、アーカイブからそのデバイスのドライバーをインストールします。デバイスアイコンは質問の形のままですが、怖がらないでください。必要です。
-usb_boot.exeを実行します。
-そこにコマンド「run restore.sh」を入力すると、回復プロセスが開始されます。

リカバリプロセス中にエラーが発生した場合は、短いUSBケーブルを使用するか、コンピューターの背面のコネクタに接続する必要があります。 ケーブルの問題を修正して、もう一度やり直します。

実際にその後、再び動作するデバイスを取得します。 (入院患者と知らない人は読書を終了できます=))

次に、プレーヤーのファームウェアとそのコンポーネントを保存/復元するプロセスについて詳しく説明します

真剣に取り組む前に、私たちが何を扱っているかを理解する必要があります。
プレーヤーのファームウェアとユーザーコンテンツは、Samsung NANDフラッシュメモリチップK9G8G08U0Aに保存されます。
NANDフラッシュメモリチップは一般的に非常に特殊なものであり、メモリスペースの組織とセクタ/ブロックのサイズがありますが、これらは最初は普通のコンピュータ科学者には馴染みがありません。 それを理解してみましょう。

このタイプのメモリの最小アドレス可能ユニットはページ(ハードディスクのセクタ/ブロックの特定の類似物)です。 ページ自体は、一見すると、モデルに応じて528/1056/2112/4224/8448 ...バイトの奇妙なサイズになります。 しかし、これは意図的に行われます。 NANDフラッシュメモリの書き込みサイクル数は非常に限られているため、時間の経過とともに個々のビットが故障し始めます。 これらの失敗を判断し、不良ビットのあるページの情報を復元するために、そのような「エキゾチックな」サイ​​ズが選択されました。 ページは基本的に2つの部分に分かれています。 最初の部分は512/1024/2048/4096/8192 ...バイトは512バイトの倍数でユーザー情報を保存し、残りの部分は16/32/64/128/256 ...ページの最初の部分のECC(チェックサム)とその他の部分が保存されますサービス情報。 各ページを読み取ると、そのECCがその後計算され、以前に記録されたものと調整されます。一致しない場合、ページは失敗として認識され、その値は読み取られたECCから復元されます
次に、ページはブロックに結合されます。 これはハードウェアレベルで実行され、1つのコマンドでブロックのすべてのページの情報を消去するプロセスを高速化します。 次に、ブロックは物理的に1つのシリコン結晶に結合されます。 このようなクリスタルは、1、2、または4の場合があり、CS(チップセレクト)の出力を使用して選択されます。

ここで、被験者K9G8G08U0Aに戻ります。 メモリ構成は次のとおりです。1ページあたり2048 + 64バイト、1ブロックあたり128ページ、1チップあたり4096ブロック。

上記の理解を簡単にするために、このチップの公式データシートから写真を提供します。

画像

超小型回路のメモリの構成を把握した後、ファームウェアのコンポーネントとハードウェアOSの起動プロセスを検討します。

ファームウェアは、次の部分で構成されています(フラッシャーのあるフォルダー内の* .binファイルを参照)。
1)spl(セカンダリプログラムローダー)-初期ブートローダー、アーカイブ内のnand.binファイル
2)ローダー-メインローダー自体。OSカーネルをメモリにロードし、それに制御を転送します、loader.binファイル
3)ローダー構成-ブートローダー設定。NANDチップ内のOSカーネルとリソースの場所、およびすべてのロードが書き込まれるRAM内のアドレス、def_boot.binファイル
4)ブートイメージ-OSの起動時に表示されるイメージ(dadaは同じ黄色です)、img_boot.binファイル
5)MINIOSオペレーティングシステムカーネル、minios.binファイル
6)さまざまなリソースを備えたOSの内部ファイルシステム、res.binファイル。

実際に同じ順序でOSの起動があります。
まず、IPLが開始されます(ローダーは製造元によってプロセッサ自体に配線されます)。 プロセッサのレッグの状態をチェックし、ロード順とボタンが押されたかどうかを設定します。 ボタンが押された場合、USBダウンロードが期待されます。そうでない場合、メモリからロードされます。 IPLは、ブートローダーのSPLコードがNANDフラッシュメモリチップから内部SRAMメモリに配置されている最初の8キロバイト(0〜3ページ)を読み取ります。 ECCおよび他のいくつかの兆候によってそれらの正確性をチェックし、すべてが正常であれば、制御をそれに転送します。 問題が発生した場合、次の8キロバイトのNANDフラッシュメモリ(4〜7ページ)で同様のアクションが実行されます。
開始後、SPLはプロセッサのレジスタと周辺機器を初期化し、SDRAMコントローラーを設定し、OSダイレクトローダーコード(loader.bin)をRAMの61ページと62ページの先頭に示されたアドレスにロードします。
次に、メインローダーはオペレーティングシステムのカーネルをRAMにロードし、制御をカーネルに転送します。
質問が発生します。なぜ多くのローダーがフェンスを使用するのですか? それについては何もすることはありません、鉄の限界です。 IPLは8キロバイトを超えるコードをロードできないため、2階建てのブートローダーを作成する必要があります。

理論的基礎から始めましょう
それがどのように機能する見てみましょう、このひどい密造酒! ...うーん、ユーティリティがUSBとそのファームウェアを介してプレーヤーをダウンロードするように設計されているという意味で。
-fw.binおよびusb_boot.binファイルは、他の方法ではなく、SPLおよびローダーによって特別に書き込まれます。
-USB_Boot.exe -programs-オリジナルの管理ユーティリティの仕様。 usb_boot.binローダー、Test_jz4740_usb.exe-tronix286バージョンを修正し、NANDフラッシュメモリの内容をファイルに読み取る機能を追加。
-他のすべてのファイル* .bin-プレーヤーファームウェアコンポーネント。
-ファイルUsb_Boot_Driver.infおよびUsb_Boot_Driver.sys-usb読み込みモードのプレーヤーのドライバー。
-files * .cfg-さまざまなメモリチップ(NANDとSDRAMの両方)とその動作モードのブートローダー構成ファイル。
-file restore.sh-ファームウェアをプレーヤーにアップロードするためのスクリプト。

Test_jz4740_usb.exeユーティリティは、プレーヤーのメモリからファームウェアを読み取るための2つのコマンド(ndumpおよびnreadtofile)が存在する点でUSB_Boot.exeと異なります。
必要なコマンド:
-boot-USBBoot.cfgファイルのデフォルト設定を使用して、usbブートローダーをプレーヤーにロードします
-nerase-NANDフラッシュメモリチップからの情報のブロック消去。
-nprog-ファイルからの情報をNANDフラッシュメモリチップのページに書き込みます。
-ndump-メモリの内容をNANDフラッシュからファイルに読み取ります。
-fconfig-構成を切り替えます。
各コマンドのパラメーターは、パラメーターなしで実行することで見つけることができます。

元のファームウェアを保存する方法を見つけます
ブレーンストーミングセッション中に、一群の槍が壊れ、数十本の剣が鈍くなったという1つの大きなニュアンスについて説明します。 USBBoot_nand.cfg構成を使用してSPLをダウンロードし、USBBoot_norm.cfg構成を使用してその他すべてをダウンロードします。 2つの構成の使用は、spl-bootloaderおよび他のすべての記録がサービスエリアの異なるフォーマット(usb-bootの観点ではOOBと呼ばれる)とページのチェックサムで発生するためです。 SPLローダーの場合、使用される形式はプロセッサー内に配線され、その他のすべての場合、ブートローダーとOSのアセンブリおよびコンパイル中にプログラマーが選択した形式です。

ネイティブファームウェアの保存を開始する前に、フォルダーからファームウェアを含むファイルを削除することを忘れないでください。 ファームウェアをマージするには、次の手順を実行します。
-プレーヤーからバッテリーを外すか、ページを開く連絡先の下に紙を挿入します。
-プレーヤーのボタンを押してボタンを押し、USBケーブルを挿入してボタンを放します。
-コンピューターが新しいデバイスを決定し、アーカイブからドライバーをインストールします。
-Test_jz4740_usb.exeを実行します。
-コマンド「 boot 0 」を入力して、実行結果を確認します。 次のようなものが表示されます。

Checking state of No.0 device: Unboot
Now booting No.0 device: START_ADDR 2000000 81c00000

Download stage one program and execute at 0x80002000: Pass
Download stage two program and execute at 0x81c00000: Pass
Boot success!
Now configure No.0 device:
Now checking whether all configure args valid:
Current device information: CPU is Jz4750
Crystal work at 12MHz, the CCLK up to 336MHz and PMH_CLK up to 112MHz
Total SDRAM size is 32 MB, work in 4 bank and 16 bit mode
Nand page size 2048, ECC offset 3, bad block ID 0, use 1 plane mode
Configure success!


-「 fconfig USBBoot_nand.cfg 0 」コマンドを使用してSPLを読み取るための「正しい」構成に切り替えます。すべてが正常である場合、「 Configure success! 」という碑文があるはずです。
-コマンド " ndump 0 64 0 0 nand.bin "を使用して、nand.binファイル内のSPLとその構成ページを読み取ります。
-「正しい」構成に切り替えて、コマンド「 fconfig USBBoot_norm.cfg 0 」で残りのファームウェアを読み取ります。すべてが正常である場合、「 Configure success! 」という碑文があるはずです。
-「 ndump 128 66 0 0 loader.bin 」コマンドを使用してローダーをloader.binファイルに読み込みます
-「 ndump 256 1 0 0 def_boot.bin 」コマンドでdef_boot.binファイルの設定を読み取ります
-コマンド「 ndump 512 3061 0 0 img_boot.bin 」を使用して、ブートイメージをファイルimg_boot.binに読み込みます。
-コマンド「 ndump 8192 8192 0 0 minios.bin 」でOSカーネルをminios.binファイルに読み込みます
-「 ndump 32768 32768 0 0 res.bin 」コマンドを使用して、res.binファイル内のカーネルリソースで内部FSを読み取ります。

必要に応じて、これらすべてのコマンドを順番にファイルに書き込んで、充填プロセスと同じ方法でrunコマンドで開始できます。 UPD。 これを実行してsave.shファイルに保存しました。
結果のファイルは、ネイティブファームウェアのバックアップです。 これでプレーヤーのファームウェアで何でもできるようになり、使い物にならない鉄を手に入れることを恐れなくなりました。

記録用のすべてのアドレスは、起動時および実験的にプレーヤーの内部uartコンソールに出力される情報から取得されました。

その結果、以下が得られます。
1)SPLは0〜3ページです。
2)61、62、63ページには、その後の読み込みにSPLが必要です。
3)メインブートローダーは128ページで開始します。
4)その構成は256ページです。
5)ブートイメージは512ページから始まります。
6)MINIOSコアは8192ページから始まります。
7)内部FSは32768ページを開始します。
8)コンテンツを含むユーザーファイルシステムが続きます。

ファームウェアをプレーヤーにアップロードするプロセスは、コメントする必要はないと思います。保存に似ています。 メモ帳(または他のテキストエディター)でファイルrestore.shを開くと、すべてのプロセスコマンドを自分の目で見ることができます。 必要に応じて、プレーヤーを完全にフラッシュすることはできませんが、個々のパーツのみを変更できます。

ファームウェアのバックアップがあり、それをどのように入力するかがわかったら、他のファームウェアをプレーヤーに流してみてください。 現時点では、Linuxを起動するためにu-bootローダーをコンパイルして作成しようとしています。

UPD !!! Test_jz4740_usb.exeユーティリティで迷惑なエラーが見つかりました! 投稿の冒頭にあるリンクまたはここにあるユーティリティ自体を使用して、ユーティリティの最新バージョンでアーカイブを再度ダウンロードしてください
グリッチの拡散を避けるために、古いアーカイブはすべて削除されました。

Source: https://habr.com/ru/post/J109265/


All Articles