u-boot之NAND啟動與NOR啟動的區別
阿新 • • 發佈:2018-07-22
lse 讀寫 long ash 直接 分析 lsh 地址 判斷
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做了什麽
在分析start.s的時候已經知道了uboot需要從flash中拷貝內容到ram上運行。
int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size) { unsignedint *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啟動 } }
u-boot之NAND啟動與NOR啟動的區別