三、第二阶段启动代码移植
1.S3C2440时钟工作频率设置
Index: mini2440.c
===================================================================
RCS file: /home/tracy/work/cvsroot/u-boot-2009.08/board/samsung/mini2440/mini2440.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- mini2440.c 10 Mar 2012 13:37:07 -0000 1.1
+++ mini2440.c 30 Mar 2012 12:52:18 -0000 1.2
@@ -36,9 +36,9 @@
#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
+#elif FCLK_SPEED==1 /* Fout = 400MHz */
+#define M_MDIV 0x5C
+#define M_PDIV 0x1
#define M_SDIV 0x1
#endif
@@ -49,8 +49,8 @@
#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_MDIV 0x38
+#define U_M_PDIV 0x2
#define U_M_SDIV 0x2
#endif
@@ -103,7 +103,7 @@
gpio->GPHUP = 0x000007FF;
/* arch number of SMDK2410-Board */
- gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
+ gd->bd->bi_arch_number = MACH_TYPE_MINI2440;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
我这里将ARM核心的工作频率设置成400MHz,USB的时钟工作频率为48MHz。MACH_TYPE_MINI2440为u-boot中板子的机器码,一定要和linux中的机器码相对应。
2.时钟频率初始化部分
Index: timer.c
===================================================================
RCS file: /home/tracy/work/cvsroot/u-boot-2009.08/cpu/arm920t/s3c24x0/timer.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- timer.c 10 Mar 2012 13:18:21 -0000 1.1
+++ timer.c 30 Mar 2012 12:50:01 -0000 1.2
@@ -30,11 +30,11 @@
*/
#include <common.h>
-#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB)
+#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_TRAB)
#if defined(CONFIG_S3C2400)
#include <s3c2400.h>
-#elif defined(CONFIG_S3C2410)
+#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include <s3c2410.h>
#endif
@@ -177,6 +177,7 @@
tbclk = timer_load_val * 100;
#elif defined(CONFIG_SBC2410X) || \
defined(CONFIG_SMDK2410) || \
+ defined(CONFIG_MINI2440) || \
defined(CONFIG_VCMA9)
tbclk = CONFIG_SYS_HZ;
#else
@@ -215,4 +216,4 @@
/*NOTREACHED*/
}
-#endif /* defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) */
+#endif /* defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_TRAB) */
主要是添加S3C2440相关的宏定义。
3.读取时钟频率相关函数
还是时钟频率相关设定,前面只设置了ARM核心的时钟工作频率FCLK,S3C2440的HCLK、PCLK和S3C2410的分频是不一样的,所以需要对这部分进行修改,u-boot能不能启动起来,第一重要点就是看你时钟频率是否设置正确。
Index: speed.c
===================================================================
RCS file: /home/tracy/work/cvsroot/u-boot-2009.08/cpu/arm920t/s3c24x0/speed.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- speed.c 10 Mar 2012 13:18:21 -0000 1.1
+++ speed.c 30 Mar 2012 12:50:01 -0000 1.2
@@ -30,11 +30,11 @@
*/
#include <common.h>
-#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB)
+#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_TRAB)
#if defined(CONFIG_S3C2400)
#include <s3c2400.h>
-#elif defined(CONFIG_S3C2410)
+#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include <s3c2410.h>
#endif
@@ -67,7 +67,14 @@
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
+#ifdef CONFIG_S3C2440
+ if (pllreg == MPLL)
+ return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
+ else
+ return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
+#elif
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
+#endif
}
/* return FCLK frequency */
@@ -81,7 +88,19 @@
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
+#ifdef CONFIG_S3C2440
+ if ((clk_power->CLKDIVN & 0x6) == 0x2) {
+ return(get_FCLK()/2);
+ } else if ((clk_power->CLKDIVN & 0x6) == 0x4) {
+ return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
+ } else if ((clk_power->CLKDIVN & 0x6) == 0x6) {
4.S3C2440宏定义添加
Index: drivers/rtc/s3c24x0_rtc.c
===================================================================
RCS file: /home/tracy/work/cvsroot/u-boot-2009.08/drivers/rtc/s3c24x0_rtc.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 s3c24x0_rtc.c
--- drivers/rtc/s3c24x0_rtc.c 10 Mar 2012 13:18:21 -0000 1.1.1.1
+++ drivers/rtc/s3c24x0_rtc.c 29 Mar 2012 10:54:34 -0000
@@ -32,7 +32,7 @@
#if defined(CONFIG_S3C2400)
#include <s3c2400.h>
-#elif defined(CONFIG_S3C2410)
+#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include <s3c2410.h>
#endif
Index: drivers/serial/serial_s3c24x0.c
===================================================================
RCS file: /home/tracy/work/cvsroot/u-boot-2009.08/drivers/serial/serial_s3c24x0.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 serial_s3c24x0.c
--- drivers/serial/serial_s3c24x0.c 10 Mar 2012 13:18:21 -0000 1.1.1.1
+++ drivers/serial/serial_s3c24x0.c 29 Mar 2012 10:03:40 -0000
@@ -21,7 +21,7 @@
#include <common.h>
#if defined(CONFIG_S3C2400) || defined(CONFIG_TRAB)
#include <s3c2400.h>
-#elif defined(CONFIG_S3C2410)
+#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
#include <s3c2410.h>
#endif
Index: include/s3c24x0.h
===================================================================
RCS file: /home/tracy/work/cvsroot/u-boot-2009.08/include/s3c24x0.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 s3c24x0.h
--- include/s3c24x0.h 10 Mar 2012 13:18:21 -0000 1.1.1.1
+++ include/s3c24x0.h 29 Mar 2012 15:27:42 -0000
@@ -82,7 +82,7 @@
S3C24X0_REG32 PRIORITY;
S3C24X0_REG32 INTPND;
S3C24X0_REG32 INTOFFSET;
-#ifdef CONFIG_S3C2410
+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 SUBSRCPND;
S3C24X0_REG32 INTSUBMSK;
#endif
@@ -92,11 +92,11 @@
/* DMAS (see manual chapter 8) */
typedef struct {
S3C24X0_REG32 DISRC;
-#ifdef CONFIG_S3C2410
+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 DISRCC;
#endif
S3C24X0_REG32 DIDST;
-#ifdef CONFIG_S3C2410
+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 DIDSTC;
#endif
S3C24X0_REG32 DCON;
@@ -107,7 +107,7 @@
#ifdef CONFIG_S3C2400
S3C24X0_REG32 res[1];
#endif
-#ifdef CONFIG_S3C2410
+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 res[7];
#endif
} /*__attribute__((__packed__))*/ S3C24X0_DMA;
@@ -126,6 +126,9 @@
S3C24X0_REG32 CLKCON;
S3C24X0_REG32 CLKSLOW;
S3C24X0_REG32 CLKDIVN;
+#ifdef CONFIG_S3C2440
+ S3C24X0_REG32 CAMDIVN;
+#endif
} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
@@ -145,7 +148,7 @@
S3C24X0_REG32 res[8];
S3C24X0_REG32 DITHMODE;
S3C24X0_REG32 TPAL;
-#ifdef CONFIG_S3C2410
+#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
S3C24X0_REG32 LCDINTPND;
S3C24X0_REG32 LCDSRCPND;
S3C24X0_REG32 LCDINTMSK;
@@ -451,6 +454,56 @@
S3C24X0_REG32 GSTATUS3;
S3C24X0_REG32 GSTATUS4;
#endif
+#ifdef CONFIG_S3C2440
+ S3C24X0_REG32 GPACON;
+ S3C24X0_REG32 GPADAT;
+ S3C24X0_REG32 res1[2];
+ S3C24X0_REG32 GPBCON;
+ S3C24X0_REG32 GPBDAT;
+ S3C24X0_REG32 GPBUP;
+ S3C24X0_REG32 res2;
+ S3C24X0_REG32 GPCCON;
+ S3C24X0_REG32 GPCDAT;
+ S3C24X0_REG32 GPCUP;
+ S3C24X0_REG32 res3;
+ S3C24X0_REG32 GPDCON;
+ S3C24X0_REG32 GPDDAT;
+ S3C24X0_REG32 GPDUP;
+ S3C24X0_REG32 res4;
+ S3C24X0_REG32 GPECON;
+ S3C24X0_REG32 GPEDAT;
+ S3C24X0_REG32 GPEUP;
+ S3C24X0_REG32 res5;
+ S3C24X0_REG32 GPFCON;
+ S3C24X0_REG32 GPFDAT;
+ S3C24X0_REG32 GPFUP;
+ S3C24X0_REG32 res6;
+ S3C24X0_REG32 GPGCON;
+ S3C24X0_REG32 GPGDAT;
+ S3C24X0_REG32 GPGUP;
+ S3C24X0_REG32 res7;
+ S3C24X0_REG32 GPHCON;
+ S3C24X0_REG32 GPHDAT;
+ S3C24X0_REG32 GPHUP;
+ S3C24X0_REG32 res8;
+
+ S3C24X0_REG32 MISCCR;
+ S3C24X0_REG32 DCLKCON;
+ S3C24X0_REG32 EXTINT0;
+ S3C24X0_REG32 EXTINT1;
+ S3C24X0_REG32 EXTINT2;
+ S3C24X0_REG32 EINTFLT0;
+ S3C24X0_REG32 EINTFLT1;
+ S3C24X0_REG32 EINTFLT2;
+ S3C24X0_REG32 EINTFLT3;
+ S3C24X0_REG32 GSTATUS4;
+#endif
} /*__attribute__((__packed__))*/ S3C24X0_GPIO;
这部分修改主要是为了能够编译通过。所以这阶段移植主要有两点需要注意,一是时钟频率要设置正确。二是SDRAM相关数据要设置正确。只要这两点正确了,再加上添加能使u-boot编译通过的宏定义,u-boot启动起来是没有问题的。
5.将编译好的u-boot烧写到norflash中,u-boot成功启动。