在U-boot下實現自動識別啓動Flash的原理(針對S3C24x0)

原文地址:http://blog.chinaunix.net/uid-20543672-id-94363.html

有網友給我一個建議,是否可以同時支持64MB的flash和128MB的flash,我想了一下覺得可行,再想一下覺得還可以實現自動識別Nor boot 還是 Nand boot。 所以在移植u-boot-2009.08的時候,我決定實現這兩個功能。
其實實現這兩個功能是只需要修改start.S文件和nand_read.c文件即可,關鍵在於檢測手段,以下分別介紹我在u-boot-2009.08中實現的S3C2440啓動識別flash的原理。


一、啓動識別nand boot or Nor boot(此辦法已廢止,更好的方法如下)
找到識別 nand boot 和 nor boot 的方法,其實也是在自己犯的一個錯誤中找到的。
當我在使用nand boot的時候,想使用操作Nor flash的命令,但是一用就死機,我一開始以爲是操作flash的程序錯了.
但我找了半天都沒有找到錯誤,最後終於發現:原來這是S3C2440芯片的機制的問題,在硬件上設爲Nand boot的時候,作爲Nor boot的那個分區沒有被映射到相應的地址.
也就是說,將mini2440的啓動選擇開關打在Nand boot的時候,Nor flash硬件上是不可用的。但是在Nand boot啓動後,你再把開關撥到Nor boot,又可以操作Nor flash了。
在將mini2440的啓動開關打在nand boot的時候,讀取nor flash,得到的都是0。
利用這一點,我在啓動的時候,只需讀取nor flash中4K(和nand boot原理有關)之後的一段數據,如果都是0,證明是Nand boot,否則爲Nor boot。
4K之後多少和uboot有關,太后面了可能出現連續的0,所以我用16進制查看器看了下uboot的bin文件,確定在8K左右不可能出現連續16個字的0。
 
所以我在一啓動的時候讀取地址爲0x2000處的數據,如果檢測到非零數,就啓動Nor boot的自拷貝程序,否則跳到Nand boot程序。
一、啓動識別nand boot or Nor boot(新方案)
在使用了以前的識別方案之後,有網友覺得不好,不保險,有點碰巧的感覺。其實我也一直對這個方案不滿意。但是一直沒有找到更好的解決方案。今天又有朋友對我說:“覺得那樣的做法有點像碰運氣,並不是佷正規的方式”所以我決定一定要把這個東西更好的解決掉。我又把2440的數據手冊的《第五章 存儲器控制器》看了一遍,最後在Nor boot和Nand boot的啓動的存儲器映射上找到了出路,下面我慢慢道來:
    先請大家看《第五章 存儲器控制器》中的《Figure 5-1. S3C2440A Memory Map after Reset》(也就是那個映射圖),從理論上來講,對於0x40000000以後的內存,只有在Nor boot的時候才存在;而在nand
boot 的時候他被映射到了0x00000000,在
0x40000000以後不存在內存。如果我們在啓動的時候,將一些特定的數據寫入0x40000000~0x40001000之間,那麼按照數據手冊上的說法,如果回讀的結果和寫入的一致說明是nor boot,否則就是nand boot!
     這種辦法理論上是通的,但是實際上,那個圖是錯的!!通過我的實驗,正真的映射圖如下:
從上圖我們可以看出,無論是Nor boot還是nand boot ,這4K的內部SRAM都被映射到了0x40000000,而在nand boot的時候,這塊內存同時還被映射到了0x00000000那麼一開始提出的辦法就不可行了,而且在nand boot 的時候寫入0x40000000~0x40001000還會破壞自身的程序。

但是通過上面的圖,我想到了解決的辦法:
在啓動的時候,用程序
0x40000000~0x40001000中的某些位置清零,如果回讀0x00000000~0x00001000中的相應位置後爲零,說明是Nand boot,如果是原來的數據(一定要選非零的位置)就是Nor boot。判斷完後如果是nand boot,還要恢復被改動的數據,再進入自拷貝階段。
   只要檢測的位置合理,這方法是可行的。現在的關鍵是選什麼位置的數據最好呢?經過查看源碼,我選擇了在start.S文件開頭,全局中斷向量之後的:

.balignl 16,0xdeadbeef


選這個數據作爲檢測位置的理由如下:
(1)他是非零數,而且數據是確定的:0xdeadbeef;
(2)他的位置是固定的:
0x0000003c0x4000003c);
(3)他在檢測程序之前,不會影響程序的向下運行;
(4)他不屬於程序,他是一個程序中的魔數(Magic Number),用魔數來檢測也比較合理


所以我最後的檢測步驟是:
在啓動的時候,將0x4000003c位置開始的四個字節清零,然後讀取0x0000003c位置開始的四個字節。如果回讀的結果爲零,說明是nand boot,否則就是Nor boot(爲了保險還可以判斷是否爲0xdeadbeef,不是的話就說明有未知錯誤,死循環!)。但是最後有一點很重要:如果是Nand boot,必須要復原清零的數據。原因是:在nand boot過後,會覈對內部SRAM中的4K程序,和從Nand中拷貝到SDRAM的前4K程序是否一致,如果不一致會進入死循環。

通過這次的實驗,讓我有更深刻的理解了24x0的啓動機制。


二、啓動識別nand flash
實現識別nand flash的識別其實非常簡單。
就是在執行Nand boot程序的時候,


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章