Windows下u-boot-2011.03在Mini2440移植詳解(7)

Nand Flash 啓動 && Nor FlashNand Flash雙啓動

Nand Flash啓動

參考網址: http://blog.csdn.net/canjiangsu/article/details/6162677

http://blog.chinaunix.net/uid-28335137-id-3721851.html

http://www.cnblogs.com/LoongEmbedded/archive/2010/11/18/1880379.html

http://www.crifan.com/switch_s3c2410_nandflash_k9f1208u0ak9f1208u0b_read_operation/

板子上的Nand Flash信息:K9F1208U0B:64MB,8位。1頁包含512字節的main數據區和16字節的spare數據區。有4096塊,每塊32頁,每頁512+16個字節。

燒寫到Nor flash的uboot代碼可以直接在Norflash裏運行,即所謂的XIP(eXecute In Place),那nand flash裏的程序可以直接在nand flash裏運行麼?這個http://www.crifan.com/order_is_not_suitable_for_nand_flash_why_do_xip_execute_in_place/網址上說了,不是不可以在nand flash中運行程序,而是不適合。因此S3C2440A爲了能夠從Nand Flash引導程序,就採用了steppingstone模式。

S3C2440A關於Nand Flash控制器的說明:(摘自DataSheet Nand Flash控制器一節)

目前的NOR Flash 存儲器價格較高,相對而言SDRAM和NAND Flash存儲器更經濟,這樣促使了一些用戶在NAND Flash中執行引導代碼,在SDRAM中執行主代碼。S3C2440A引導代碼可以在外部NAND Flash存儲器上執行。爲了支持NAND Flash的BootLoader,S3C2440A配備了一個內置的SRAM緩衝器,叫做“Steppingstone”。引導啓動時,NAND Flash存儲器的開始4K字節將被加載到Steppingstone中並且執行加載到Steppingstone的引導代碼。通常引導代碼會複製NAND Flash的內容到SDRAM中。通過使用硬件ECC,有效地檢查NAND Flash數據。在複製完成的基礎上,將在SDRAM中執行主程序。

管腳說明:


下面是Mini2440的Nand Flash相關原理圖:



所以硬件如果連接好了,那麼也就固定了你所能連接Nand Flash的類型了。

關於K9F1208U0B Nand Flash部分操作:

K9F1208U0B是以頁爲單位進行讀寫,以block爲單位進行擦除。我們知道K9F1208U0B它有4096塊,每塊32頁,每頁512+16個字節。4096*32*(512+16)=528Mbits。2^12=4096,2^5=32,2^10=1024>(512+16)。不算spare區,該nand flash的大小爲4096*32*512Bytes=64MBytes。我們知道2^26=64Mbytes。即:要想讀取該nand flash裏的數據,至少需要26根尋址線。從該nand flash的手冊中我們看到:


這裏面只用到了25根尋址線,A8沒有使用。那豈不是隻能操作該flash 32Mbytes空間?而從該nand flash的命令集中發現,對一頁512Bytes的操作分兩部分,需要兩個命令來進行,因此這裏面雖然只有25根尋址線,卻能尋址64Mbytes的內容。



s3c2440支持兩種啓動模式:NAND和非NAND(這裏是nor flash)。

具體採用的方式取決於OM0、OM1兩個引腳

OM[1:0所決定的啓動方式

OM[1:0]=00時,處理器從NAND Flash啓動

OM[1:0]=01時,處理器從16位寬度的ROM啓動

OM[1:0]=10時,處理器從32位寬度的ROM啓動。

OM[1:0]=11時,處理器從Test Mode啓動。

 


從該Nand Flash數據手冊上可知,第517個字節代表該塊是否壞塊,也就是OOB的第6個字節。如果是0xFF,代表是好塊,如果不是0xFF,則是壞塊。

 

在簡單介紹完有關Nand Flash啓動,也應該簡要說一下如何從Nand Flash啓動。

這和Nor Flash啓動非常相似。剛上電時,2440自動將Nand Flash的前4kB複製到Steppingstone然後在Steppingstone運行,在Steppingstone實現SDRAM的初始化,拷貝後面的代碼到SDRAM,之後的操作和Nor Flash無差別。Nand Flash前4kB的代碼無需做ECC校驗,這段代碼的正確性由NandFlash廠家承諾。之後代碼的ECC校驗由開發人員自己實現。

 

修改相關文件:

1.      u-boot-2011.03\arch\arm\cpu\arm920t\start.S

2.      u-boot-2011.03\board\samsung\mini2440\nand_flash_read.c

3.      u-boot-2011.03\board\samsung\mini2440\Makefile

4.      u-boot-2011.03\arch\arm\cpu\arm920t\u-boot.lds

5.      u-boot-2011.03\include\configs\mini2440.h

 

nand_flash_read.c爲新加的文件,用來讀取Nand Flash程序到SDRAM,start.S用來實現調用nand_flash_read.c內的函數。mini2440.h用來定義環境變量存到哪個存儲器裏。從Nand Flash裏啓動,所以將環境變量存入到Nand Flash裏。

比較重要的是前4kB的代碼中不能有使用大於4kB之外的變量或函數,可以通過查看根目錄下的u-boot-2011.03\System.map來確認。

 

如何將代碼下載到Nand Flash裏呢?在《增加Nand Flash的支持》一節中說明了。在調試狀態下,只要用nand erase,tftp和nand write這3個命令就可以將目標文件寫入到目的nand flash地址出。作者用的如下:

nand erase 0x00 0x4B000

tftp 0x30800000 u-boot.bin

nand write 0x30800000 0x00 0x48000

其實關於怎麼去操作nand flash,上面貼出來的網址可以詳細的看看。在這裏其實已經實現了自動識別從nor還是nand啓動,只是環境變量的保存都是在Nand Flash中。

 

本部分代碼下載地址:360雲盤http://yunpan.360.cn/,在《Uboot相關代碼》文件夾裏的《u-boot-2011.03_NandFlash啓動.zip》文件。

《u-boot-2011.03源碼無修改.tar.bz2》是從官網下的無修改代碼

 


Nor FlashNand Flash雙啓動

在前面的過程中已經實現了自動從Nor 還是Nand 啓動,只是環境變量的保存都是保存到了Nand Flash中。現在就實現從哪個存儲器啓動,環境變量就保存到哪個存儲器裏。主要參考了這個網址:

http://www.eefocus.com/ayayayaya/blog/10-10/196848_87e6f.html

這個網址http://blog.csdn.net/flytreeleft/article/details/6793126也可以看看。兩個實現的方法不太一樣。

修改相關文件:

1.      u-boot-2011.03\arch\arm\lib\board.c

2.      u-boot-2011.03\common\env_flash.c

3.      u-boot-2011.03\common\env_nand.c

 

爲什麼修改了board.c文件?

由於env_nand.c 文件裏的env_init函數會在board.c文件的board_init_f函數裏調用,這裏面用到了是nand還是nor啓動的標記,因此必須再調用env_init之前將標記賦值。

在board.c文件的board_init_r函數裏爲什麼又將此標記賦值?

在這個版本的uboot代碼中,board_init_f是沒有重映射之前的函數,到了board_init_r就是重映射之後的函數了。重映射是在函數board_init_f之後,函數board_init_r之前做的。因此這個標記還必須再次賦值。

 

Note:

當然必須將宏CONFIG_ENV_IS_IN_NAND和CONFIG_ENV_IS_IN_FLASH都定義上,這一步在《Nand Flash 啓動》一節中已經做過了。

編譯後分別下載到nand和norflash中。啓動如下圖:

Nand Flash啓動。


Nor Flash啓動。


本部分代碼下載地址:360雲盤http://yunpan.360.cn/,在《Uboot相關代碼》文件夾裏的《u-boot-2011.03NorNand啓動.zip》文件。

《u-boot-2011.03源碼無修改.tar.bz2》是從官網下的無修改代碼


至此,實現了Nor Flash和Nand Flash的雙重啓動。

關於是否能夠正確引導Linux,還需進一步調試。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章