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文件,裏面包含了第一階段相關調用的函數
編譯成功,運行時候可以完成第一階段