1. 程式人生 > >判斷uboot啟動方式:norflash還是nandflash

判斷uboot啟動方式:norflash還是nandflash

在XC2440開發板上做uboot從nandflash啟動時,需要檢測硬體啟動方式,啟動方式是由硬體OM管腳決定的,軟體無法檢測硬體電平狀態,但可以根據CPU的啟動特性來檢測。 通過深入研究2440的啟動方式,總結了幾點: 如果將S3C2440配置成從NANDFLASH啟動(將開發板的啟動開關拔到nand端,此時OM0管腳拉低)S3C2440的Nand控制器會自動把Nandflash中的前4K程式碼資料搬到內部SRAM中(地址為0x40000000),同時還把這塊SRAM地址對映到了0x00000000地址CPU從0x00000000位置開始執行程式。 如果將S3C2440配置成從Norflash啟動(將開發的啟動開關拔到nor端,此時OM0管腳拉高),0x00000000就是norflash實際的起始地址,norflash中的程式就從這裡開始執行,不涉及到資料拷貝和地址對映
看S3C2440的地址對映圖: 根據前面的啟動過程分析,nand啟動時,地址0x00000000為SRAM對映的地址;nor啟動時,地址0x00000000為norflash的實際起始地址。向norflash中寫資料需要特定的命令時序,而向記憶體中寫資料可以直接向記憶體地址賦值。 根據這兩個特性,我們可以這樣檢測,程式碼如下:
  1. int check_flashboot_mode(void)
  2. {
  3.     volatile unsigned int *pdw = (volatile unsigned int *)0;
  4.     unsigned int dwVal;
  5.     dwVal = *pdw; 
  6.     *
    pdw = 0x12345678;
  7.     if (*pdw != 0x12345678)
  8.     {
  9.         return 1;
  10.     }
  11.     else
  12.     {
  13.         *pdw = dwVal;
  14.         return 0;
  15.     }
  16. }
用volatile宣告一個暫存器變數*pdw指向的是0地址。向0地址處寫一串資料,比如0x12345678,*pdw = 0x12345678,接著再從0地址中把資料讀回來。 因為nor啟動時,0地址是norflash的起始址,而向norflash寫資料需要特定的命令時序,所以直接給地址賦值是不起做用的,所以讀回來的資料還是norflash中原有的資料,這樣通過*pdw != 0x12345678判斷,此時為nor啟動。
而在nand啟動時,0地址是記憶體的地址對映,可以用直接賦值的方法向記憶體中寫入資料,接著從0地址讀回來的資料變為0x12345678,和之前寫入的資料相等,此時就為nand啟動,在操作完後,要將資料還原 *pdw = dwVal