好久沒動開發(fā)板了,終于把研考完了,可以安心的做自己的實驗了,但發(fā)現(xiàn)放下手頭關(guān)于tq2440的實驗兩個多月,發(fā)現(xiàn)生疏了許多,許多問題都要想一下才能記起來是什么原理,真得抓緊時間好好弄了。
又從uboot開始弄,以前移植了uboot1.3.1,由于太多匆忙,沒有過多的注重細節(jié),今天發(fā)現(xiàn)了一個以前忽略的問題,就是開發(fā)板自己判斷是從何種flash介質(zhì)啟動的問題,首先說一下為什么要判斷是哪種flash介質(zhì)啟動,因為這樣就沒有必要區(qū)分nor boot還是nand boot的bin文件了,bin文件燒到nor和nand都可以正常啟動開發(fā)板。
在網(wǎng)上看了下別人關(guān)于nor boot或nand boot 的文章,發(fā)現(xiàn)Tekkaman Ninja寫的文章非常好,很值得推薦,附上地址,以便以后查找:http://blog.chinaunix.net/u1/34474/showart.php?id=2085212
下面來分析下天嵌公司的uboot,據(jù)Tekkaman Ninja說,天嵌的uboot是從openJTAG的uboot 借鑒過來的,這個我們姑且不管他。貼下天嵌TQ2440的uboot中關(guān)于啟動判斷的代碼:
int bBootFrmNORFlash(void)
{
volatile unsigned int *pdw = (volatile unsigned int *)0;
unsigned int dwVal;
dwVal = *pdw;
*pdw = 0x12345678;
if (*pdw != 0x12345678)
{
return 1;
}
else
{
*pdw = dwVal;
return 0;
}
}
這段代碼的思想是這樣的,無論是從NOR Flash還是從NAND Flash啟動,地址0處為指令"b Reset",
機器碼為0xEA00000B,對于從NAND Flash啟動的情況,其開始4KB的代碼會復制到CPU內(nèi)部4K內(nèi)存中,對于從NOR
Flash啟動的情況,NOR Flash的開始地址即為0。對于NOR
Flash,必須通過一定的命令序列才能寫數(shù)據(jù),所以可以根據(jù)這點差別來分辨是從NAND Flash還是NOR
Flash啟動:向地址0寫入一個數(shù)據(jù),然后讀出來,如果沒有改變的話就是NOR Flash。
我們在深入的分析下,首先看下nand boot 和nor boot 時物理地址分配情況:
從NAND閃存啟動U-BOOT的設(shè)計思路
如果s3c2440被配置成從NAND閃存啟動,上電后,s3c2440的NAND閃存控制器會自動把NAND閃存
中的前4K數(shù)據(jù)搬移到內(nèi)部RAM中, 并把0x00000000設(shè)置為內(nèi)部RAM的起始地址,
CPU從內(nèi)部RAM的0x00000000位置開始啟動。因此要把最核心的啟動程序放在NAND閃存的前4K中。
當nor boot時,0x0000_0000是nor flash的起始地址,用語句*pdw = 0x12345678;
向0x0000_0000處寫0x12345678,是沒用的,因為對于NOR
Flash,必須通過一定的命令序列才能寫數(shù)據(jù),所以*pdw中存的數(shù)據(jù)仍然是"b Reset",但當nand
flash啟動時,cpu內(nèi)部的4KBbootSRAM被映射到0x0000_0000開始的地址處,norflash這時無效了,這時用語句*pdw =
0x12345678;
向0x0000_0000處寫0x12345678時,0x12345678會被寫入,因為這是對內(nèi)存的操作,不需要指令序列等,所以一旦發(fā)現(xiàn)寫入和讀出
的數(shù)據(jù)一致時,則可判斷是nand boot,這時一定要把0x0000_0000處的數(shù)據(jù)還原,用*pdw = dwVal; 這句。
明天看看,得重新移植uboot了,好好研究研究,uboot很高深啊!!
http://blog.sina.com.cn/s/blog_52009a100100hcv1.html
posted on 2010-08-09 14:04
小果子 閱讀(1265)
評論(0) 編輯 收藏 引用 所屬分類:
Linux