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

本文详细介绍了如何将u-boot移植到MINI2440开发板的过程,主要涉及Makefile、start.S、interrupts.c、speed.c等文件的修改,以及CPU和开发板特定配置的适配。通过添加对S3C2440的支持,调整了寄存器定义、中断处理、时钟配置等方面,确保uboot能够正确运行在MINI2440上。
摘要由CSDN通过智能技术生成

详细解析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# 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值