自動識別啟動模式Nand Or Nor
UBOOT-2010-03在S3C2440上的移植<二>------------硬件初始化
http://www.linuxidc.com/Linux/2011-11/46993p2.htm
Notes:2)下面代碼段紅色部分為刪除部分
本文引用地址:http://m.butianyuan.cn/article/201611/319957.htmNotes:3)下面代碼段綠色部分為添加部分
4.1)Notes:以下資源來自大神Tekkaman Ninja博客點擊查看原文
移植之前還是請大家先看S3C2440數據手冊<
第五章存儲器控制器>中的(也就是那個映射圖),從理論上來講,對于0x40000000以后的內存,只有在Nor boot的時候才存在;而在nandboot 的時候他被映射到了0x00000000,在0x40000000以后不存在內存。如果我們在啟動的時候,將一些特定的數據寫入0x40000000~0x40001000之間,那么按照數據手冊上的說法,如果回讀的結果和寫入的一致說明是nor boot,否則就是nand boot!<寫這個文章的時候我又看了一次。。。。。。。。。>從上圖我們可以看出,無論是Nor boot還是nand
但是通過上面的圖,我想到了解決的辦法:
在啟動的時候,用程序將0x40000000~0x40001000中的某些位置清零,如果回讀0x00000000~0x00001000中的相應位置后為零,說明是Nand boot,如果是原來的數據(一定要選非零的位置)就是Nor boot。判斷完后如果是nand boot,還要恢復被改動的數據,再進入自拷貝階段。
.balignl 16,0xdeadbeef |
選這個數據作為檢測位置的理由如下:
(1)他是非零數,而且數據是確定的:0xdeadbeef;
(2)他的位置是固定的:0x0000003c(0x4000003c);
(3)他在檢測程序之前,不會影響程序的向下運行;
(4)他不屬于程序,他是一個程序中的魔數(Magic Number),用魔數來檢測也比較合理。
所以我最后的檢測步驟是:
在啟動的時候,將0x4000003c位置開始的四個字節(jié)清零,然后讀取0x0000003c位置開始的四個字節(jié)。如果回讀的結果為零,說明是nand boot,否則就是Nor boot(為了保險還可以判斷是否為0xdeadbeef,不是的話就說明有未知錯誤,死循環(huán)!)。但是最后有一點很重要:如果是Nand boot,必須要復原清零的數據。原因是:在nand boot過后,會核對內部SRAM中的4K程序,和從Nand中拷貝到SDRAM的前4K程序是否一致,如果不一致會進入死循環(huán)。
.globl bBootFrmNORFlash
bBootFrmNORFlash:
4.1.2)判斷當前代碼位置,如果在內存,直接跳到stack_setup
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
#endif
4.1.3)如果代碼當前位置不在內存中,就判斷啟動方式為Nand Flash或者Nor Flash
Notes:沒有說明就默認在以上代碼的后面添加
4.1.4)在Nand Flash中啟動的話,那么Nand Flash搬移代碼如下:
Notes:定義u-boot在Nand flash中存放的長度為#define LENGTH_UBOOT 0x100000<1M>,可以方便修改u-boot因為裁剪和增添大小的改變而占的長度。
#define LENGTH_UBOOT 0x100000
#define NAND_CTL_BASE 0x4E000000
#ifdef CONFIG_S3C2440
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFSTAT 0x20
nand1:
nand2:
bad_nand_read:
loop2:
ok_nand_read:
go_next:
notmatch:
loop3:
#endif
4.1.5)在Nor Flash中啟動的話,那么Nor Flash搬移代碼如下:
relocate:
copy_loop:
SetBootFlag:
4.1.6)刪除下面這段代碼
//#ifndef CONFIG_SKIP_RELOCATE_UBOOT
//relocate:
//
//
//
//
//
//
//
//
//copy_loop:
//
//
//
//
//#endif
4.2.1)在_start_armboot: .word start_armboot 后面添加:
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x10000
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4
Notes1):如果你不是第一次移植UBOOT那么建議好好的理解一下上面這些代碼<當然加入你還是第一次的話那么好了直接COPY吧很管用的>
Notes2):上面用到了一個nand_read_ll函數,該函數用來讀NANDFLASH的<下一篇就是實現這個UBOOT對NAND的支持了先休息一下吧>
評論