详细的boorloader的移植五
#endif
sub
sp, r0, #12
/* leave 3 words for abort-stack */
替换为:
#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 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 */
#else
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
#endif
/* CONFIG_SKIP_RELOCATE_UBOOT */
4.相关头文件
(1)
include/s3c24x0.h
在下面结构体中添加
S3C24X0_REG32
CAMDIVN;
typedef struct {
S3C24X0_REG32
LOCKTIME;
S3C24X0_REG32
MPLLCON;
S3C24X0_REG32
UPLLCON;
S3C24X0_REG32
CLKCON;
S3C24X0_REG32
CLKSLOW;
S3C24X0_REG32
CLKDIVN;
}
添加
NAND
寄存器结构体
/* NAND FLASH (see S3C2440 manual chapter 6, www.top-e.org) */
typedef struct {
S3C24X0_REG32
NFCONF;
S3C24X0_REG32
NFCONT;
S3C24X0_REG32
NFCMD;
S3C24X0_REG32
NFADDR;
S3C24X0_REG32
NFDATA;
S3C24X0_REG32
NFMECCD0;
S3C24X0_REG32
NFMECCD1;
S3C24X0_REG32
NFSECCD;
S3C24X0_REG32
NFSTAT;
S3C24X0_REG32
NFESTAT0;
S3C24X0_REG32
NFESTAT1;
S3C24X0_REG32
NFMECC0;
S3C24X0_REG32
NFMECC1;
S3C24X0_REG32
NFSECC;
S3C24X0_REG32
NFSBLK;
S3C24X0_REG32
NFEBLK;
} /*__attribute__((__packed__))*/ S3C2440_NAND;
(2)
cpu/arm920t/s3c24x0/speed.c
【
1
】在
#define MPLL 0
#define UPLL 1
上面增加
DECLARE_GLOBAL_DATA_PTR;
【
2
】在
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
后面
增加
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
else
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /* S3C2440 */
【3】增加宏定义
/* for s3c2440 */
#define S3C2440_CLKDIVN_PDIVN (1<<0)
#define S3C2440_CLKDIVN_HDIVN_MASK (3<<1)
#define S3C2440_CLKDIVN_HDIVN_1 (0<<1)
#define S3C2440_CLKDIVN_HDIVN_2 (1<<1)
#define S3C2440_CLKDIVN_HDIVN_4_8 (2<<1)
#define S3C2440_CLKDIVN_HDIVN_3_6 (3<<1)
#define S3C2440_CLKDIVN_UCLK (1<<3)
#define S3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)
#define S3C2440_CAMDIVN_CAMCLK_SEL (1<<4)
#define S3C2440_CAMDIVN_HCLK3_HALF (1<<8)
#define S3C2440_CAMDIVN_HCLK4_HALF (1<<9)
#define S3C2440_CAMDIVN_DVSEN (1<<12)
【4】
get_HCLK get_PCLK
函数修改
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
else
文章出处:http://www.top-e.org/jiaoshi/html/409.html