1. 程式人生 > >友善之臂最新版mini2440學習筆記——u-boot 1.1.6移植(一)

友善之臂最新版mini2440學習筆記——u-boot 1.1.6移植(一)

從本文開始,將記錄博主在進行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裸機程式修改了一版,效果不錯。

下一篇博文將對這兩個函式及相關設定進行充分說明。