Nand Flash 啓動 && Nor
Flash和Nand 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 Flash和Nand 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,還需進一步調試。