一·增加對S3C2440的支持
由於U-BOOT沒有對2440的支持,可以在2410的基礎上修改
添加宏定義如下:
vi include/configs/CM2440.h 第37行
#define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC */
#define CONFIG_CM2440 1 /* on a SAMSUNG CCM2440 Board */
並屏蔽掉原來的
1.修改SDRAM配置
vi board/samsung/CM2440/lowlevel_init.S
修改lowlevel_init.S第54行
#define B1_BWSCON (DW16)//DW32
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB)
#define B4_BWSCON (DW16)//DM9000
#define B5_BWSCON (DW8)//DW16
#define B6_BWSCON (DW32)//SDRAM
#define B7_BWSCON (DW32)
修改SDRAM刷新率,第126行
#define REFCNT 0x4f4 /* period=7.8125us,HCLK=100Mhz,(2048+1-7.8125*100)=0x4F4 */
2.修改start.S
stage1的入口點在start.S,現在修改裡寄存器的配置
vi cpu/arm920t/start.S 第143行左右
#elif defined(CONFIG_S3C2440)
# define pWTCON 0x53000000
# define INTMOD 0X4A000004
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
/******************WXZ********************/
#elif defined(CONFIG_S3C2440)
ldr r1, =0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
/******************WXZ*******************/
# endif
3.時鐘修改
2440的時鐘和2410的時鐘設置有區別,將FCLK:HCLK:PCLK=1:4:8
start.S第171行添加
/******************WXZ******************/
# if defined(CONFIG_S3C2440)
#define MPLLCON 0x4c000004
#define UPLLCON 0x4c000008
#define LOCKTIME 0x4c000000
ldr r0,=LOCKTIME
ldr r1,=0xffffff
str r1,[r0]
/* FCLK:HCLK:PCLK = 1:4:8 */
ldr r0, =CLKDIVN
ldr r1, =0x5
str r1, [r0]
ldr r0, =MPLLCON
ldr r1, =0x5c021/*mpll=400MHZ*/
str r1, [r0]
ldr r0, =UPLLCON
ldr r1, =0x38022
str r1, [r0]
# else
/********************WXZ****************/
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
時鐘還要在board/samsung/CM2440/CM2440.c和cpu/arm920t/s3c24x0/speed.c
中修改部分代碼,在第二階段初始化會用到
修改board/samsung/CM2440/CM2440.c中board_init()時鐘部分
第67行加入如下宏定義:
/******************************WXZ****************************/
/* S3C2440: Mpll = (2*m * Fin) / (p * 2^s), UPLL = (m * Fin) / (p * 2^s)
* m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
*/
/* Fin = 12.0000MHz */
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x02<<4)|(0x01))
//MPLL= 400MHz
#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))
//UPLL= 96MHz
#define S3C2440_CLKDIV 0x05 /* FCLK:HCLK:PCLK = 1:4:8, UCLK = UPLL/2= 48MHz*/
/*******************************WXZ*****************************/
以上代码针对 s3c2440定义了MPLL、UPLL寄存器的值。开发板输入时钟
为 12Mhz(这在 include/configs/CM2440.h 中的宏 CONFIG_SYS_CLK_FREQ 中定义)
註釋掉原來時鐘設置,在board_init()加入
/*********************************WXZ*******************************/
clk_power->CLKDIVN = S3C2440_CLKDIV; //1:4:8
/* change to asynchronous bus mod */
__asm__(
"mrc p15, 0, r1, c1, c0, 0\n"
"orr r1, r1, #0xc0000000\n"
"mcr p15, 0, r1, c1, c0, 0\n"
:::"r1"
);
/* to reduce PLL lock time, adjust the LOCKTIME register */
clk_power->LOCKTIME = 0xFFFFFF;
/* configure UPLL */
clk_power->UPLLCON = S3C2440_UPLL_48MHZ;
/* some delay between MPLL and UPLL */
delay (4000);
/* configure MPLL */
clk_power->MPLLCON = S3C2440_MPLL_400MHZ;
//fin=12.000MHz
/* some delay between MPLL and UPLL */
delay (8000);
/* arch number of SMDK2440-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
//關於MPLL,UPLL設置先後順序,按照手冊來說應該是UPLL設置以後至少7個機器周期后才設置MPLL
/*******************************WXZ********************************/
vi cpu/arm920t/s3c24x0/speed.c 根据设置的分频系数FCLK:HCLKCLK = 1:4:8
修改获取时钟频率的函数
在開頭處包含頭文件第39行
#elif defined(CONFIG_S3C2440)
#include <s3c2440.h>
並在40行左右增加gt變量
DECLARE_GLOBAL_DATA_PTR;
下面分別修改get_PLLCLK();get_HCLK();get_PCLK();
是因為2410和2440分頻計算不一樣
get_PLLCLK();第72行改為
/******************************WXZ**********************/
return((CONFIG_SYS_CLK_FREQ * m*2)/ (p << s));
同樣修改 get_HCLK();get_PCLK();
/* return HCLK frequency */
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
clkdiv = clk_power->CLKDIVN;
camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
case S3C2440_CLKDIVN_HDIVN_1:
hdiv = 1;
break;
case S3C2440_CLKDIVN_HDIVN_2:
hdiv = 2;
break;
case S3C2440_CLKDIVN_HDIVN_4_8:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
break;
case S3C2440_CLKDIVN_HDIVN_3_6:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
break;
}
return get_FCLK() / hdiv;
}
/* return PCLK frequency */
ulong get_PCLK(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 */
clkdiv = clk_power->CLKDIVN;
camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
case S3C2440_CLKDIVN_HDIVN_1:
hdiv = 1;
break;
case S3C2440_CLKDIVN_HDIVN_2:
hdiv = 2;
break;
case S3C2440_CLKDIVN_HDIVN_4_8:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
break;
case S3C2440_CLKDIVN_HDIVN_3_6:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
break;
}
return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);
}
在 include/s3c24x0.h 中 重 新 定 义 S3C24X0_CLOCK_POWER 结 构 体 , 在
include/s3c24x0.h 中,S3C24X0_CLOCK_POWER 结构体中增加:129 行
S3C24X0_REG32 CAMDIVN; /* for s3c2440*/
現在 make CM2440_config
make all
可能會出現的一些錯誤,跟蹤會發現是smdk2410宏未定義出錯,此時改為CM2440即可,在start.s中屏蔽@bl cpu_init_crit,原因是CPUSDRAM已經初始化,在board/samsung/CM2440/config.mk 中修改_TXET_BASE=0x33000000加載到TXET_BASE這個地址運行
U-Boot 2009.08-rc3 ( 5 26 2011 - 19:03:54)
DRAM: 64 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment
SMDK2410 #
以上並為對CAMDIVN進行操作,原因是複位時,初始值為0
此時第一步就算完成了