nand啟動與nor啟動的區別主要分為以下幾部分說明:
1、nand flash與nor flash的最主要區別
2、s3c2440的nand啟動與nor啟動原理
3、nand啟動與nor啟動的時候uboot做了什么
1、在JZ2440開發板上有兩種Flash,分別為nand flash和nor flash。這兩種flash的最主要的區別為:nor flash比較穩定,存在里面的數據不易丟失,但是容量小,nor flash在讀的時候可以像內存一樣操作;nand flash容量大,但是存在位反轉,會導致數據丟失,讀寫需要通過一定的時序。所以一般nor flash里面存放的uboot代碼,而nand flash里面存放的是占用容量比較大的linux內核和文件系統。在JZ2440上,nand flash的容量為256M,而nor flash只有2M。
2、s3c2440的nand啟動與nor啟動原理
a、如圖所以當OM0引腳與OM1引腳分別為 01或10的時候,當芯片復位之后是從nor flash直接取指運行的。
b、OM0引腳與OM1為00的時候,當芯片復位之后是從nand flash的0地址處拷貝4K內容到芯片的內部ram運行的。

3、nand啟動與nor啟動的時候uboot做了什么
在u-boot之ARM920T的start.S分析分析start.s的時候已經知道了uboot需要從flash中拷貝內容到ram上運行。
int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size) { unsigned int *pdwDest; unsigned int *pdwSrc; int i; if (bBootFrmNORFlash())//判斷是從nand啟動的還是從nor啟動的,如果條件成立,表示是從nor啟動的 { pdwDest = (unsigned int *)buf; pdwSrc = (unsigned int *)start_addr; /* 從 NOR Flash啟動 */ for (i = 0; i < size / 4; i++)//4字節的寫入,所以需要size / 4 by andy { pdwDest[i] = pdwSrc[i];//norfalsh可以在配置完內存管理單元后,讀數據可以像內存一樣操作 } return 0; } else { /* 初始化NAND Flash */ nand_init_ll(); /* 從 NAND Flash啟動 */ nand_read_ll_lp(buf, start_addr, (size + NAND_BLOCK_MASK_LP)&~(NAND_BLOCK_MASK_LP)); return 0; } }
芯片根據向0地址寫入一個數據,然后讀出,如果沒有改變的話就是NOR FLASH(因為NOR FLASH寫入需要一定時序)的方式判斷是從nor拷貝uboot內容還是從nand拷貝uboot的內容。
int bBootFrmNORFlash(void) { volatile unsigned int *pdw = (volatile unsigned int *)0; unsigned int dwVal; /* * 無論是從NOR Flash還是從NAND Flash啟動, * 地址0處為指令"b Reset", 機器碼為0xEA00000B, * 對於從NAND Flash啟動的情況,其開始4KB的代碼會復制到CPU內部4K內存中, * 對於從NOR Flash啟動的情況,NOR Flash的開始地址即為0。 * 對於NOR Flash,必須通過一定的命令序列才能寫數據, * 所以可以根據這點差別來分辨是從NAND Flash還是NOR Flash啟動: * 向地址0寫入一個數據,然后讀出來,如果沒有改變的話就是NOR Flash */ dwVal = *pdw; *pdw = 0x12345678; if (*pdw != 0x12345678) { return 1;//從nor啟動 } else { *pdw = dwVal;//復原原先0地址處的數據 return 0;//從nand啟動 } }
