三、修改时钟频率和中断的配置
Notes:下面绿色色部分代码既是需要修改的代码
3.1)修改eilian240开发板u-boot第一个要运行的程序cpu/arm920t/start.S(即u-boot的 stage1部分)
3.1.1)添加CPU频率初始化设置:
大概在star.S文件的第146行代码后面添加如下内容
/***定义时钟配置寄存器****change by eilianlau*************************/
#define CLK_CTL_BASE 0x4C000000
#define MDIV_405 0x7f << 12
#define PSDIV_405 0x21
#define MDIV_200 0xa1 << 12
#define PSDIV_200 0x31
/***************这些寄存器的定义S3C2440数据手册上是说的再清楚不过了如果不知道怎么配置请看下面贴图
3.1.2)添加中断禁止部分: 因为2410和2440的中断配置不同
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
#endif//
/***添加中断禁止部分****changeby eilianlau*************************/
# if defined(CONFIG_S3C2440)
ldr r1, =0x7fff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
3.1.3)修改时钟设置(2440的主频为405MHz)
原来的时钟设置函数是
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
修改上述代码如下
/***修改时钟设置(2440的主频为405MHz)****change by eilianlau***FCLK:HCLK:PCLK=1:4:8******/
/*********************************/
#if defined(CONFIG_S3C2440)
/* FCLK:HCLK:PCLK = 1:4:8 */
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
/****上面这三句是非常的重要的对于S3C2440,CLKDIVN的第[2:1]位为HDIVN,如果HDIVN非0,CPU总线模 式应该从“fast bus mode”转换为“asynchronous bus mode”,可以通过上面的3句程序实现。否则
CPU的工作频率将自动变成HCLK,不再是FCLK。这对SDRAM的初始化至关重要。****/
mov r1, #CLK_CTL_BASE
mov r2, #MDIV_405
add r2, r2, #PSDIV_405
str r2, [r1, #0x04] /* MPLLCON*/
/************************************/
#else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
/*************************************/
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
mov r1, #CLK_CTL_BASE
mov r2, #MDIV_200
add r2, r2, #PSDIV_200
str r2, [r1, #0x04]
#endif
/**************没什么可说的还是S3C2440数据手册********************/
#endif /* CONFIG_S3C24X0 */
3.2)修改cpu/arm920t/s3c24x0/ speed.c
我直接添代码吧<不知道要说什么。。>
3.2.1)修改static ulong get_PLLCLK(int pllreg)
static ulong get_PLLCLK(int pllreg)
{
struct s3c24x0_clock_power *clk_power =s3c24x0_get_base_clock_power();
ulong r, m, p, s;
if (pllreg == MPLL)
r = readl(&clk_power->MPLLCON);
else if (pllreg == UPLL)
r = readl(&clk_power->UPLLCON);
else
hang();
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
#if defined(CONFIG_S3C2440)
if(pllreg == MPLL)
{ //参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s)
return((CONFIG_SYS_CLK_FREQ * m * 2)/ (p << s));
}
#endif
return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
}
3.2.2)修改ulong get_FCLK(void)
/* return HCLK frequency */
ulong get_HCLK(void)
{
struct s3c24x0_clock_power *clk_power =s3c24x0_get_base_clock_power();
#if defined(CONFIG_S3C2440)
return(get_FCLK()/4);
#endif
return (readl(&clk_power->CLKDIVN) & 2) ?get_FCLK() / 2 : get_FCLK();
}
3.3)修改board/Samsung/eilian240/ eilian240.c
3.3.1)修改FCLK代码中带详细解释
/**#define FCLK_SPEED 1 *默认是加载FCLK_SPEED==1但2440的FCLK输出时钟为405Mhz该设置请参考2440数据手册255页那个表*/
#define FCLK_SPEED 2
/**change by eilianlau********/
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin =12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
#define M_MDIV 0xA1
#define M_PDIV 0x3
#define M_SDIV 0x1
/**change by eilianlau********/
#elif FCLK_SPEED==2 /* Fout = 405MHz */
#define M_MDIV 0x7f
#define M_PDIV 0x2
#define M_SDIV 0x1
#endif
/**change by eilianlau********/
3.3.2)修改USB的时钟
/**#define USB_CLOCK 1*道理同上*/
#define USB_CLOCK 2
#if USB_CLOCK==0
#define U_M_MDIV 0xA1
#define U_M_PDIV 0x3
#define U_M_SDIV 0x1
#elif USB_CLOCK==1
#define U_M_MDIV 0x48
#define U_M_PDIV 0x3
#define U_M_SDIV 0x2
/**change by eilianlau********/
#elif USB_CLOCK==2
#define U_M_MDIV 0x38
#define U_M_PDIV 0x2
#define U_M_SDIV 0x2
#endif
3.3.3)修改引导Linux内核的机器码<机器码必须和Linux内核中的机器码相同 这个是自己可以定义> cpu/arm920t/s3c24x0/ speed.c
/* arch number of eilian240-Board */
/* 这个机器码用于和Linux内核配对*/
gd->bd->bi_arch_number =MACH_TYPE_EILIAN240;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
icache_enable();
3.4)定义3.3.3的机器码MACH_TYPE_EILIAN240
3.4.1)修改u-boot-2010.03/include/asm-arm/mach-types.h<机器码都定义在这个文件中呢。。>
在第2702行添加下面的宏定义就O了
#defineMACH_TYPE_EILIAN2408000
3.5)在include/configs/eilian240.h头文件中添加之前用到的CONFIG_S3C2440宏
第40行添加代码如下:
#define CONFIG_S3C2440 1 /* on aeilian240 Board */
/******************************************************************/
3.6)另外为了更好理解S3C2440的时钟体系 上传几个图来理解希望对大家有所帮助<移植S3C3440芯片手册是必须要要参看的>
S3C2440时钟体系<一>
S3C2440时钟体系<二>
S3C2440时钟启动<二>
S3C2440时钟时钟相关寄存器LOCKTIME
S3C2440时钟时钟相关寄存器MPLLCON
S3C2440时钟时钟相关寄存器CLKDIVN
至此硬件初始化的工作就完成了。。可以测试编译下看有没有错误<编译通过 No problem> 如发现有错误请指出 十分感谢。。。
Notes:该文档下载地址连接点击下载此文档