1. 程式人生 > >u-boot之NAND啟動與NOR啟動的區別

u-boot之NAND啟動與NOR啟動的區別

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)
{
    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啟動 
    }
}

u-boot之NAND啟動與NOR啟動的區別