u-boot-2014.10移植第16天----Nor flash啟動
阿新 • • 發佈:2019-02-06
第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啟動了。
明天繼續!