`
wodamazi
  • 浏览: 1416586 次
文章分类
社区版块
存档分类
最新评论

UBOOT-2010-03在S3C2440上的移植<二>------------硬件初始化

 
阅读更多

三、修改时钟频率和中断的配置

Notes:下面绿色色部分代码既是需要修改的代码

接上文

UBOOT-2010-03在S3C2440上的移植<一>------------项目搭建

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时钟启动<二>

S3C2440时钟时钟相关寄存器LOCKTIME


S3C2440时钟时钟相关寄存器MPLLCON


S3C2440时钟时钟相关寄存器CLKDIVN


至此硬件初始化的工作就完成了。。可以测试编译下看有没有错误<编译通过 No problem> 如发现有错误请指出 十分感谢。。。

Notes:该文档下载地址连接点击下载此文档

Notes:下文接

UBOOT-2010-03在S3C2440上的移植<三>------------自动识别启动模式Nand Or Nor





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics