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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM