1. 程式人生 > >u-boot-2014.10移植第16天----Nor flash啟動

u-boot-2014.10移植第16天----Nor flash啟動

第15天時將u-boot.bin檔案燒錄到Norflash上沒有正常啟動,考慮到tq2440.h檔案中的CONFIG_SYS_TEXT_BASE 值時0x33FC0000,我們將其修改為0,畢竟這個是絕對地址。

#define CONFIG_SYS_TEXT_BASE 0

修改、編譯、燒錄後執行:

結果還是不能執行,這是什麼原因呢?

將bootstrap.bin檔案重新燒錄到Norflash中,將u-boot.bin燒錄到SDRAM的0x33fc0000位置,執行也不成功。

將CONFIG_SYS_TEXT_BASE 恢復為0x33fc0000

#define CONFIG_SYS_TEXT_BASE 0x33FC0000
修改、編譯、燒錄後執行是可以的。這就很奇怪了,為什麼講u-boot.bin燒錄到Norflash上為什麼不能執行呢?

原來是前面定義了CONFIG_SKIP_LOWLEVEL_INIT巨集,跳過了cpu_init_crit,在arch/arm/cpu/arm920t/start.S 檔案中如下部分,註釋說明僅僅是在reboot是才會進行sys-critical初始化,當從RAM中啟動時,不進行sys-critical初始化。

    /*
     * we do sys-critical inits only at reboot,
     * not when booting from ram!
     */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    bl  cpu_init_crit
#endif

所以,這裡我們將tq2440.h檔案中CONFIG_SKIP_LOWLEVEL_INIT巨集註釋掉。問題來了我們註釋掉這個巨集之後,編譯出現了這樣的問題:
arm-linux-ld.bfd:u-boot.lds:1: ignoring invalid character `#' in expression
arm-linux-ld.bfd:u-boot.lds:1: syntax error
make: *** [u-boot] 錯誤 1
找到原因是上面一條巨集影響的結果:
#define CONFIG_BOARD_EARLY_INIT_F
//#define CONFIG_SKIP_LOWLEVEL_INIT
正常的巨集定義都是

#define xxx 1

我們可以刪除這個巨集也可以這樣註釋:

#define CONFIG_BOARD_EARLY_INIT_F
/* #define CONFIG_SKIP_LOWLEVEL_INIT */
還有不要忘了:
#define CONFIG_SYS_TEXT_BASE 0

修改一下SDRAM的重新整理頻率,在檔案:board/samsung/tq2440/lowlevel_init.S中修改REFCNT的值:

#define REFCNT          0x4f4

S3C2440手冊知,計算公式:Refresh period = (2^11-refresh_count+1)/HCLK

SDRAM手冊知:Refresh period =8192/64ms

下面start.S設定FCLK為405MHZ,分頻係數 FCLK:HCLK:PCLK = 1:4:8 ,HCLK=100MHZ

於是編譯,用J-Flash ARM燒錄到Norflash上,記得燒錄完將軟體J-Flash ARM軟體斷開連線。復位開發板既可以實現從Norflash啟動了。

明天繼續!