详细解析uboot移植(针对开发板mini2440)

详细解析uboot移植(针对开发板mini2440)

下面会对每一个步骤详细解答,包括为什么这样做?版本用的是u-boot-2008.10。(不知道为什么,新浪直接屏蔽掉所有以这种格式的注释,所以有些内容显示不出来,不过不影响阅读)

我们选择一般都是寻找最相近的进行移植,首先应该考虑选择MCU(微型控制芯片)一样的开发板,如果没有这类存在,就退而求其次,选择MPU(微型处理芯片,即IP核)一样的开发板。在uboot中没有支持S3C2440(MCU)的开发板,就考虑MPU,S3C2440是arm920t的IP核,所以选择相近的,锁定目标smdk2410开发板,它是以arm920t为核心,三星公司开发的一块开发板。选定目标之后就可以开始移植了。

第一步:移植一般从最顶层文件开始,最顶层当然是Makefile了,从它开始编译的。打开Makefile后找到下面这行字:(最左边的是行数,这个在同类版本中有一些出入,大家找到关键词就行了)

2625 smdk2400_config :   unconfig:

2626  @$(MKCONFIG)$(@:_config=) arm arm920t smdk2400  NULLs3c24x0

2627

2628 smdk2410_config :   unconfig

2629 @$(MKCONFIG) $(@:_config=) armarm920t smdk2410 NULL s3c24x0

2630

2631  SX1_config:    unconfig

2632  @$(MKCONFIG)$(@:_config=) arm arm925t sx1

这几行有什么用呢?定义开发板的名字和其他相关信息,以smdk2410为例,即:

arm:cpu架构;

arm920t:cpu的核;

smdk2410:开发板的名字;

NULL:开发者,这里没有,也可写上你想取的名字;

S3C24X0:片上系统(Soc);

现在我们就可以知道哪些可以修改,哪些不用修改了。

这里没有对我们想要移植的开发板的支持,所以应该加上,改成如下:(红色字为修改的):

2625 smdk2400_config :   unconfig:

2626  @$(MKCONFIG)$(@:_config=) arm arm920t smdk2400  NULLs3c24x0

2627

2628 smdk2410_config :   unconfig

2629 @$(MKCONFIG) $(@:_config=) armarm920t smdk2410 NULL s3c24x0

2630

2631MINI2440_config :   unconfig

2632@$(MKCONFIG) $(@:_config=) arm arm920t MINI2410 NULLs3c24x0

2633

2634  SX1_config:    unconfig

2635  @$(MKCONFIG)$(@:_config=) arm arm925t sx1

这里注意一点,如果你取名为MINI2440,那么以后涉及开发板的名字时(接下去的会讲到)就必须以这个名字,而且是必须是大写的,否则编译时会找不到相应的文件。

修改完顶层文件后就开始修改其他与顶层文件不在同一层的文件了,我们知道uboot中很多都不需要修改,不同的大部分在于cpu以及board这两个目录中,为什么呢?因为一个关于cpu架构,一个关于开发板类型的。比如smdk2410在board中就有自己的目录,所以新建的这个开发板就得在board中也有自己的目录,这个待会再讲。那么cpu呢?这里面有自己的各种核,比如arm920t,powerPC,x86等,接下去修改的便是arm920t这个目录,让这个IP核也支持它的产品S3C2440。

第二步:进入/cpu/arm920t/start.S,这是一个很重要的文件,我们根据链接脚本可以看出,程序执行都是从这个文件开始执行的。我们讲一下,当在编译前,我们不是一般都会执行这个命令:makesmdk2410_config,这意味着待会编译时就只会讲与smdk2410有关的文件链接一起,所以其他不相关的不会参与编译。那么这个start.S里面有哪些内容需要修改呢?我们查看文件不难发现,里面有对S3C2410的支持,那么S3C2410与S3C2440很类似,所以修改的地方就不多了,只是添加上一些宏定义而已,源代码如下:

136 #if defined(CONFIG_S3C2400) ||defined(CONFIG_S3C2410)

137   

138

138 # ifdefined(CONFIG_S3C2400)

140 #  definepWTCON       0x15300000

141 #  defineINTMSK    0x14400008 

142 #  defineCLKDIVN   0x14800014 

143 #else

144 #  definepWTCON       0x53000000

145 #  defineINTMSK    0x4A000008 

146 #  defineINTSUBMSK   0x4A00001C

147 #  defineCLKDIVN   0x4C000014 

148# endif

149

150   ldr    r0, =pWTCON

151   mov    r1, #0x0

152   str    r1, [r0]

153

154   

157   mov   r1,#0xffffffff

158   ldr r0, =INTMSK

159   str r1, [r0]

160 # ifdefined(CONFIG_S3C2410)

161   ldr r1, =0x3ff

162   ldr r0, =INTSUBMSK

163   str r1, [r0]

164 # endif

165

166   

167   

168   ldr r0, =CLKDIVN

169   mov   r1,#3

170   str r1, [r0]

171 #endif  

现在修改这些代码如下:

135

136 #ifdefined(CONFIG_S3C2400) ||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

137   

138

139 #if defined(CONFIG_S3C2400)

140 #  definepWTCON       0x15300000

141 #  defineINTMSK    0x14400008 

142 #  defineCLKDIVN   0x14800014 

143 #else

144 #  definepWTCON       0x53000000

145 #  defineINTMSK    0x4A000008 

146 #  defineINTSUBMSK   0x4A00001C

147 #  defineCLKDIVN   0x4C000014 

148 #endif

149

150#  defineCLK_CTL_BASE        0x4C000000

151#  defineMDIV_405      0x7f<<12

152#  definePSDIV_405         0x21

153#  defineUPLL_MDIV_48        0x38<<12

154#  defineUPLL_PSDIV_48       0x22

155#  defineMDIV_200      0xa1<<12

156#  definePSDIV_200     0x31  

157#endif

158

159   ldr    r0, =pWTCON

160   mov    r1, #0x0

161   str    r1, [r0]

162

163   

166   mov   r1,#0xffffffff

167   ldr r0, =INTMSK

168   str r1, [r0]

169 #if defined(CONFIG_S3C2410)

170   ldr r1, =0x3ff

171   ldr r0, =INTSUBMSK

172   str r1, [r0]

173 #endif

174

175 #ifdefined(CONFIG_S3C2440)

176   ldr    r1,=0x7fff

177   ldr    r0,=INTSUBMSK

178   str r1,[r0]

179#endif

180

181 #ifdefined(CONFIG_S3C2440)

182   

183

184   ldr   r0, =CLKDIVN

185  mov   r1,#5

186   strr1, [r0]

187   mrc  p15,0,r1,c1,c0,0

188   orr   r1,r1,#0xc0000000

189  mcr   p15,0,r1,c1,c0,0

190

191  

192   movr1,#CLK_CTL_BASE

193

194   mov r2,#UPLL_MDIV_48

195   add r2,r2,#UPLL_PSDIV_48

196   strr2,[r1,#0x08]

197

198   mov r2,#MDIV_405

199   add r2,r2,#PSDIV_405

200   str r2,[r1,#0x04]

201  #else

202

203   

204   ldr r0,=CLKDIVN

205   mov r1,#3

206   str r1,[r0]

207

    

208   mrc   p15,0,r1,c1,c0,0

209   orr    r1,r1,#0xc0000000

210   mcr        p15,0,r1,c1,c0,0

211

212   

213   mov r1,#CLK_CTL_BASE

214

215   mov r2,#MDIV_200

216   add r2,r2,#PSDIV_200

217   str r2,[r1,#0X04]

218   

219#endif

现在我们详细讲解为什么这么改?以便以后自己移植新的系统会修改!!

修改136行是因为让编译时支持S3C2440,这跟#if defined有关,关于这个关键词不会的话自行查找C语言的书。

我们可以略掉S3C2400的语句,144行定义watchdog的寄存器地址,由于S3C2440与S3C2410这一寄存器地址一样,所以无需修改的。关于这个寄存器见S3C2440手册462页。除了这个一样之外还有相同的是INTMSK、INTSUBMSK、CLKDIVN,分别在S3C2440手册的388、395、58页。

从150行定义的都是根据实际需要修改的。因为我们要求将S3C2440设置为主频405MHz。150行是定义寄存器基址,即从0x4c000000开始,MPLL寄存器是0x4c000004,UPLL寄存器是0x4c000008,所以有后面的“196 strr2,[r1,#0x08]与“200   str r2,[r1,#0x04] ,即将r2寄存器的值传给r1偏移8(或者4)后的地址的存储器。这是定义CLK_CTL_BASE的用意。那么r2里面存的是什么值呢?首先194行与195行的“mov r2,#UPLL_MDIV_48“”add r2,r2,#UPLL_PSDIV_48“,根据上面对UPLL_MDIV_48与

UPLL_PSDIV_48的定义,可以看出MDIV=64,为什么要那样定义呢?我们知道64是0x38,将其左移12位便是和UPLL寄存器定义的一样,那么UPLL_PSDIV_48则是PDIV和SDIV的组合,这样就构成了UPLL寄存器的值,然后我们计算一下,这里注意一点,UPLL与MPLL的计算公式不一样的(前提是2440,如果是2410那么两者是一样的)。UPLL=((MIDV+8)*Fin)/((PDIV+2)*2SDIV)=48MHz。所以要这样写。同理MPLL与此类似,只是公式有点不一样,MPLL=(2*(MIDV+8)*Fin)/((PDIV+2)*2SDIV)=405MHz。详细见S3C2440手册的235页第7部分“clock&powermanagement“。注意这里并没有出现这两个公式,具体是在/cpu/arm920t/s3c24x0/speed.c函数中出现,这会在后面修改。对于201行~217行的设置是对于没有定义S3C2440的例外情况,其方法与前面讲的类似,本可以不要的,这里加上方便以后移植。

再回过头来看175行,这里是为了设置INTSUBMSK寄存器,查看S3C2440手册395页可知,该寄存器15位可用且初始值都为1,所以赋值0x7fff。

接下去设置分频比,同样查看S3C2440手册246页的分频比设置,由表可知,1:4:8对应的HDIVN是2(占用CLKDIVN的[2:1]),PDIVN是1(占用CLKDIVN的[0]),所以是0x5。这就是对于这段修改的全部解析!!!!!!至于187行~189行的则是些约定俗成的语句,不解析了。

第三步:现在跳出start.S函数,进入/cpu/arm920t/s3c24x0/interrupts.c函数。这个函数是实现中断相关信息的。改动之处1:源代码如下:

33 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined (CONFIG_TRAB)

34

35 #include<arm920t.h>

36 #if defined(CONFIG_S3C2400)

37 #include<s3c2400.h>

38 #elifdefined(CONFIG_S3C2410)

39 #include<s3c2410.h>

40 #endif

修改后的:

33 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined (CONFIG_TRAB) ||defined (CONFIG_S3C2440)

34

35 #include<arm920t.h>

36 #if defined(CONFIG_S3C2400)

37 #include<s3c2400.h>

38 #elif defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

39 #include<s3c2410.h>

40 #endif

这些就不细说了,两个改动是为了包含arm920t.h和s3c2410.h这两个头文件。

改动之处2:源代码:

177 #if defined(CONFIG_SMDK2400) ||defined(CONFIG_TRAB)

178   tbclk = timer_load_val * 100;

179  #elifdefined(CONFIG_SBC2410X) || \

180    defined(CONFIG_SMDK2410) || \

181   defined(CONFIG_VCMA9)

182   tbclk = CFG_HZ;

183 #else

改动之后:

177 #if defined(CONFIG_SMDK2400) ||defined(CONFIG_TRAB)

178   tbclk = timer_load_val * 100;

179  #elifdefined(CONFIG_SBC2410X) || \

180    defined(CONFIG_SMDK2410) || \

181    defined(CONFIG_MINI2440)||  \

182    defined(CONFIG_VCMA9)

183   tbclk = CFG_HZ;

184 #else

第四步:修改/cpu/arm920t/s3c24x0/speed.c函数,改动之处1:源代码如下:

33 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined (CONFIG_TRAB)

34

35 #if defined(CONFIG_S3C2400)

36 #include<s3c2400.h>

37 #elifdefined(CONFIG_S3C2410)

38 #include<s3c2410.h>

39 #endif

修改之后如下:f

33 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)|| defined (CONFIG_TRAB)

34

35 #if defined(CONFIG_S3C2400)

36 #include<s3c2400.h>

37 #elifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

38 #include<s3c2410.h>

39 #endif

同样是添加定义支持2440,不解析了。

改动之处2:便是我们上次提到修改MPLL与UPLL公式的地方。源代码:

66     m =((r & 0xFF000) >> 12)+ 8;

67   p = ((r & 0x003F0) >>4) + 2;

68   s = r & 0x3;

69

70   return((CONFIG_SYS_CLK_FREQ * m) / (p<< s));

上面代码仅仅支持2410的,所以我们要添加上2440的计算方法,改动如下:

66  m = ((r& 0xFF000) >> 12) +8;

67   p = ((r & 0x003F0) >>4) + 2;

68   s = r & 0x3;

69 #if defined(CONFIG_S3C2440)

70     if(pllreg==MPLL)

71          return((CONFIG_SYS_CLK_FREQ*m*2)/(p<<s));

72     else if (pllreg==UPLL)

73#endif

74   return((CONFIG_SYS_CLK_FREQ * m) / (p<< s));

上面66行、67行、68行的r是指MPLLCON(UPLLCON),m、p、s是根据我们S3C2440手册的238页的计算公式得来的,接下去的71行便是MPLL的频率计算公式。你可能会问,那UPLL怎么没有公式呢?那是有的,在74行便定义了。因为它的计算与2410一样,就无需画蛇添足了!由此可见,uboot的代码也是相当简练的!

改动之处3:在get_HCLK(void)函数内修改HCLK的计算,源代码:

82 S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();

83

84   return((clk_power->CLKDIVN & 0x2) ?get_FCLK()/2 : get_FCLK());

这是仅仅针对2410的,所以我们要添加定义2440的,改动如下:

82 S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();

83

84 #ifdefined(CONFIG_S3C2440)

85if(clk_power->CLKDIVN&0x6)

86     {

87     if((clk_power->CLKDIVN&0x6)==2)

88          return(get_FCLK()/2);

89     if((clk_power->CLKDIVN&0x6)==6)

90          return((clk_power->CAMDIVN&0x100)?get_FCLK()/6:get_FCLK()/3);

 91      if((clk_power->CLKDIVN&0x6)==4)

92         return((clk_power->CAMDIVN&0x200)?get_FCLK()/8:get_FCLK()/4);

93return(get_FCLK());

94     }

95 elsereturn((clk_power->CLKDIVN&0x2)?get_FCLK()/2:get_FCLK());

96#endif

什么意思呢?就是如果定义了S3C2440的话,如果CLKDIVN的[2:1]不为0的话,那么进入判断语句中。首先如果CLKDIVN与0x6位与等于2的话,就可以知道HCLK=FCLK/2,接下去的分析都是遵循S3C2440手册242页的一个表,这里转换成编程语言,你会发现这转换的技巧很经典!!最后是如果CLKDIVN的[2:1]为0的话就执行另外一种情况。不难吧!

第五步:修改MINI2440的机器ID,这ID号必须与S3C2440提供的源码的ID号一致,这ID可以在源码的/include/asm-arm/math-types.h中找到,一般都是1999,源代码如下:

1859  #defineMACH_TYPE_GENEVA              1873

1860

1861  #ifdefCONFIG_ARCH_EBSA110

添加后如下:

1859  #defineMACH_TYPE_GENEVA              1873

1860  #defineMACH_TYPE_MINI2440      1999

1861                     

1862  #ifdefCONFIG_ARCH_EBSA110

第六步:修改串口,让其支持2440,源代码如下:

22  #ifdefined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined(CONFIG_TRAB)

23

24  #ifdefined(CONFIG_S3C2400) || defined(CONFIG_TRAB)

25  #include<s3c2400.h>

26  #elifdefined(CONFIG_S3C2410)

27  #include<s3c2410.h>

28  #endif

修改宏定义,支持2440,如下:

22  #ifdefined(CONFIG_S3C2400) || defined (CONFIG_S3C2410)||defined(CONFIG_S3C2440)|| defined (CONFIG_TRAB)

23

24  #ifdefined(CONFIG_S3C2400) || defined(CONFIG_TRAB)

25  #include<s3c2400.h>

26  #elifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

27  #include<s3c2410.h>

28  #endif

第七步:驱动里的实时时钟代码,以支持S3C2440。源代码如下:

33  #ifdefined(CONFIG_S3C2400)

34  #include<s3c2400.h>

35  #elifdefined(CONFIG_S3C2410)

36  #include<s3c2410.h>

37  #endif

修改如下:

33  #ifdefined(CONFIG_S3C2400)

34  #include<s3c2400.h>

35  #elifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

36  #include<s3c2410.h>

37  #endif

第八步:修改/include/s3c24x0.h,其中有关s3c24x0的寄存器信息以及各个单元的寄存器,比如中断管理单元、时钟管理单元等。改动之处1,让中断支持2440,源代码如下:

85  #ifdefCONFIG_S3C2410

86 S3C24X0_REG32    SUBSRCPND;

87 S3C24X0_REG32    INTSUBMSK;

修改如下:

85  #ifdefCONFIG_S3C2410||defined(CONFIG_S3C2440)

86 S3C24X0_REG32    SUBSRCPND;

87 S3C24X0_REG32    INTSUBMSK;

改动之处2,让DMA方式支持2440源代码如下:

95  #ifdefCONFIG_S3C2410

    S3C24X0_REG32    DISRCC;

#endif

    S3C24X0_REG32    DIDST;

99 #ifdef CONFIG_S3C2410,

    S3C24X0_REG32    DIDSTC;

#endif

    S3C24X0_REG32    DCON;

    S3C24X0_REG32    DSTAT;

    S3C24X0_REG32    DCSRC;

    S3C24X0_REG32    DCDST;

    S3C24X0_REG32    DMASKTRIG;

#ifdef CONFIG_S3C2400

    S3C24X0_REG32    res[1];

#endif

110  #ifdefCONFIG_S3C2410

    S3C24X0_REG32    res[7];

#endif

修改如下:

95 #ifdef CONFIG_S3C2410||defined(CONFIG_S3C2440)

    S3C24X0_REG32    DISRCC;

#endif

    S3C24X0_REG32    DIDST;

99#ifdef CONFIG_S3C2410||defined(CONFIG_S3C2440)

    S3C24X0_REG32    DIDSTC;

#endif

    S3C24X0_REG32    DCON;

    S3C24X0_REG32    DSTAT;

    S3C24X0_REG32    DCSRC;

    S3C24X0_REG32    DCDST;

    S3C24X0_REG32    DMASKTRIG;

#ifdef CONFIG_S3C2400

    S3C24X0_REG32    res[1];

#endif

110  #ifdefCONFIG_S3C2410||defined(CONFIG_S3C2440)

    S3C24X0_REG32    res[7];

#endif

改动之处3:在时钟与电源管理单元中添加2440独有的CAMDIVN寄存器,源代码如下:

126   S3C24X0_REG32    CLKCON;

127   S3C24X0_REG32    CLKSLOW;

128   S3C24X0_REG32    CLKDIVN;

修改后如下:

126   S3C24X0_REG32    CLKCON;

127   S3C24X0_REG32    CLKSLOW;

128   S3C24X0_REG32    CLKDIVN;

129   #ifdefined(CONFIG_S3C2440)

130   S3C24X0_REG32 CAMDIVN;

131   #endif

改动之处4:修改LCD单元模块,增加对2440的支持,源代码如下:

151  #ifdefCONFIG_S3C2410

152   S3C24X0_REG32    LCDINTPND;

153   S3C24X0_REG32    LCDSRCPND;

154   S3C24X0_REG32    LCDINTMSK;

155   S3C24X0_REG32    LPCSEL;

改动之后如下:

151  #ifdefCONFIG_S3C2410||defined(CONFIG_S3C2440)

152   S3C24X0_REG32    LCDINTPND;

153   S3C24X0_REG32    LCDSRCPND;

154   S3C24X0_REG32    LCDINTMSK;

155   S3C24X0_REG32    LPCSEL;

改动之处5:修改I/O口单元,以支持2440,这些都是和2410一样的,所以我们改动时都仅仅添加宏定义就行了。源代码如下:

407   #if defined(CONFIG_S3C2410)

408   S3C24X0_REG32    GPACON;

409   S3C24X0_REG32    GPADAT;

410   S3C24X0_REG32    res1[2];

411   S3C24X0_REG32    GPBCON;

修改后如下:

407   #if defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

408   S3C24X0_REG32    GPACON;

409   S3C24X0_REG32    GPADAT;

410   S3C24X0_REG32    res1[2];

411   S3C24X0_REG32    GPBCON;

第九步:在board目录中新建一个目录,取名为你的开发板名称:MINI2440,记住这得和你刚开始取的名字一样,也就是说MINI2440得贯彻到底。然后拷贝smdk2410里面的文件进这个新文件。进入MINI2440目录后修改其中名为smdk2410.c的文件名为MINI2440.c(为了免除不必要的麻烦,文件名也取成和开发板名字一样的,即大写字母)。然后修改Makefile,源代码如下:

COBJS := smdk2410.o flash.o

SOBJS := lowlevel_init.o

改成:

COBJS:= MINI2440.o flash.o

SOBJS := lowlevel_init.o

第十步:进入/board/MINI2440/MINI2440.c,修改MINI2440目录下的MINI2440.c,修改里面的PLL配置,源代码如下:

39  #elifFCLK_SPEED==1        

40  #defineM_MDIV  0xA1

41  #defineM_PDIV  0x3

42  #defineM_SDIV  0x1

43  #endif

44  #define USB_CLOCK1

改为:

39  #elifFCLK_SPEED==1        

40 #if defined(CONFIG_S3C2410)

41 #define M_MDIV  0xA1

42 #define M_PDIV  0x3

43 #define M_SDIV  0x1

44 #endif

45 #if defined(CONFIG_S3C2440)

46 #define M_MDIV  0x7f

47 #define M_PDIV  0x2

48 #define M_SDIV  0x1

49 #endif

上面的修改是和在/cpu/arm920t/start.S中队时钟的设置一样的,详细见上面的。

改动之处2:修改UPLL的配置,同样这和/cpu/arm920t/start.S中UPLL的设置也是一样的。源代码如下:

47 #if USB_CLOCK==0

48 #define U_M_MDIV 0xA1

49 #define U_M_PDIV 0x3

50 #define U_M_SDIV 0x1

51 #elif USB_CLOCK==1

52 #define U_M_MDIV 0x48

53 #define U_M_PDIV 0x3

54 #define U_M_SDIV 0x2

55 #endif

修改后如下:

47 #elif USB_CLOCK==1

48 #ifdefined(CONFIG_S3C2410)

49#define U_M_MDIV 0x48

50#define U_M_PDIV 0x3

51#endif

52 #ifdefined(CONFIG_S3C2440)

53#define U_M_MDIV 0x38

54#define U_M_PDIV 0x2

55

56#endif

57#define U_M_SDIV 0x2

58#endif

改动之处3:为了引导内核,我们需要修改board_init中开发板的类型,源代码如下:

121   

    gd->bd->bi_arch_number =MACH_TYPE_SMDK2440;

改成如下:

 

    gd->bd->bi_arch_number =MACH_TYPE_MINI2440;

第十一步:进入/board/MINI2440/lowlevel_init.S,修改刷新周期,源代码如下:

120   

121   #define REFEN          0x1    

122   #define TREFMD            0x0    

123   #define Trp          0x0    

124   #define Trc           0x3    

125   #define Tchr         0x2    

126   #define REFCNT             1113  

修改后如下:

120   

121   #define REFEN          0x1    

122   #define TREFMD            0x0    

123   #define Trp          0x2    

124   #define Trc           0x3    

125   #define Tchr         0x2    

126   #define REFCNT             1012  

现在讲一下刷新周期。在S3C2440手册的210页有关于这个的介绍,从121行到125行的设置见手册,详细讲一下最后一个宏定义REFCNT,查看SDRAM手册的第1页,有一句话“8192 refresh cycles / 64ms“,可见刷新周期为64ms/8192=7.8125us。HCLK=101.25MHz,所以RFCNT2048+1101.25*7.8125=1257。

第十二步:在/include/configs/目录下,先复制smdk2410.h,然后重新改名为MINI2440.h,然后修改MINI2440.h。改动之处1:修改宏定义,源代码如下:

36 #define CONFIG_ARM920T         

37 #define  CONFIG_S3C2410        

38 #define CONFIG_SMDK2410       

修改如下:

36 #define CONFIG_ARM920T         

37#define  CONFIG_S3C2440        

38#define  CONFIG_MINI2440         

这是定义一些宏,这些宏我们通过上面的修改知道,这些宏都用到了。

改动之处2:修改在显示器的命令提示符,。源代码如下:

114   #define  CFG_PROMPT    "SMDK2410# "

修改后如下:

114   #define  CFG_PROMPT        "MINI2440 # "  

至此所有初步移植完成了!!!以后还有网卡与flash的修改!


你可能感兴趣的:(详细解析uboot移植(针对开发板mini2440))