u-boot-1.1.6版本
-----------------------
参照网上的一些资料,自己打算一步步移植,现在将每一阶段记录下来
第一阶段:
1.修改Makefile
其实就是在Makefile中添加你需要的config条目
-----------------------------------------------------
mini2440_config : unconfig
(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
----------------------------------------------------
对于这个条目是如何起作用的,主要可以看看$(topdir)config.mk这个文件
2.based on smdk2410
打算基于smdk2410的基础上移植,所以我们将include/smdk2410/ -->include/mini2440/;
include/configs/smdk2410.h -->include/configs/mini2440.h
到这里可以make mini2440_config,然后编译通过,但是这其实就是smdk241的uboot,并无差异。
3.下面才涉及到修改代码的问题
cpu/arm920t/start.S 这是个u-boot第一阶段的汇编代码,包括关闭看门狗和中断等,以及初始化clock和复制自己到ram中,为第二阶段做准备
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x7fff /* changed from 0x7ff to 0x7fff, only for s3c2440 */
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
---------------------------------------------------------------------------
#if 0 /* clock_init later */
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
/*这里把时钟初始化注释掉了,因为后面调用了clock_init函数来初始化*/
-------------------------------------------------------------------
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
adr r0, _start
ldr r1, _TEXT_BASE
cmp r0, r1
blne cpu_init_crit
#endif
/* Set up the stack */
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT /*added by zhenghao, for clock initialize*/
bl clock_init
#endif
/*因为要调用c程序,所以需要准备栈空间*/
-----------------------------------------------
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 clear_bss
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
#if 1
bl CopyCode2Ram /*r0:source r1:dest r2:size */
/*这个程序也是调用board/mini2440/boot_init.c中自己编写的一个程序。上电的时候需要把自己拷贝到ram中*/
----------------------------------------------------
#ifdef CONFIG_LED_MINI2440
#define GPIO_BASE 0x56000000
#define oGPIO_B 0x10
#define oGPIO_CON 0x0
#define oGPIO_DAT 0x4
#define oGPIO_UP 0x8
mov r1, #GPIO_BASE
add r1, r1,#oGPIO_B
ldr r2, =0x155aa
str r2,[r1, #oGPIO_CON]
mov r2, #0xff
str r2,[r1, #oGPIO_UP]
mov r2, #0x1c0
str r2, [r1, #oGPIO_DAT]
#endif
ldr pc, _start_armboot
_start_armboot: .word start_armboot
/*点亮第一个led,表示第一阶段完成*/
-----------------------------------------------------------
在board/mini2440/ 中添加boot_init.c文件,里面包含了第一阶段相关调用的函数
编译成功,运行时候可以完成第一阶段