详细解析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,所以RFCNT(2048+1101.25*7.8125)=1257。
第十二步:在/include/configs/目录下,先复制smdk2410.h,然后重新改名为MINI2440.h,然后修改MINI2440.h。改动之处1:修改宏定义,源代码如下:
36 #define CONFIG_ARM920T 1
37 #define CONFIG_S3C2410 1
38 #define CONFIG_SMDK2410 1
修改如下:
36 #define CONFIG_ARM920T 1
37#define CONFIG_S3C2440 1
38#define CONFIG_MINI2440 1
这是定义一些宏,这些宏我们通过上面的修改知道,这些宏都用到了。
改动之处2:修改在显示器的命令提示符,。源代码如下:
114 #define CFG_PROMPT "SMDK2410# "
修改后如下:
114 #define CFG_PROMPT "MINI2440 # "
至此所有初步移植完成了!!!以后还有网卡与flash的修改!