一,修改文件arch/arm/cpu/arm920t/start.S
1,将117,118两行注释掉,这个是用于LED跳转的,没什么用,也没有程序可跳
@ bl coloured_LED_init
@ bl red_LED_on
2, 将135-170 行注释掉,这个代码是定义特殊寄存器和屏蔽中断的,我们将在后面的程序中统一操作,让代码不至于很凌乱
#if 0 /*We init S3C24XX in board/fl2440/lowlevel_init.S, which called by cpu_init_crit */
跳转到lowlevel_init,修改
3,关闭看门狗
/****** Disable Watchdog ******/
ldr r0, =S3C24X0_WATCHDOG_BASE
mov r1, #0
str r1, [r0]
4, 屏蔽所有中断
/****** Disable interrupt by mask all IRQ mask ******/
ldr r0, =S3C24X0_INTERRUPT_BASE
mvn r1, #0x0
str r1, [r0, #INTMSK_OFFSET]
str r1, [r0, #INTSUBMSK_OFFSET]
5, 初始化系统时钟,总线时钟
/****** Initialize System Clock, FCLK:HCLK:PCLK = 1:4:8,default FCLK is 120MHz ******/
ldr r0, =S3C24X0_CLOCK_POWER_BASE
mov r1, #5
str r1, [r0, #CLKDIVN_OFFSET]
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
mov r2, #MDIV_405
add r2, r2, #PSDIV_405
str r2, [r0, #MPLLCON_OFFSET]
二,在board/fl2440/lowlevel_init.S 130行左右,添加以下寄存器定义
#define S3C24X0_INTERRUPT_BASE 0x4A000000
#define S3C24X0_CLOCK_POWER_BASE 0x4C000000
#define S3C2410_NAND_BASE 0x4E000000
#define S3C24X0_WATCHDOG_BASE 0x53000000
#define S3C24X0_GPIO_BASE 0x56000000
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
#define GPBUP 0x56000018
#define INTMSK_OFFSET 0x08
#define INTSUBMSK_OFFSET 0x1c
#define MPLLCON_OFFSET 0x04
#define CLKDIVN_OFFSET 0x14
#define NFCONF_OFFSET 0x00
#define NFCONT_OFFSET 0x04
#define NFCMD_OFFSET 0x08
#define NFSTAT_OFFSET 0x20
#define MDIV_405 0x7f << 12
#define PSDIV_405 0x21
#define MDIV_200 0xa1 << 12
#define PSDIV_200 0x31
三,修改include/asm/arch-s3c24x0/s3c24x0.h
将该文件中的#if defined(CONFIG_S3C2410)
修改为#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
支持s3c2440开发板
并在其中加入S3C2440的NAND FLASH寄存器定义和CAMDIVN定义
在160行左右修改nandflash的寄存器定义,修改s3c2410_nand结构体为如下
#if defined (CONFIG_S3C2440)
/* NAND FLASH (see S3C2440 manual chapter 6) */
struct s3c2410_nand {
u32 NFCONF;
u32 NFCONT;
u32 NFCMD;
u32 NFADDR;
u32 NFDATA;
u32 NFMECCD0;
u32 NFMECCD1;
u32 NFSECCD;
u32 NFSTAT;
u32 NFESTAT0;
u32 NFESTAT1;
u32 NFMECC0;
u32 NFMECC1;
u32 NFSECC;
u32 NFSBLK;
u32 NFEBLK;
};
#endif
124行左右修改s3c24x0_clock_power结构体
struct s3c24x0_clock_power {
u32 LOCKTIME;
u32 MPLLCON;
u32 UPLLCON;
u32 CLKCON;
u32 CLKSLOW;
u32 CLKDIVN;
#if defined (CONFIG_S3C2440)
u32 CAMDIVN;
#endif
}
四,include/asm/arch/s3c24x0_cpu.h,补充对s3c2440的支持
文件23行,修改#elif defined (CONFIG_S3C2410)为
#elif defined (CONFIG_S3C2410) | (CONFIG_S3C2440)
五,修改arch/arm/cpu/arm920t/s3c24x0/timer.c文件
184行添加支持s3c2440
defined(CONFIG_S3C2440) || \
六,修改arch/arm/cpu/arm920t/s3c24x0/speed.c
66行添加
#if defined(CONFIG_S3C2440) /* add by hurryliu */
if(pllreg == MPLL)
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
else if(pllreg == UPLL)
#endif
80行左右修改get_HCLK()函数如下
ulong get_HCLK(void)
{
struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
//return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
#if defined(CONFIG_S3C2440) /* Modify by hurryliu*/
if (readl(&clk_power->CLKDIVN) & 0x6)
{
if ((readl(&clk_power->CLKDIVN) & 0x6)==2)
return(get_FCLK()/2);
if ((readl(&clk_power->CLKDIVN) & 0x6)==6)
return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 : get_FCLK()/3);
if ((readl(&clk_power->CLKDIVN) & 0x6)==4)
return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
return(get_FCLK());
}
else
return(get_FCLK());
#else
return((readl(&clk_power->CLKDIVN) & 0x2) ? get_FCLK()/2 : get_FCLK());
#endif /* Modify end*/
}
七,修改include/configs/fl2440.h
38行添加#define CONFIG_S3C2440 1
定义在内存中运行的宏,支持在内存中运行
#define CONFIG_SKIP_LOWLEVEL_INIT 1
八,修改include/configs/fl2440.h 120行为自己的开发板启动信息
#define CONFIG_SYS_PROMPT "fl2440@hurryliu # "
这些工作做完后,下载到内存中运行,连接串口,就可以看到打印的信息了
U-Boot 2010.09 (Mar 14 2013 - 16:15:59)
DRAM: 64 MiB
Flash: 512 KiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: CS8900-0
fl2440@hurryliu #
fl2440@hurryliu #