友善之臂最新版mini2440學習筆記——u-boot 1.1.6移植(一)
阿新 • • 發佈:2019-01-27
從本文開始,將記錄博主在進行u-boot 1.1.6移植過程中遇到的問題。本文將涉及兩個問題:
1. u-boot中新增開發板
2. u-boot第一階段啟動程式碼
1. u-boot中新增開發板
1.1. Makefile更改
1.1.1. 增加反彙編檔案輸出
Makefile檔案中239行,原始檔為:
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
更改為:
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(obj)u-boot.dis $(U_BOOT_NAND)
1.1.2. 新增開發板
Makefile檔案1879行,按照smdk2410的形式,新增mini2440開發板配置如下:
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
1.1.3. 自動清理時刪除反彙編檔案
Makefile檔案2293行,原始檔為:
rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)
修改為:
rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(obj)u-boot.dis $(ALL)
1.2. 新增標頭檔案
在include/configs/目錄下新增mini2440.h檔案。可以直接拷貝一份smdk2410.h檔案。
1.3. 新增核心版檔案
在board/目錄下新增mini2440目錄。可直接拷貝smdk2410資料夾即可。
1.4. 小結
自此,mini2440開發板已經新增到u-boot 1.1.6中。可直接執行如下命令生成u-boot.bin檔案
make mini2440_config
make
但這個u-boot.bin檔案並無法啟動,需要修改相關程式碼進行移植。
2. U-boot第一階段啟動程式碼移植
mini2440的SOC為S3C2440,它的CPU為一個ARM920t的核,因此u-boot第一階段啟動程式碼就是cpu/arm920t/start.S檔案。
2.1. 關閉看門狗和中斷服務
S3C2440的看門狗和S3C2410一樣,因此在start.S檔案進行如下修改:
124行原始碼:
#elif defined(CONFIG_S3C2410)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
更改為:
#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
# define pWTCON 0x53000000 /* watchdog register address */
# define INTMSK 0x4A000008 /* interrupt mask register address */
# define INTSUBMSK 0x4A00001C /* interrupt sub-mask register address */
# define CLKDIVN 0x4C000014 /* clock divisor register */
131行原始碼:
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
更改為:
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
142行原始碼:
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
之後新增部分程式碼,變為:
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
#elif defined(CONFIG_S3C2440)
ldr r1, =0x7FFF
ldr r0, =INTSUBMSK
str r1, [r0]
2.2. 設定MPLL和UPLL
原始碼中,找到:
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
更改為:
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#elif defined(CONFIG_S3C2440)
# define MPLLCON 0x4C000004
# define UPLLCON 0x4C000008
ldr r0, =CLKDIVN
ldr r1, =0x5 /* FCLK:HCLK:PCLK = 1:4:8 */
str r1, [r0]
ldr r0, =MPLLCON
ldr r1, =0x5C011 /* MPLL=400MHz */
str r1, [r0]
ldr r0, =UPLLCON
ldr r1, =0x38022 /* UPLL=48MHz */
str r1, [r0]
/* configure S3C2440 to asynchronous bus mode */
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
#endif
2.3. 新增NAND啟動程式碼
u-boot的smdk2410程式碼中預設為NOR啟動,這裡需要自行新增NAND啟動程式碼。
找到原始檔中NOR啟動部分程式碼:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
更改為:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
#if defined(CONFIG_NOR_BOOT)
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
#elif defined(CONFIG_NAND_BOOT)
ldr sp, =0x1000 /* setup stack to 4k temporarily to call the c function nand_read_ll*/
bl nand_init_ll /* initialize nand flash */
ldr r0, _TEXT_BASE /* destination for u-boot relocation */
ldr r1, =0x0 /* source address in NAND */
ldr r2, =0x40000 /* length to read from NAND to SDRAM, 256K */
bl nand_read_ll /* call nand_read_ll to relocate u-boot */
#endif
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
2.4. 小結
到此為止,start.S的所有程式碼均已修改完畢。
3. 說明
最後一部分涉及到nand_init_ll和nand_read_ll兩個函式,網上關於NAND啟動中使用的這兩個C程式碼有很多,但博主下載之後均報錯。最後橫下一條心,根據韋東山大神的NAND裸機程式修改了一版,效果不錯。
下一篇博文將對這兩個函式及相關設定進行充分說明。