U-bootで自動識別起動Flashの原理を実現する(S 3 C 24 x 0に対して)
5963 ワード
転載:http://blog.chinaunix.net/uid-20543672-id-94363.html
U-bootで自動識別起動Flashの原理を実現する(S 3 C 24 x 0に対して)
あるネット友達からのアドバイスがありますが、64 MBのflashと128 MBのflashを同時にサポートしてもいいですか?考えてみたらいいと思います.もう一度考えてみてください.Nor bootは自動識別できますか?それともNand bootですか?ですから、U-book-2009.08を移植する時、この二つの機能を実現することにしました.
この二つの機能を実現するには、start.Sファイルとnand_だけを修正する必要があります.read.clファイルでもいいです.重要なのは検出手段です.ここでは私がu-book-2009.08で実現したS 3 C 2440がflashを識別する原理を紹介します.
一、識別nand boot or Nor bootを起動する(この方法は廃止されました.より良い方法は以下の通りです.)
nand bootとnor bootを識別する方法を見つけました.実は自分が犯したミスの中で見つけました.
nand bootを使っている時に、Nor flashを操作するコマンドを使いたいですが、フリーズすると、最初はflashを操作するプログラムが間違っていると思いました.でも、長い間探しましたが、エラーが見つからず、最後にやっと発見しました.これはS 3 C 2440チップのメカニズムの問題です.ハードウェアでNand bootを設定した時、Nor bootとしてのパーティションは、該当するアドレスにマッピングされていません.つまり、mini 2440の起動選択スイッチをNand bootにセットしたとき、Nor flashハードウェアでは使用できません.しかし、Nand bookが起動したら、Nor bootにスイッチを入れてください.またNor flashを操作できます.
mini 2440の起動スイッチをnand bootに打った時、nor flashを読んで、得たのは全部0です.これを利用して、私は起動時にnor flashの中で4 K(nand boot原理と関係があります)後のデータを読みます.全部0なら、Nand bootであることを証明します.さもなければNor bootです.4 Kの後、多少はubootと関係がありますが、後ろの方が多すぎて、連続的に0が出るかもしれません.だから、16進ビューアでubootのbinファイルを見ました.8 Kぐらいで16字の0が連続することはあり得ないと確定しました. ですから、私は起動時に住所が0 x 2000のところのデータを読みます.もし非ゼロが検出されたら、Nor bootのコピープログラムを起動します.そうでなければ、Nand bootプログラムにジャンプします.
一、識別nand boot or Nor bootを起動する(新方案)
以前の識別案を使った後、保険に加入していないと感じるネットユーザーがいます.実は私もずっとこの案に不満を持っています.しかし、より良い解決策が見つからなかった.今日も友達が私に言いました.
運を試しているような感じがします.悪いのではないです」と、これをよりよく解決していくことにしました.私はまた2440のデータマニュアルの「第五章メモリコントローラ」を見て、最後にNor bootとNand bootの起動したメモリマップに道を見つけました.
まず、「第5章メモリコントローラ」の「Figure 5-1.S 3 C 2440 Aメモリafter Reset」を見てください.理論的には、0 x 40000以降のメモリはNor bootの時だけ存在します.nand bootで彼は0 x 0000にマッピングされました.
0 x 4000000000以降はメモリが存在しません.
.もし私たちが起動する時に、特定のデータを0 x 400万~0 x 400100の間に書き込んだら、データマニュアルによると、回読の結果と書き込みの一致があればnor bootとなります.そうでなければ、nand bootです.
この方法は理論的には通じていますが、実は、その図は間違っています.
私の実験を通して、本当です.
マップは以下の通りです
上の図から分かるように、
Nor bootでもnand bootでも、この4 Kの内部SRAMはマッピングされました.
0 x 4000000000ではなく、
nand bootの時、このメモリは同時にまだ使われています.
マッピングしました
0 x 0000
最初に提案した方法はいけません.そして、nand bootの時、
書き込み
0 x 4000000000~0 x 400100はまた自分のプログラムを破壊します.でも上の図を通して解決方法を思い出しました.起動時にプログラムを使います.
将
0 x 4000000000~0 x 4001000の中のいくつかの位置はクリアして、もし回読するならば
0 x 0000~0 x 000000の該当位置
後はゼロで、Nand bootと説明していますが、元のデータであれば(必ずゼロでない場所を選んでください)Nor bootです.判断が終わったら、nand bootであれば、変更されたデータを復元して、コピー段階に入ります. 検出された位置が合理的であれば、この方法は実行可能である.今の鍵はどの位置のデータを選ぶのが一番いいですか?ソースを確認した後、start.Sファイルの先頭に、グローバル中断ベクトルを選択しました.
0 x 000003 c
(
0 x 400 0003 c
)0
(3)彼はプログラムを検査する前に、プログラムの下の動作に影響しません.(4)彼はプログラムに属していません.彼はプログラム中の魔数です.魔数で測定するのも合理的です.
.
だから私の最後の測定ステップは:
起動時には、
0 x 40000 3 c位置
最初の4バイトは0をクリアしてから0 x 000003 c位置を読みます.
最初の4バイト
.回読の結果がゼロなら、それは
nand boot
そうでなければノーブックです.
U-bootで自動識別起動Flashの原理を実現する(S 3 C 24 x 0に対して)
あるネット友達からのアドバイスがありますが、64 MBのflashと128 MBのflashを同時にサポートしてもいいですか?考えてみたらいいと思います.もう一度考えてみてください.Nor bootは自動識別できますか?それともNand bootですか?ですから、U-book-2009.08を移植する時、この二つの機能を実現することにしました.
この二つの機能を実現するには、start.Sファイルとnand_だけを修正する必要があります.read.clファイルでもいいです.重要なのは検出手段です.ここでは私がu-book-2009.08で実現したS 3 C 2440がflashを識別する原理を紹介します.
一、識別nand boot or Nor bootを起動する(この方法は廃止されました.より良い方法は以下の通りです.)
nand bootとnor bootを識別する方法を見つけました.実は自分が犯したミスの中で見つけました.
nand bootを使っている時に、Nor flashを操作するコマンドを使いたいですが、フリーズすると、最初はflashを操作するプログラムが間違っていると思いました.でも、長い間探しましたが、エラーが見つからず、最後にやっと発見しました.これはS 3 C 2440チップのメカニズムの問題です.ハードウェアでNand bootを設定した時、Nor bootとしてのパーティションは、該当するアドレスにマッピングされていません.つまり、mini 2440の起動選択スイッチをNand bootにセットしたとき、Nor flashハードウェアでは使用できません.しかし、Nand bookが起動したら、Nor bootにスイッチを入れてください.またNor flashを操作できます.
mini 2440の起動スイッチをnand bootに打った時、nor flashを読んで、得たのは全部0です.これを利用して、私は起動時にnor flashの中で4 K(nand boot原理と関係があります)後のデータを読みます.全部0なら、Nand bootであることを証明します.さもなければNor bootです.4 Kの後、多少はubootと関係がありますが、後ろの方が多すぎて、連続的に0が出るかもしれません.だから、16進ビューアでubootのbinファイルを見ました.8 Kぐらいで16字の0が連続することはあり得ないと確定しました. ですから、私は起動時に住所が0 x 2000のところのデータを読みます.もし非ゼロが検出されたら、Nor bootのコピープログラムを起動します.そうでなければ、Nand bootプログラムにジャンプします.
一、識別nand boot or Nor bootを起動する(新方案)
以前の識別案を使った後、保険に加入していないと感じるネットユーザーがいます.実は私もずっとこの案に不満を持っています.しかし、より良い解決策が見つからなかった.今日も友達が私に言いました.
運を試しているような感じがします.悪いのではないです」と、これをよりよく解決していくことにしました.私はまた2440のデータマニュアルの「第五章メモリコントローラ」を見て、最後にNor bootとNand bootの起動したメモリマップに道を見つけました.
まず、「第5章メモリコントローラ」の「Figure 5-1.S 3 C 2440 Aメモリafter Reset」を見てください.理論的には、0 x 40000以降のメモリはNor bootの時だけ存在します.nand bootで彼は0 x 0000にマッピングされました.
0 x 4000000000以降はメモリが存在しません.
.もし私たちが起動する時に、特定のデータを0 x 400万~0 x 400100の間に書き込んだら、データマニュアルによると、回読の結果と書き込みの一致があればnor bootとなります.そうでなければ、nand bootです.
この方法は理論的には通じていますが、実は、その図は間違っています.
私の実験を通して、本当です.
マップは以下の通りです
上の図から分かるように、
Nor bootでもnand bootでも、この4 Kの内部SRAMはマッピングされました.
0 x 4000000000ではなく、
nand bootの時、このメモリは同時にまだ使われています.
マッピングしました
0 x 0000
最初に提案した方法はいけません.そして、nand bootの時、
書き込み
0 x 4000000000~0 x 400100はまた自分のプログラムを破壊します.でも上の図を通して解決方法を思い出しました.起動時にプログラムを使います.
将
0 x 4000000000~0 x 4001000の中のいくつかの位置はクリアして、もし回読するならば
0 x 0000~0 x 000000の該当位置
後はゼロで、Nand bootと説明していますが、元のデータであれば(必ずゼロでない場所を選んでください)Nor bootです.判断が終わったら、nand bootであれば、変更されたデータを復元して、コピー段階に入ります. 検出された位置が合理的であれば、この方法は実行可能である.今の鍵はどの位置のデータを選ぶのが一番いいですか?ソースを確認した後、start.Sファイルの先頭に、グローバル中断ベクトルを選択しました.
.balignl 16,0xdeadbeef
このデータを検出位置として選んだ理由は、(1)彼はゼロではなく、データが確定したからです.0xdeadbeef;
(2)彼の位置は固定されています.0 x 000003 c
(
0 x 400 0003 c
)0
(3)彼はプログラムを検査する前に、プログラムの下の動作に影響しません.(4)彼はプログラムに属していません.彼はプログラム中の魔数です.魔数で測定するのも合理的です.
.
だから私の最後の測定ステップは:
起動時には、
0 x 40000 3 c位置
最初の4バイトは0をクリアしてから0 x 000003 c位置を読みます.
最初の4バイト
.回読の結果がゼロなら、それは
nand boot
そうでなければノーブックです.
0xdeadbeef
いいえ、未知のエラーがあるということです.
)。
: Nand boot, 。
: nand boot , SRAM 4K , Nand SDRAM 4K , 。
, 24x0 。
、 nand flash
nand flash 。
Nand boot ,
NFCONF 0~3bit
, Nand flash , 。
u-boot-2009.08 for mini2440 patch release S3C2440 。
,
buserror , ID Nand Flash, 。
, , !
・