您的位置:首页 > 其它

友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(一)

2016-05-30 20:36 489 查看
从本文开始,将记录博主在进行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裸机程序修改了一版,效果不错。

下一篇博文将对这两个函数及相关设置进行充分说明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: